X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/2cc1905e48e720518e7c094107b8875856459467..c9b965bde88f1003e68060b3267ddf502a1500d0:/nt/addpm.c diff --git a/nt/addpm.c b/nt/addpm.c index 44e1fe8aca..32b4bd6b53 100644 --- a/nt/addpm.c +++ b/nt/addpm.c @@ -1,22 +1,23 @@ /* Add entries to the GNU Emacs Program Manager folder. - Copyright (C) 1995 Free Software Foundation, Inc. + Copyright (C) 1995, 2001, 2002, 2003, 2004, 2005, + 2006, 2007 Free Software Foundation, Inc. - This file is part of GNU Emacs. +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 2, or (at your option) any later - version. +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 2, 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 MERCHANTABILITY or - FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - more details. +GNU Emacs is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. - You should have received a copy of the GNU General Public License along - with GNU Emacs; see the file COPYING. If not, write to the Free Software - Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. -*/ +You should have received a copy of the GNU General Public License +along with GNU Emacs; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ /**************************************************************************** * @@ -32,7 +33,7 @@ #include #include -HDDEDATA CALLBACK +HDDEDATA CALLBACK DdeCallback (UINT uType, UINT uFmt, HCONV hconv, HSZ hsz1, HSZ hsz2, HDDEDATA hdata, DWORD dwData1, DWORD dwData2) @@ -44,93 +45,160 @@ DdeCallback (UINT uType, UINT uFmt, HCONV hconv, DdeClientTransaction (str, strlen (str)+1, HConversation, (HSZ)NULL, \ CF_TEXT, XTYP_EXECUTE, 30000, NULL) -#define REG_ROOT "SOFTWARE\\GNU\\Emacs\\" +#define REG_ROOT "SOFTWARE\\GNU\\Emacs" static struct entry { char *name; char *value; -} -env_vars[] = +} +env_vars[] = { - {"emacs_path", NULL}, - {"EMACSLOADPATH", "%emacs_path%\\lisp"}, - {"SHELL", "cmd"}, - {"EMACSDATA", "%emacs_path%\\etc"}, - {"EMACSPATH", "%emacs_path%\\bin"}, - {"EMACSLOCKDIR", "%emacs_path%\\lock"}, - {"INFOPATH", "%emacs_path%\\info"}, - {"EMACSDOC", "%emacs_path%\\etc"}, + {"emacs_dir", NULL}, + {"EMACSLOADPATH", "%emacs_dir%/site-lisp;%emacs_dir%/../site-lisp;%emacs_dir%/lisp;%emacs_dir%/leim"}, + {"SHELL", "%emacs_dir%/bin/cmdproxy.exe"}, + {"EMACSDATA", "%emacs_dir%/etc"}, + {"EMACSPATH", "%emacs_dir%/bin"}, + /* We no longer set INFOPATH because Info-default-directory-list + is then ignored. */ + /* {"INFOPATH", "%emacs_dir%/info"}, */ + {"EMACSDOC", "%emacs_dir%/etc"}, {"TERM", "cmd"} }; -BOOL +BOOL add_registry (path) char *path; { HKEY hrootkey = NULL; - DWORD dwDisp; int i; BOOL ok = TRUE; - - /* Check both the current user and the local machine to see if we + + /* Previous versions relied on registry settings, but we do not need + them any more. If registry settings are installed from a previous + version, replace them to ensure they are the current settings. + Otherwise, do nothing. */ + + /* Check both the current user and the local machine to see if we have any resources. */ - - if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, REG_ROOT, - 0, "", REG_OPTION_NON_VOLATILE, - KEY_WRITE, NULL, &hrootkey, &dwDisp) != ERROR_SUCCESS - && RegCreateKeyEx (HKEY_CURRENT_USER, REG_ROOT, - 0, "", REG_OPTION_NON_VOLATILE, - KEY_WRITE, NULL, &hrootkey, &dwDisp) != ERROR_SUCCESS) + + 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; } - - for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++) + + for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++) { 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; - } - + } + RegCloseKey (hrootkey); - + return (ok); } int main (argc, argv) int argc; - char *argv[]; + char *argv[]; { - DWORD idDde; + DWORD idDde = 0; HCONV HConversation; HSZ ProgMan; + char modname[MAX_PATH]; char additem[MAX_PATH*2 + 100]; - char *lpext; + char *prog_name; + char *emacs_path; + char *p; + int quiet = 0; + /* If no args specified, use our location to set emacs_path. */ +#if 0 if (argc < 2 || argc > 3) { - fprintf (stderr, "usage: addpm emacs_path [icon_path]\n"); + fprintf (stderr, "usage: addpm [-q] [emacs_path [icon_path]]\n"); exit (1); } +#endif + + if (argc > 1 + && (argv[1][0] == '/' || argv[1][0] == '-') + && argv[1][1] == 'q') + { + quiet = 1; + --argc; + ++argv; + } - lpext = add_registry (argv[1]) ? "exe" : "bat"; + if (argc > 1) + emacs_path = argv[1]; + else + { + if (!GetModuleFileName (NULL, modname, MAX_PATH) || + (p = strrchr (modname, '\\')) == NULL) + { + fprintf (stderr, "fatal error"); + exit (1); + } + *p = 0; + + /* Set emacs_path to emacs_dir if we are in "%emacs_dir%\bin". */ + if ((p = strrchr (modname, '\\')) && stricmp (p, "\\bin") == 0) + { + *p = 0; + emacs_path = modname; + } + else + { + fprintf (stderr, "usage: addpm emacs_path [icon_path]\n"); + exit (1); + } + + /* Tell user what we are going to do. */ + if (!quiet) + { + int result; + + char msg[ MAX_PATH ]; + sprintf (msg, "Install Emacs at %s?\n", emacs_path); + result = MessageBox (NULL, msg, "Install Emacs", + MB_OKCANCEL | MB_ICONQUESTION); + if (result != IDOK) + { + fprintf (stderr, "Install cancelled\n"); + exit (1); + } + } + } + + add_registry (emacs_path); + prog_name = "runemacs.exe"; DdeInitialize (&idDde, (PFNCALLBACK)DdeCallback, APPCMD_CLIENTONLY, 0); ProgMan = DdeCreateStringHandle (idDde, "PROGMAN", CP_WINANSI); - if (HConversation = DdeConnect (idDde, ProgMan, ProgMan, NULL)) + HConversation = DdeConnect (idDde, ProgMan, ProgMan, NULL); + if (HConversation != 0) { - DdeCommand ("[CreateGroup (Gnu Emacs)]"); + DdeCommand ("[CreateGroup (\"Gnu Emacs\")]"); DdeCommand ("[ReplaceItem (Emacs)]"); - sprintf (additem, "[AddItem (%s\\bin\\emacs.%s, Emacs%c%s)]", - argv[1], lpext, (argc>2 ? ',' : ' '), - (argc>2 ? argv[2] : "")); + if (argc > 2) + sprintf (additem, "[AddItem (\"%s\\bin\\%s\", Emacs, \"%s\")]", + emacs_path, prog_name, argv[2]); + else + sprintf (additem, "[AddItem (\"%s\\bin\\%s\", Emacs)]", + emacs_path, prog_name); DdeCommand (additem); DdeDisconnect (HConversation); @@ -142,3 +210,6 @@ main (argc, argv) return (0); } + +/* arch-tag: f923609d-b781-4ef4-abce-ca0da29cbbf0 + (do not change this comment) */