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 | |
177c0ea7 | 35 | HDDEDATA CALLBACK |
2cc1905e GV |
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; | |
177c0ea7 JB |
53 | } |
54 | env_vars[] = | |
2cc1905e | 55 | { |
c6e63684 | 56 | {"emacs_dir", NULL}, |
5488afcc | 57 | {"EMACSLOADPATH", "%emacs_dir%/site-lisp;%emacs_dir%/../site-lisp;%emacs_dir%/lisp;%emacs_dir%/leim"}, |
0655d4d4 | 58 | {"SHELL", "%emacs_dir%/bin/cmdproxy.exe"}, |
26b430b7 RS |
59 | {"EMACSDATA", "%emacs_dir%/etc"}, |
60 | {"EMACSPATH", "%emacs_dir%/bin"}, | |
9296c0e8 GV |
61 | /* We no longer set INFOPATH because Info-default-directory-list |
62 | is then ignored. */ | |
63 | /* {"INFOPATH", "%emacs_dir%/info"}, */ | |
26b430b7 | 64 | {"EMACSDOC", "%emacs_dir%/etc"}, |
2cc1905e GV |
65 | {"TERM", "cmd"} |
66 | }; | |
67 | ||
177c0ea7 | 68 | BOOL |
2cc1905e GV |
69 | add_registry (path) |
70 | char *path; | |
71 | { | |
72 | HKEY hrootkey = NULL; | |
73 | DWORD dwDisp; | |
74 | int i; | |
75 | BOOL ok = TRUE; | |
177c0ea7 JB |
76 | |
77 | /* Check both the current user and the local machine to see if we | |
2cc1905e | 78 | have any resources. */ |
177c0ea7 | 79 | |
2cc1905e GV |
80 | if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, REG_ROOT, |
81 | 0, "", REG_OPTION_NON_VOLATILE, | |
177c0ea7 | 82 | KEY_WRITE, NULL, &hrootkey, &dwDisp) != ERROR_SUCCESS |
2cc1905e GV |
83 | && RegCreateKeyEx (HKEY_CURRENT_USER, REG_ROOT, |
84 | 0, "", REG_OPTION_NON_VOLATILE, | |
85 | KEY_WRITE, NULL, &hrootkey, &dwDisp) != ERROR_SUCCESS) | |
86 | { | |
87 | return FALSE; | |
88 | } | |
177c0ea7 JB |
89 | |
90 | for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++) | |
2cc1905e GV |
91 | { |
92 | char * value = env_vars[i].value ? env_vars[i].value : path; | |
177c0ea7 | 93 | |
2cc1905e GV |
94 | if (RegSetValueEx (hrootkey, env_vars[i].name, |
95 | 0, REG_EXPAND_SZ, | |
96 | value, lstrlen (value) + 1) != ERROR_SUCCESS) | |
97 | ok = FALSE; | |
177c0ea7 JB |
98 | } |
99 | ||
2cc1905e | 100 | RegCloseKey (hrootkey); |
177c0ea7 | 101 | |
2cc1905e GV |
102 | return (ok); |
103 | } | |
104 | ||
105 | int | |
6fbcbee7 RS |
106 | main (argc, argv) |
107 | int argc; | |
177c0ea7 | 108 | char *argv[]; |
cef9e134 | 109 | { |
65cd6687 | 110 | DWORD idDde = 0; |
6fbcbee7 RS |
111 | HCONV HConversation; |
112 | HSZ ProgMan; | |
65cd6687 | 113 | char modname[MAX_PATH]; |
cef9e134 | 114 | char additem[MAX_PATH*2 + 100]; |
9296c0e8 | 115 | char *prog_name; |
65cd6687 GV |
116 | char *emacs_path; |
117 | char *p; | |
5205d900 | 118 | int quiet = 0; |
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 | { |
5205d900 | 124 | fprintf (stderr, "usage: addpm [/q] [emacs_path [icon_path]]\n"); |
2cc1905e | 125 | exit (1); |
cef9e134 | 126 | } |
65cd6687 | 127 | #endif |
cef9e134 | 128 | |
5205d900 AI |
129 | if (argc > 1 && argv[1][0] == '/' && argv[1][1] == 'q') |
130 | { | |
131 | quiet = 1; | |
132 | --argc; | |
133 | ++argv; | |
134 | } | |
135 | ||
65cd6687 GV |
136 | if (argc > 1) |
137 | emacs_path = argv[1]; | |
138 | else | |
139 | { | |
140 | if (!GetModuleFileName (NULL, modname, MAX_PATH) || | |
141 | (p = strrchr (modname, '\\')) == NULL) | |
142 | { | |
143 | fprintf (stderr, "fatal error"); | |
144 | exit (1); | |
145 | } | |
146 | *p = 0; | |
147 | ||
148 | /* Set emacs_path to emacs_dir if we are in "%emacs_dir%\bin". */ | |
149 | if ((p = strrchr (modname, '\\')) && stricmp (p, "\\bin") == 0) | |
150 | { | |
151 | *p = 0; | |
152 | emacs_path = modname; | |
153 | } | |
154 | else | |
155 | { | |
156 | fprintf (stderr, "usage: addpm emacs_path [icon_path]\n"); | |
157 | exit (1); | |
158 | } | |
159 | ||
160 | /* Tell user what we are going to do. */ | |
5205d900 AI |
161 | if (!quiet) |
162 | { | |
163 | int result; | |
164 | ||
165 | char msg[ MAX_PATH ]; | |
166 | sprintf (msg, "Install Emacs at %s?\n", emacs_path); | |
167 | result = MessageBox (NULL, msg, "Install Emacs", | |
168 | MB_OKCANCEL | MB_ICONQUESTION); | |
169 | if (result != IDOK) | |
170 | { | |
171 | fprintf (stderr, "Install cancelled\n"); | |
172 | exit (1); | |
173 | } | |
174 | } | |
65cd6687 GV |
175 | } |
176 | ||
5205d900 AI |
177 | add_registry (emacs_path); |
178 | prog_name = "runemacs.exe"; | |
2cc1905e | 179 | |
6fbcbee7 | 180 | DdeInitialize (&idDde, (PFNCALLBACK)DdeCallback, APPCMD_CLIENTONLY, 0); |
cef9e134 | 181 | |
6fbcbee7 | 182 | ProgMan = DdeCreateStringHandle (idDde, "PROGMAN", CP_WINANSI); |
cef9e134 | 183 | |
9296c0e8 GV |
184 | HConversation = DdeConnect (idDde, ProgMan, ProgMan, NULL); |
185 | if (HConversation != 0) | |
cef9e134 | 186 | { |
9296c0e8 | 187 | DdeCommand ("[CreateGroup (\"Gnu Emacs\")]"); |
2cc1905e | 188 | DdeCommand ("[ReplaceItem (Emacs)]"); |
9296c0e8 GV |
189 | if (argc > 2) |
190 | sprintf (additem, "[AddItem (\"%s\\bin\\%s\", Emacs, \"%s\")]", | |
191 | emacs_path, prog_name, argv[2]); | |
192 | else | |
193 | sprintf (additem, "[AddItem (\"%s\\bin\\%s\", Emacs)]", | |
194 | emacs_path, prog_name); | |
6fbcbee7 RS |
195 | DdeCommand (additem); |
196 | ||
197 | DdeDisconnect (HConversation); | |
cef9e134 GV |
198 | } |
199 | ||
6fbcbee7 RS |
200 | DdeFreeStringHandle (idDde, ProgMan); |
201 | ||
202 | DdeUninitialize (idDde); | |
cef9e134 | 203 | |
6fbcbee7 | 204 | return (0); |
cef9e134 | 205 | } |
ab5796a9 MB |
206 | |
207 | /* arch-tag: f923609d-b781-4ef4-abce-ca0da29cbbf0 | |
208 | (do not change this comment) */ |