]> code.delx.au - gnu-emacs/blobdiff - nt/addpm.c
Rework C source files to avoid ^(
[gnu-emacs] / nt / addpm.c
index 361726b10e8674500ecb14bbbbd90aa1e0033241..2161ea786bd807302b65325cc8f334e628fec8f0 100644 (file)
@@ -1,12 +1,12 @@
 /* Add entries to the GNU Emacs Program Manager folder.
-   Copyright (C) 1995, 2001-201 Free Software Foundation, Inc.
+   Copyright (C) 1995, 2001-2016 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
 GNU Emacs is free software: you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
+the Free Software Foundation, either version 3 of the License, or (at
+your option) any later version.
 
 GNU Emacs is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -34,16 +34,24 @@ along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.  */
    installed, then the DDE fallback for creating icons the Windows 3.1
    progman way will be used instead, but that is prone to lockups
    caused by other applications not servicing their message queues.  */
+#include <stdlib.h>
+#include <stdio.h>
+#include <malloc.h>
+
+/* MinGW64 barfs if _WIN32_IE is defined to anything below 0x500.  */
+#ifndef MINGW_W64
 #define _WIN32_IE 0x400
+#endif
 /* Request C Object macros for COM interfaces.  */
 #define COBJMACROS 1
 
 #include <windows.h>
 #include <shlobj.h>
 #include <ddeml.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <malloc.h>
+
+#ifndef OLD_PATHS
+#include "../src/epaths.h"
+#endif
 
 HDDEDATA CALLBACK
 DdeCallback (UINT uType, UINT uFmt, HCONV hconv,
@@ -54,15 +62,12 @@ DdeCallback (UINT uType, UINT uFmt, HCONV hconv,
 }
 
 #define DdeCommand(str)        \
-       DdeClientTransaction (str, strlen (str)+1, conversation, (HSZ)NULL, \
+       DdeClientTransaction ((LPBYTE)str, strlen (str)+1, conversation, (HSZ)NULL, \
                              CF_TEXT, XTYP_EXECUTE, 30000, NULL)
 
 #define REG_ROOT "SOFTWARE\\GNU\\Emacs"
-#define REG_GTK "SOFTWARE\\GTK\\2.0"
 #define REG_APP_PATH \
   "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\emacs.exe"
-#define REG_RUNEMACS_PATH \
-  "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\runemacs.exe"
 
 static struct entry
 {
@@ -71,8 +76,9 @@ static struct entry
 }
 env_vars[] =
 {
+#ifdef OLD_PATHS
   {"emacs_dir", NULL},
-  {"EMACSLOADPATH", "%emacs_dir%/site-lisp;%emacs_dir%/../site-lisp;%emacs_dir%/lisp;%emacs_dir%/leim"},
+  {"EMACSLOADPATH", "%emacs_dir%/site-lisp;%emacs_dir%/../site-lisp;%emacs_dir%/lisp"},
   {"SHELL", "%emacs_dir%/bin/cmdproxy.exe"},
   {"EMACSDATA", "%emacs_dir%/etc"},
   {"EMACSPATH", "%emacs_dir%/bin"},
@@ -81,15 +87,25 @@ env_vars[] =
   /*  {"INFOPATH", "%emacs_dir%/info"},  */
   {"EMACSDOC", "%emacs_dir%/etc"},
   {"TERM", "cmd"}
+#else  /* !OLD_PATHS */
+  {"emacs_dir", NULL},
+  {"EMACSLOADPATH", PATH_SITELOADSEARCH ";" PATH_LOADSEARCH},
+  {"SHELL", PATH_EXEC "/cmdproxy.exe"},
+  {"EMACSDATA", PATH_DATA},
+  {"EMACSPATH", PATH_EXEC},
+  /* We no longer set INFOPATH because Info-default-directory-list
+     is then ignored.  */
+  /*  {"INFOPATH", "%emacs_dir%/info"},  */
+  {"EMACSDOC", PATH_DOC},
+  {"TERM", "cmd"}
+#endif
 };
 
-BOOL
+void
 add_registry (const char *path)
 {
   HKEY hrootkey = NULL;
   int i;
-  BOOL ok = TRUE;
-  DWORD size;
 
   /* Record the location of Emacs to the App Paths key if we have
      sufficient permissions to do so.  This helps Windows find emacs quickly
@@ -100,60 +116,18 @@ add_registry (const char *path)
      affect the general operation of other installations of Emacs, and we
      are blindly overwriting the Start Menu entries already.
   */
-  if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, REG_APP_PATH, 0, "",
+  if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, REG_APP_PATH, 0, NULL,
                       REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL,
                       &hrootkey, NULL) == ERROR_SUCCESS)
     {
       int len;
       char *emacs_path;
-      HKEY gtk_key = NULL;
 
       len = strlen (path) + 15; /* \bin\emacs.exe + terminator.  */
       emacs_path = (char *) alloca (len);
       sprintf (emacs_path, "%s\\bin\\emacs.exe", path);
 
       RegSetValueEx (hrootkey, NULL, 0, REG_EXPAND_SZ, emacs_path, len);
-
-      /* Look for a GTK installation. If found, add it to the library search
-         path for Emacs so that the image libraries it provides are available
-         to Emacs regardless of whether it is in the path or not.  */
-      if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, REG_GTK, REG_OPTION_NON_VOLATILE,
-                        KEY_READ, &gtk_key) == ERROR_SUCCESS)
-        {
-          if (RegQueryValueEx (gtk_key, "DllPath", NULL, NULL,
-                               NULL, &size) == ERROR_SUCCESS)
-            {
-              char *gtk_path = (char *) alloca (size);
-              if (RegQueryValueEx (gtk_key, "DllPath", NULL, NULL,
-                                   gtk_path, &size) == ERROR_SUCCESS)
-                {
-                  /* Make sure the emacs bin directory continues to be searched
-                     first by including it as well.  */
-                  char *dll_paths;
-                 HKEY runemacs_key = NULL;
-                  len = strlen (path) + 5 + size;
-                  dll_paths = (char *) alloca (size + strlen (path) + 1);
-                  sprintf (dll_paths, "%s\\bin;%s", path, gtk_path);
-                  RegSetValueEx (hrootkey, "Path", 0, REG_EXPAND_SZ,
-                                dll_paths, len);
-
-                 /* Set the same path for runemacs.exe, as the Explorer shell
-                    looks this up, so the above does not take effect when
-                    emacs.exe is spawned from runemacs.exe.  */
-                 if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, REG_RUNEMACS_PATH,
-                                     0, "", REG_OPTION_NON_VOLATILE,
-                                     KEY_WRITE, NULL, &runemacs_key, NULL)
-                     == ERROR_SUCCESS)
-                   {
-                     RegSetValueEx (runemacs_key, "Path", 0, REG_EXPAND_SZ,
-                                    dll_paths, len);
-
-                     RegCloseKey (runemacs_key);
-                   }
-                }
-            }
-          RegCloseKey (gtk_key);
-        }
       RegCloseKey (hrootkey);
     }
 
@@ -165,29 +139,24 @@ add_registry (const char *path)
   /* Check both the current user and the local machine to see if we
      have any resources.  */
 
-  if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, REG_ROOT,
-                     REG_OPTION_NON_VOLATILE,
-                     KEY_WRITE, &hrootkey) != ERROR_SUCCESS
-      && RegOpenKeyEx (HKEY_CURRENT_USER, REG_ROOT,
-                        REG_OPTION_NON_VOLATILE,
-                        KEY_WRITE, &hrootkey) != ERROR_SUCCESS)
-    {
-      return FALSE;
-    }
+  if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, REG_ROOT, 0,
+                   KEY_WRITE | KEY_QUERY_VALUE, &hrootkey) != ERROR_SUCCESS
+      && RegOpenKeyEx (HKEY_CURRENT_USER, REG_ROOT, 0,
+                      KEY_WRITE | KEY_QUERY_VALUE, &hrootkey) != ERROR_SUCCESS)
+    return;
 
   for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++)
     {
       const char * value = env_vars[i].value ? env_vars[i].value : path;
 
-      if (RegSetValueEx (hrootkey, env_vars[i].name,
-                        0, REG_EXPAND_SZ,
-                        value, lstrlen (value) + 1) != ERROR_SUCCESS)
-       ok = FALSE;
+      /* Replace only those settings that already exist.  */
+      if (RegQueryValueEx (hrootkey, env_vars[i].name, NULL,
+                          NULL, NULL, NULL) == ERROR_SUCCESS)
+       RegSetValueEx (hrootkey, env_vars[i].name, 0, REG_EXPAND_SZ,
+                      value, lstrlen (value) + 1);
     }
 
   RegCloseKey (hrootkey);
-
-  return (ok);
 }
 
 int