Mercurial > hg > xemacs-beta
comparison netinstall/desktop.cc @ 448:3078fd1074e8 r21-2-39
Import from CVS: tag r21-2-39
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:38:25 +0200 |
parents | |
children | 3d3049ae1304 |
comparison
equal
deleted
inserted
replaced
447:4fc5f13f3bd3 | 448:3078fd1074e8 |
---|---|
1 /* | |
2 * Copyright (c) 2000, Red Hat, Inc. | |
3 * | |
4 * This program is free software; you can redistribute it and/or modify | |
5 * it under the terms of the GNU General Public License as published by | |
6 * the Free Software Foundation; either version 2 of the License, or | |
7 * (at your option) any later version. | |
8 * | |
9 * A copy of the GNU General Public License can be found at | |
10 * http://www.gnu.org/ | |
11 * | |
12 * Written by DJ Delorie <dj@cygnus.com> | |
13 * | |
14 */ | |
15 | |
16 /* The purpose of this file is to manage all the desktop setup, such | |
17 as start menu, batch files, desktop icons, and shortcuts. Note | |
18 that unlike other do_* functions, this one is called directly from | |
19 install.cc */ | |
20 | |
21 | |
22 #include "win32.h" | |
23 #include <shlobj.h> | |
24 | |
25 #include <io.h> | |
26 #include <stdio.h> | |
27 #include <stdlib.h> | |
28 #ifndef WIN32_NATIVE | |
29 #include <unistd.h> | |
30 #endif | |
31 | |
32 #include "resource.h" | |
33 #include "ini.h" | |
34 #include "msg.h" | |
35 #include "state.h" | |
36 #include "concat.h" | |
37 #include "mkdir.h" | |
38 #include "dialog.h" | |
39 #include "version.h" | |
40 #include "reginfo.h" | |
41 #include "regedit.h" | |
42 #include "port.h" | |
43 | |
44 extern "C" { | |
45 void make_link_2 (char *exepath, char *args, char *icon, char *lname); | |
46 }; | |
47 | |
48 static OSVERSIONINFO verinfo; | |
49 | |
50 /* Lines starting with '@' are conditionals - include 'N' for NT, | |
51 '5' for Win95, '8' for Win98, '*' for all, like this: | |
52 echo foo | |
53 @N8 | |
54 echo NT or 98 | |
55 @* | |
56 */ | |
57 | |
58 #define COMMAND9XARGS "/E:4096 /c" | |
59 #define COMMAND9XEXE "\\command.com" | |
60 | |
61 static char *iconname; | |
62 static char *batname; | |
63 | |
64 static void | |
65 make_link (char *linkpath, char *title, char *target) | |
66 { | |
67 char argbuf[_MAX_PATH]; | |
68 char *fname = concat (linkpath, "/", title, ".lnk", 0); | |
69 | |
70 if (_access (fname, 0) == 0) | |
71 return; /* already exists */ | |
72 | |
73 msg ("make_link %s, %s, %s\n", fname, title, target); | |
74 | |
75 mkdir_p (0, fname); | |
76 | |
77 char *exepath, *args; | |
78 | |
79 /* If we are running Win9x, build a command line. */ | |
80 if (verinfo.dwPlatformId == VER_PLATFORM_WIN32_NT) | |
81 { | |
82 exepath = target; | |
83 args = ""; | |
84 } | |
85 else | |
86 { | |
87 char windir[MAX_PATH]; | |
88 | |
89 GetWindowsDirectory (windir, sizeof (windir)); | |
90 exepath = concat (windir, COMMAND9XEXE, 0); | |
91 sprintf (argbuf, "%s %s", COMMAND9XARGS, target); | |
92 args = argbuf; | |
93 } | |
94 | |
95 msg ("make_link_2 (%s, %s, %s, %s)", exepath, args, iconname, fname); | |
96 make_link_2 (exepath, args, iconname, fname); | |
97 } | |
98 | |
99 static char* | |
100 find_xemacs_exe_path () | |
101 { | |
102 if (xemacs_package->type == TY_CYGWIN) | |
103 return backslash (concat (root_dir, "/bin/", XEMACS_CYGWIN_ARCH_NAME, 0)); | |
104 else | |
105 return backslash (concat (root_dir, "\\XEmacs-", | |
106 xemacs_package->info[xemacs_package->trust].version, | |
107 "\\", XEMACS_NATIVE_ARCH_NAME, 0)); | |
108 } | |
109 | |
110 static char* | |
111 find_xemacs_exe_name () | |
112 { | |
113 if (xemacs_package->type == TY_CYGWIN) | |
114 return backslash (concat ("xemacs-", | |
115 xemacs_package->info[xemacs_package->trust].version, | |
116 ".exe", 0)); | |
117 else | |
118 return strdup ("xemacs.exe"); | |
119 } | |
120 | |
121 static void | |
122 start_menu (char *title, char *target) | |
123 { | |
124 char path[_MAX_PATH]; | |
125 LPITEMIDLIST id; | |
126 int issystem = (root_scope == IDC_ROOT_SYSTEM) ? 1 : 0; | |
127 SHGetSpecialFolderLocation (NULL, issystem ? CSIDL_COMMON_PROGRAMS : CSIDL_PROGRAMS, &id); | |
128 SHGetPathFromIDList (id, path); | |
129 // following lines added because it appears Win95 does not use common programs | |
130 // unless it comes into play when multiple users for Win95 is enabled | |
131 msg("Program directory for program link: %s",path); | |
132 if ( strlen(path) == 0) { | |
133 SHGetSpecialFolderLocation (NULL, CSIDL_PROGRAMS, &id); | |
134 SHGetPathFromIDList (id, path); | |
135 msg("Program directory for program link changed to: %s",path); | |
136 } | |
137 // end of Win95 addition | |
138 strcat (path, "/"); | |
139 strcat (path, XEMACS_INFO_XEMACS_ORG_REGISTRY_NAME); | |
140 make_link (path, title, target); | |
141 } | |
142 | |
143 static void | |
144 desktop_icon (char *title, char *target) | |
145 { | |
146 char path[_MAX_PATH]; | |
147 LPITEMIDLIST id; | |
148 int issystem = (root_scope == IDC_ROOT_SYSTEM) ? 1 : 0; | |
149 //SHGetSpecialFolderLocation (NULL, issystem ? CSIDL_DESKTOP : CSIDL_COMMON_DESKTOPDIRECTORY, &id); | |
150 SHGetSpecialFolderLocation (NULL, issystem ? CSIDL_COMMON_DESKTOPDIRECTORY : CSIDL_DESKTOPDIRECTORY, &id); | |
151 SHGetPathFromIDList (id, path); | |
152 // following lines added because it appears Win95 does not use common programs | |
153 // unless it comes into play when multiple users for Win95 is enabled | |
154 msg("Desktop directory for desktop link: %s",path); | |
155 if ( strlen(path) == 0) { | |
156 SHGetSpecialFolderLocation (NULL, CSIDL_DESKTOPDIRECTORY, &id); | |
157 SHGetPathFromIDList (id, path); | |
158 msg("Desktop directory for deskop link changed to: %s",path); | |
159 } | |
160 // end of Win95 addition | |
161 make_link (path, title, target); | |
162 } | |
163 | |
164 static int | |
165 uexists (char *path) | |
166 { | |
167 char *f = concat (root_dir, path, 0); | |
168 int a = _access (f, 0); | |
169 free (f); | |
170 if (a == 0) | |
171 return 1; | |
172 return 0; | |
173 } | |
174 | |
175 static void | |
176 make_passwd_group () | |
177 { | |
178 if (verinfo.dwPlatformId != VER_PLATFORM_WIN32_NT) | |
179 { | |
180 int i; | |
181 | |
182 LOOP_PACKAGES | |
183 { | |
184 if (!strcmp (package[i].name, "cygwin")) | |
185 { | |
186 /* mkpasswd and mkgroup are not working on 9x/ME up to 1.1.5-4 */ | |
187 char *border_version = canonicalize_version ("1.1.5-4"); | |
188 char *inst_version = canonicalize_version (pi.version); | |
189 | |
190 if (strcmp (inst_version, border_version) <= 0) | |
191 return; | |
192 | |
193 break; | |
194 } | |
195 } | |
196 } | |
197 | |
198 if (uexists ("/etc/passwd") && uexists ("/etc/group")) | |
199 return; | |
200 | |
201 char *fname = concat (root_dir, "/etc/postinstall/passwd-grp.bat", 0); | |
202 mkdir_p (0, fname); | |
203 | |
204 FILE *p = fopen (fname, "wb"); | |
205 if (!p) | |
206 return; | |
207 | |
208 if (!uexists ("/etc/passwd")) | |
209 fprintf (p, "bin\\mkpasswd -l > etc\\passwd\n"); | |
210 if (!uexists ("/etc/group")) | |
211 fprintf (p, "bin\\mkgroup -l > etc\\group\n"); | |
212 | |
213 fclose (p); | |
214 } | |
215 | |
216 static void | |
217 save_icon () | |
218 { | |
219 iconname = backslash (concat (root_dir, XEMACS_RESOURCE_DIR, | |
220 "xemacs.ico", 0)); | |
221 | |
222 HRSRC rsrc = FindResource (NULL, "XEMACS.ICON", "FILE"); | |
223 if (rsrc == NULL) | |
224 { | |
225 fatal ("FindResource failed"); | |
226 } | |
227 HGLOBAL res = LoadResource (NULL, rsrc); | |
228 char *data = (char *) LockResource (res); | |
229 int len = SizeofResource (NULL, rsrc); | |
230 | |
231 FILE *f = fopen (iconname, "wb"); | |
232 if (f) | |
233 { | |
234 fwrite (data, 1, len, f); | |
235 fclose (f); | |
236 } | |
237 } | |
238 | |
239 static void | |
240 do_desktop_setup() | |
241 { | |
242 save_icon (); | |
243 | |
244 if (root_menu && batname) { | |
245 start_menu ("XEmacs", batname); | |
246 } | |
247 | |
248 if (root_desktop && batname) { | |
249 desktop_icon ("XEmacs", batname); | |
250 } | |
251 | |
252 // set regkeys for the application | |
253 if (xemacs_package != 0) | |
254 { | |
255 int issystem = (root_scope == IDC_ROOT_SYSTEM ? 1 : 0); | |
256 if (xemacs_package->type == TY_NATIVE) | |
257 { | |
258 #define FROB(exe) set_app_path ((exe), \ | |
259 find_xemacs_exe_path (), \ | |
260 issystem) | |
261 FROB (find_xemacs_exe_name ()); | |
262 FROB ("runemacs.exe"); | |
263 FROB ("xemacs.exe"); | |
264 #undef FROB | |
265 } | |
266 else if (xemacs_package->type == TY_CYGWIN) | |
267 { | |
268 int junk; | |
269 char* root = find_cygwin_root (&junk); | |
270 #define FROB(exe) set_app_path ((exe), \ | |
271 concat (find_xemacs_exe_path (), ";", \ | |
272 root, "\\bin;", \ | |
273 root, "\\usr\\bin", 0), \ | |
274 issystem) | |
275 FROB (find_xemacs_exe_name ()); | |
276 FROB ("runemacs.exe"); | |
277 FROB ("xemacs.exe"); | |
278 #undef FROB | |
279 } | |
280 } | |
281 } | |
282 | |
283 static int da[] = { IDC_ROOT_DESKTOP, 0 }; | |
284 static int ma[] = { IDC_ROOT_MENU, 0 }; | |
285 | |
286 static void | |
287 check_if_enable_next (HWND h) | |
288 { | |
289 EnableWindow (GetDlgItem (h, IDOK), 1); | |
290 } | |
291 | |
292 static void | |
293 load_dialog (HWND h) | |
294 { | |
295 rbset (h, da, root_desktop); | |
296 rbset (h, ma, root_menu); | |
297 check_if_enable_next (h); | |
298 } | |
299 | |
300 static int check_desktop (char *title, char *target) | |
301 { | |
302 char path[_MAX_PATH]; | |
303 LPITEMIDLIST id; | |
304 int issystem = (root_scope == IDC_ROOT_SYSTEM) ? 1 : 0; | |
305 SHGetSpecialFolderLocation (NULL, issystem ? CSIDL_COMMON_DESKTOPDIRECTORY : CSIDL_DESKTOPDIRECTORY, &id); | |
306 SHGetPathFromIDList (id, path); | |
307 // following lines added because it appears Win95 does not use common programs | |
308 // unless it comes into play when multiple users for Win95 is enabled | |
309 msg ("Desktop directory for desktop link: %s",path); | |
310 if (strlen (path) == 0) { | |
311 SHGetSpecialFolderLocation (NULL, CSIDL_DESKTOPDIRECTORY, &id); | |
312 SHGetPathFromIDList (id, path); | |
313 msg ("Desktop directory for deskop link changed to: %s",path); | |
314 } | |
315 // end of Win95 addition | |
316 char *fname = concat (path, "/", title, ".lnk", 0); | |
317 | |
318 if (_access (fname, 0) == 0) | |
319 return 0; /* already exists */ | |
320 | |
321 fname = concat (path, "/", title, ".pif", 0); /* check for a pif as well */ | |
322 | |
323 if (_access (fname, 0) == 0) | |
324 return 0; /* already exists */ | |
325 | |
326 return IDC_ROOT_DESKTOP; | |
327 } | |
328 | |
329 static int check_startmenu (char *title, char *target) | |
330 { | |
331 char path[_MAX_PATH]; | |
332 LPITEMIDLIST id; | |
333 int issystem = (root_scope == IDC_ROOT_SYSTEM) ? 1 : 0; | |
334 SHGetSpecialFolderLocation (NULL, issystem ? CSIDL_COMMON_PROGRAMS : CSIDL_PROGRAMS, &id); | |
335 SHGetPathFromIDList (id, path); | |
336 // following lines added because it appears Win95 does not use common programs | |
337 // unless it comes into play when multiple users for Win95 is enabled | |
338 msg ("Program directory for program link: %s",path); | |
339 if (strlen (path) == 0) { | |
340 SHGetSpecialFolderLocation (NULL, CSIDL_PROGRAMS, &id); | |
341 SHGetPathFromIDList (id, path); | |
342 msg ("Program directory for program link changed to: %s",path); | |
343 } | |
344 // end of Win95 addition | |
345 strcat (path, "/"); | |
346 strcat (path, XEMACS_INFO_XEMACS_ORG_REGISTRY_NAME); | |
347 char *fname = concat (path, "/", title, ".lnk", 0); | |
348 | |
349 if (_access (fname, 0) == 0) | |
350 return 0; /* already exists */ | |
351 | |
352 fname = concat (path, "/", title, ".pif", 0); /* check for a pif as well */ | |
353 | |
354 if (_access (fname, 0) == 0) | |
355 return 0; /* already exists */ | |
356 | |
357 return IDC_ROOT_MENU; | |
358 } | |
359 | |
360 static void | |
361 save_dialog (HWND h) | |
362 { | |
363 root_desktop= rbget (h, da); | |
364 root_menu = rbget (h, ma); | |
365 } | |
366 | |
367 static BOOL | |
368 dialog_cmd (HWND h, int id, HWND hwndctl, UINT code) | |
369 { | |
370 switch (id) | |
371 { | |
372 | |
373 case IDC_ROOT_DESKTOP: | |
374 case IDC_ROOT_MENU: | |
375 save_dialog (h); | |
376 check_if_enable_next (h); | |
377 break; | |
378 | |
379 case IDOK: | |
380 save_dialog (h); | |
381 do_desktop_setup(); | |
382 NEXT (IDD_S_POSTINSTALL); | |
383 break; | |
384 | |
385 case IDC_BACK: | |
386 save_dialog (h); | |
387 NEXT (IDD_CHOOSE); | |
388 break; | |
389 | |
390 case IDCANCEL: | |
391 NEXT (0); | |
392 break; | |
393 } | |
394 return FALSE; | |
395 } | |
396 | |
397 static BOOL CALLBACK | |
398 dialog_proc (HWND h, UINT message, WPARAM wParam, LPARAM lParam) | |
399 { | |
400 switch (message) | |
401 { | |
402 case WM_INITDIALOG: | |
403 load_dialog (h); | |
404 return FALSE; | |
405 case WM_COMMAND: | |
406 return HANDLE_WM_COMMAND (h, wParam, lParam, dialog_cmd); | |
407 } | |
408 return FALSE; | |
409 } | |
410 | |
411 void | |
412 do_desktop (HINSTANCE h) | |
413 { | |
414 CoInitialize (NULL); | |
415 | |
416 verinfo.dwOSVersionInfoSize = sizeof (verinfo); | |
417 GetVersionEx (&verinfo); | |
418 batname = 0; | |
419 | |
420 if (xemacs_package != 0 && xemacs_package->type != TY_GENERIC) | |
421 { | |
422 batname = concat (find_xemacs_exe_path (), "\\", | |
423 find_xemacs_exe_name (), 0); | |
424 root_desktop = check_desktop ("XEmacs", batname); | |
425 root_menu = check_startmenu ("XEmacs", batname); | |
426 } | |
427 else | |
428 { | |
429 root_desktop = 0; | |
430 root_menu = 0; | |
431 } | |
432 | |
433 int rv = 0; | |
434 | |
435 rv = DialogBox (h, MAKEINTRESOURCE (IDD_DESKTOP), 0, dialog_proc); | |
436 if (rv == -1) | |
437 fatal (IDS_DIALOG_FAILED); | |
438 } |