Update MS-Windows installation instructions for librsvg.
[bpt/emacs.git] / nt / addpm.c
index 4daa0b9..6669109 100644 (file)
@@ -1,6 +1,5 @@
 /* Add entries to the GNU Emacs Program Manager folder.
-   Copyright (C) 1995, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-     2008, 2009, 2010, 2011, 2012  Free Software Foundation, Inc.
+   Copyright (C) 1995, 2001-2013 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -35,16 +34,25 @@ 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 defines _W64 and barfs if _WIN32_IE is defined to anything
+   below 0x500.  */
+#ifndef _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,
@@ -62,16 +70,19 @@ DdeCallback (UINT uType, UINT uFmt, HCONV hconv,
 #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
 {
-  char *name;
-  char *value;
+  const char *name;
+  const char *value;
 }
 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"},
@@ -80,11 +91,22 @@ 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
-add_registry (path)
-     char *path;
+add_registry (const char *path)
 {
   HKEY hrootkey = NULL;
   int i;
@@ -112,7 +134,7 @@ add_registry (path)
       emacs_path = (char *) alloca (len);
       sprintf (emacs_path, "%s\\bin\\emacs.exe", path);
 
-      RegSetValueEx (hrootkey, NULL, 0, REG_SZ, emacs_path, len);
+      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
@@ -130,10 +152,26 @@ add_registry (path)
                   /* 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_SZ, dll_paths, len);
+                  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);
@@ -161,7 +199,7 @@ add_registry (path)
 
   for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++)
     {
-      char * value = env_vars[i].value ? env_vars[i].value : path;
+      const char * value = env_vars[i].value ? env_vars[i].value : path;
 
       if (RegSetValueEx (hrootkey, env_vars[i].name,
                         0, REG_EXPAND_SZ,
@@ -175,16 +213,14 @@ add_registry (path)
 }
 
 int
-main (argc, argv)
-     int argc;
-     char *argv[];
+main (int argc, char *argv[])
 {
   char start_folder[MAX_PATH + 1];
   int shortcuts_created = 0;
   int com_available = 1;
   char modname[MAX_PATH];
-  char *prog_name;
-  char *emacs_path;
+  const char *prog_name;
+  const char *emacs_path;
   char *p;
   int quiet = 0;
   HRESULT result;
@@ -236,7 +272,7 @@ main (argc, argv)
                               MB_OKCANCEL | MB_ICONQUESTION);
          if (result != IDOK)
            {
-             fprintf (stderr, "Install cancelled\n");
+             fprintf (stderr, "Install canceled\n");
              exit (1);
            }
        }
@@ -260,8 +296,6 @@ main (argc, argv)
     {
       if (strlen (start_folder) < (MAX_PATH - 20))
        {
-         BOOL retval;
-
          strcat (start_folder, "\\Gnu Emacs");
          if (CreateDirectory (start_folder, NULL)
              || GetLastError () == ERROR_ALREADY_EXISTS)
@@ -293,8 +327,6 @@ main (argc, argv)
       /* Ensure there is enough room for "...\GNU Emacs\Emacs.lnk".  */
       if (strlen (start_folder) < (MAX_PATH - 20))
        {
-         BOOL retval;
-
          strcat (start_folder, "\\Gnu Emacs");
          if (CreateDirectory (start_folder, NULL)
              || GetLastError () == ERROR_ALREADY_EXISTS)
@@ -315,10 +347,10 @@ main (argc, argv)
                  if (SUCCEEDED (IPersistFile_Save (lnk, unicode_path, TRUE)))
                    shortcuts_created = 1;
                  IPersistFile_Release (lnk);
-                 
+
                }
            }
-       }      
+       }
     }
 
   if (com_available)
@@ -355,6 +387,3 @@ main (argc, argv)
 
   return 0;
 }
-
-/* arch-tag: f923609d-b781-4ef4-abce-ca0da29cbbf0
-   (do not change this comment) */