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 GV |
56 | {"emacs_dir", NULL}, |
57 | {"EMACSLOADPATH", "%emacs_dir%\\lisp"}, | |
2cc1905e | 58 | {"SHELL", "cmd"}, |
c6e63684 GV |
59 | {"EMACSDATA", "%emacs_dir%\\etc"}, |
60 | {"EMACSPATH", "%emacs_dir%\\bin"}, | |
61 | {"EMACSLOCKDIR", "%emacs_dir%\\lock"}, | |
62 | {"INFOPATH", "%emacs_dir%\\info"}, | |
63 | {"EMACSDOC", "%emacs_dir%\\etc"}, | |
2cc1905e GV |
64 | {"TERM", "cmd"} |
65 | }; | |
66 | ||
67 | BOOL | |
68 | add_registry (path) | |
69 | char *path; | |
70 | { | |
71 | HKEY hrootkey = NULL; | |
72 | DWORD dwDisp; | |
73 | int i; | |
74 | BOOL ok = TRUE; | |
75 | ||
76 | /* Check both the current user and the local machine to see if we | |
77 | have any resources. */ | |
78 | ||
79 | if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, REG_ROOT, | |
80 | 0, "", REG_OPTION_NON_VOLATILE, | |
81 | KEY_WRITE, NULL, &hrootkey, &dwDisp) != ERROR_SUCCESS | |
82 | && RegCreateKeyEx (HKEY_CURRENT_USER, REG_ROOT, | |
83 | 0, "", REG_OPTION_NON_VOLATILE, | |
84 | KEY_WRITE, NULL, &hrootkey, &dwDisp) != ERROR_SUCCESS) | |
85 | { | |
86 | return FALSE; | |
87 | } | |
88 | ||
89 | for (i = 0; i < (sizeof (env_vars) / sizeof (env_vars[0])); i++) | |
90 | { | |
91 | char * value = env_vars[i].value ? env_vars[i].value : path; | |
92 | ||
93 | if (RegSetValueEx (hrootkey, env_vars[i].name, | |
94 | 0, REG_EXPAND_SZ, | |
95 | value, lstrlen (value) + 1) != ERROR_SUCCESS) | |
96 | ok = FALSE; | |
97 | } | |
98 | ||
99 | RegCloseKey (hrootkey); | |
100 | ||
101 | return (ok); | |
102 | } | |
103 | ||
104 | int | |
6fbcbee7 RS |
105 | main (argc, argv) |
106 | int argc; | |
107 | char *argv[]; | |
cef9e134 | 108 | { |
6fbcbee7 RS |
109 | DWORD idDde; |
110 | HCONV HConversation; | |
111 | HSZ ProgMan; | |
cef9e134 | 112 | char additem[MAX_PATH*2 + 100]; |
2cc1905e | 113 | char *lpext; |
cef9e134 | 114 | |
6fbcbee7 | 115 | if (argc < 2 || argc > 3) |
cef9e134 | 116 | { |
2cc1905e GV |
117 | fprintf (stderr, "usage: addpm emacs_path [icon_path]\n"); |
118 | exit (1); | |
cef9e134 | 119 | } |
cef9e134 | 120 | |
2cc1905e GV |
121 | lpext = add_registry (argv[1]) ? "exe" : "bat"; |
122 | ||
6fbcbee7 | 123 | DdeInitialize (&idDde, (PFNCALLBACK)DdeCallback, APPCMD_CLIENTONLY, 0); |
cef9e134 | 124 | |
6fbcbee7 | 125 | ProgMan = DdeCreateStringHandle (idDde, "PROGMAN", CP_WINANSI); |
cef9e134 | 126 | |
6fbcbee7 | 127 | if (HConversation = DdeConnect (idDde, ProgMan, ProgMan, NULL)) |
cef9e134 | 128 | { |
2cc1905e GV |
129 | DdeCommand ("[CreateGroup (Gnu Emacs)]"); |
130 | DdeCommand ("[ReplaceItem (Emacs)]"); | |
c6e63684 | 131 | sprintf (additem, "[AddItem (%s\\bin\\runemacs.%s, Emacs%c%s)]", |
2cc1905e | 132 | argv[1], lpext, (argc>2 ? ',' : ' '), |
6fbcbee7 RS |
133 | (argc>2 ? argv[2] : "")); |
134 | DdeCommand (additem); | |
135 | ||
136 | DdeDisconnect (HConversation); | |
cef9e134 GV |
137 | } |
138 | ||
6fbcbee7 RS |
139 | DdeFreeStringHandle (idDde, ProgMan); |
140 | ||
141 | DdeUninitialize (idDde); | |
cef9e134 | 142 | |
6fbcbee7 | 143 | return (0); |
cef9e134 | 144 | } |