Commit | Line | Data |
---|---|---|
cef9e134 GV |
1 | /* Add entries to the GNU Emacs Program Manager folder. |
2 | Copyright (C) 1995 Free Software Foundation, Inc. | |
3 | ||
bf2b146b EN |
4 | This file is part of GNU Emacs. |
5 | ||
6 | GNU Emacs is free software; you can redistribute it and/or modify | |
7 | it under the terms of the GNU General Public License as published by | |
8 | the Free Software Foundation; either version 2, or (at your option) | |
9 | any later version. | |
10 | ||
11 | GNU Emacs is distributed in the hope that it will be useful, | |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
17 | along with GNU Emacs; see the file COPYING. If not, write to | |
18 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 | Boston, MA 02111-1307, USA. */ | |
cef9e134 | 20 | |
cef9e134 | 21 | /**************************************************************************** |
6fbcbee7 RS |
22 | * |
23 | * Program: addpm (adds emacs to the Windows program manager) | |
24 | * | |
25 | * Usage: | |
2cc1905e | 26 | * argv[1] = install path for emacs |
6fbcbee7 RS |
27 | * argv[2] = full path to icon for emacs (optional) |
28 | */ | |
cef9e134 | 29 | |
6fbcbee7 RS |
30 | #include <windows.h> |
31 | #include <ddeml.h> | |
32 | #include <stdlib.h> | |
33 | #include <stdio.h> | |
cef9e134 | 34 | |
2cc1905e GV |
35 | HDDEDATA CALLBACK |
36 | DdeCallback (UINT uType, UINT uFmt, HCONV hconv, | |
37 | HSZ hsz1, HSZ hsz2, HDDEDATA hdata, | |
38 | DWORD dwData1, DWORD dwData2) | |
6fbcbee7 | 39 | { |
2cc1905e | 40 | return ((HDDEDATA) NULL); |
6fbcbee7 | 41 | } |
cef9e134 | 42 | |
6fbcbee7 | 43 | #define DdeCommand(str) \ |
2cc1905e | 44 | DdeClientTransaction (str, strlen (str)+1, HConversation, (HSZ)NULL, \ |
6fbcbee7 | 45 | CF_TEXT, XTYP_EXECUTE, 30000, NULL) |
cef9e134 | 46 | |
c6e63684 | 47 | #define REG_ROOT "SOFTWARE\\GNU\\Emacs" |
2cc1905e GV |
48 | |
49 | static struct entry | |
50 | { | |
51 | char *name; | |
52 | char *value; | |
53 | } | |
54 | env_vars[] = | |
55 | { | |
c6e63684 | 56 | {"emacs_dir", NULL}, |
9296c0e8 | 57 | {"EMACSLOADPATH", "%emacs_dir%/site-lisp;%emacs_dir%/lisp"}, |
0655d4d4 | 58 | {"SHELL", "%emacs_dir%/bin/cmdproxy.exe"}, |
26b430b7 RS |
59 | {"EMACSDATA", "%emacs_dir%/etc"}, |
60 | {"EMACSPATH", "%emacs_dir%/bin"}, | |
61 | {"EMACSLOCKDIR", "%emacs_dir%/lock"}, | |
9296c0e8 GV |
62 | /* We no longer set INFOPATH because Info-default-directory-list |
63 | is then ignored. */ | |
64 | /* {"INFOPATH", "%emacs_dir%/info"}, */ | |
26b430b7 | 65 | {"EMACSDOC", "%emacs_dir%/etc"}, |
2cc1905e GV |
66 | {"TERM", "cmd"} |
67 | }; | |
68 | ||
69 | BOOL | |
70 | add_registry (path) | |
71 | char *path; | |
72 | { | |
73 | HKEY hrootkey = NULL; | |
74 | DWORD dwDisp; | |
75 | int i; | |
76 | BOOL ok = TRUE; | |
77 | ||
78 | /* Check both the current user and the local machine to see if we | |
79 | have any resources. */ | |
80 | ||
81 | if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, REG_ROOT, | |
82 | 0, "", REG_OPTION_NON_VOLATILE, | |
83 | KEY_WRITE, NULL, &hrootkey, &dwDisp) != ERROR_SUCCESS | |
84 | && RegCreateKeyEx (HKEY_CURRENT_USER, REG_ROOT, | |
85 | 0, "", REG_OPTION_NON_VOLATILE, | |
86 | KEY_WRITE, NULL, &hrootkey, &dwDisp) != ERROR_SUCCESS) | |
87 | { | |
88 | return FALSE; | |
89 | } | |
90 | ||
91 | for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++) | |
92 | { | |
93 | char * value = env_vars[i].value ? env_vars[i].value : path; | |
94 | ||
95 | if (RegSetValueEx (hrootkey, env_vars[i].name, | |
96 | 0, REG_EXPAND_SZ, | |
97 | value, lstrlen (value) + 1) != ERROR_SUCCESS) | |
98 | ok = FALSE; | |
99 | } | |
100 | ||
101 | RegCloseKey (hrootkey); | |
102 | ||
103 | return (ok); | |
104 | } | |
105 | ||
106 | int | |
6fbcbee7 RS |
107 | main (argc, argv) |
108 | int argc; | |
109 | char *argv[]; | |
cef9e134 | 110 | { |
65cd6687 | 111 | DWORD idDde = 0; |
6fbcbee7 RS |
112 | HCONV HConversation; |
113 | HSZ ProgMan; | |
65cd6687 | 114 | char modname[MAX_PATH]; |
cef9e134 | 115 | char additem[MAX_PATH*2 + 100]; |
9296c0e8 | 116 | char *prog_name; |
65cd6687 GV |
117 | char *emacs_path; |
118 | char *p; | |
cef9e134 | 119 | |
65cd6687 GV |
120 | /* If no args specified, use our location to set emacs_path. */ |
121 | #if 0 | |
6fbcbee7 | 122 | if (argc < 2 || argc > 3) |
cef9e134 | 123 | { |
2cc1905e GV |
124 | fprintf (stderr, "usage: addpm emacs_path [icon_path]\n"); |
125 | exit (1); | |
cef9e134 | 126 | } |
65cd6687 | 127 | #endif |
cef9e134 | 128 | |
65cd6687 GV |
129 | if (argc > 1) |
130 | emacs_path = argv[1]; | |
131 | else | |
132 | { | |
133 | if (!GetModuleFileName (NULL, modname, MAX_PATH) || | |
134 | (p = strrchr (modname, '\\')) == NULL) | |
135 | { | |
136 | fprintf (stderr, "fatal error"); | |
137 | exit (1); | |
138 | } | |
139 | *p = 0; | |
140 | ||
141 | /* Set emacs_path to emacs_dir if we are in "%emacs_dir%\bin". */ | |
142 | if ((p = strrchr (modname, '\\')) && stricmp (p, "\\bin") == 0) | |
143 | { | |
144 | *p = 0; | |
145 | emacs_path = modname; | |
146 | } | |
147 | else | |
148 | { | |
149 | fprintf (stderr, "usage: addpm emacs_path [icon_path]\n"); | |
150 | exit (1); | |
151 | } | |
152 | ||
153 | /* Tell user what we are going to do. */ | |
154 | { | |
155 | char msg[ MAX_PATH ]; | |
156 | sprintf (msg, "Install Emacs at %s?\n", emacs_path); | |
157 | if (!MessageBox (NULL, msg, "Install Emacs", MB_OKCANCEL | MB_ICONQUESTION)) | |
158 | { | |
159 | fprintf (stderr, "Install cancelled\n"); | |
160 | exit (1); | |
161 | } | |
162 | } | |
163 | } | |
164 | ||
9296c0e8 | 165 | prog_name = add_registry (emacs_path) ? "runemacs.exe" : "emacs.bat"; |
2cc1905e | 166 | |
6fbcbee7 | 167 | DdeInitialize (&idDde, (PFNCALLBACK)DdeCallback, APPCMD_CLIENTONLY, 0); |
cef9e134 | 168 | |
6fbcbee7 | 169 | ProgMan = DdeCreateStringHandle (idDde, "PROGMAN", CP_WINANSI); |
cef9e134 | 170 | |
9296c0e8 GV |
171 | HConversation = DdeConnect (idDde, ProgMan, ProgMan, NULL); |
172 | if (HConversation != 0) | |
cef9e134 | 173 | { |
9296c0e8 | 174 | DdeCommand ("[CreateGroup (\"Gnu Emacs\")]"); |
2cc1905e | 175 | DdeCommand ("[ReplaceItem (Emacs)]"); |
9296c0e8 GV |
176 | if (argc > 2) |
177 | sprintf (additem, "[AddItem (\"%s\\bin\\%s\", Emacs, \"%s\")]", | |
178 | emacs_path, prog_name, argv[2]); | |
179 | else | |
180 | sprintf (additem, "[AddItem (\"%s\\bin\\%s\", Emacs)]", | |
181 | emacs_path, prog_name); | |
6fbcbee7 RS |
182 | DdeCommand (additem); |
183 | ||
184 | DdeDisconnect (HConversation); | |
cef9e134 GV |
185 | } |
186 | ||
6fbcbee7 RS |
187 | DdeFreeStringHandle (idDde, ProgMan); |
188 | ||
189 | DdeUninitialize (idDde); | |
cef9e134 | 190 | |
6fbcbee7 | 191 | return (0); |
cef9e134 | 192 | } |