annotate src/uninstal.c @ 9:6a13985590e6

*** empty log message ***
author axmo
date Fri, 29 Aug 2008 15:41:29 +0900
parents 76efa0be13f1
children c16898406ff2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4:
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
2 *
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
4 *
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
8 */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
9
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
10 /*
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
11 * uninstal.c: Minimalistic uninstall program for Vim on MS-Windows
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
12 * Removes:
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
13 * - the "Edit with Vim" popup menu entry
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
14 * - the Vim "Open With..." popup menu entry
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
15 * - any Vim Batch files in the path
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
16 * - icons for Vim on the Desktop
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
17 * - the Vim entry in the Start Menu
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
18 */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
19
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
20 /* Include common code for dosinst.c and uninstal.c. */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
21 #include "dosinst.h"
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
22
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
23 /*
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
24 * Return TRUE if the user types a 'y' or 'Y', FALSE otherwise.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
25 */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
26 static int
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
27 confirm(void)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
28 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
29 char answer[10];
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
30
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
31 fflush(stdout);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
32 return (scanf(" %c", answer) == 1 && toupper(answer[0]) == 'Y');
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
33 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
34
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
35 #ifdef WIN3264
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
36 /*
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
37 * Check if the popup menu entry exists and what gvim it refers to.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
38 * Returns non-zero when it's found.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
39 */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
40 static int
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
41 popup_gvim_path(char *buf)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
42 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
43 HKEY key_handle;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
44 DWORD value_type;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
45 DWORD bufsize = BUFSIZE;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
46 int r;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
47
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
48 /* Open the key where the path to gvim.exe is stored. */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
49 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Vim\\Gvim", 0, KEY_READ,
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
50 &key_handle) != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
51 return 0;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
52
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
53 /* get the DisplayName out of it to show the user */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
54 r = RegQueryValueEx(key_handle, "path", 0,
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
55 &value_type, (LPBYTE)buf, &bufsize);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
56 RegCloseKey(key_handle);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
57
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
58 return (r == ERROR_SUCCESS);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
59 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
60
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
61 /*
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
62 * Check if the "Open With..." menu entry exists and what gvim it refers to.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
63 * Returns non-zero when it's found.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
64 */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
65 static int
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
66 openwith_gvim_path(char *buf)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
67 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
68 HKEY key_handle;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
69 DWORD value_type;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
70 DWORD bufsize = BUFSIZE;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
71 int r;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
72
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
73 /* Open the key where the path to gvim.exe is stored. */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
74 if (RegOpenKeyEx(HKEY_CLASSES_ROOT,
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
75 "Applications\\gvim.exe\\shell\\edit\\command", 0, KEY_READ,
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
76 &key_handle) != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
77 return 0;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
78
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
79 /* get the DisplayName out of it to show the user */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
80 r = RegQueryValueEx(key_handle, "", 0, &value_type, (LPBYTE)buf, &bufsize);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
81 RegCloseKey(key_handle);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
82
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
83 return (r == ERROR_SUCCESS);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
84 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
85
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
86 static void
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
87 remove_popup(void)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
88 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
89 int fail = 0;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
90 HKEY kh;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
91
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
92 if (RegDeleteKey(HKEY_CLASSES_ROOT, "CLSID\\{51EEE242-AD87-11d3-9C1E-0090278BBD99}\\InProcServer32") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
93 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
94 if (RegDeleteKey(HKEY_CLASSES_ROOT, "CLSID\\{51EEE242-AD87-11d3-9C1E-0090278BBD99}") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
95 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
96 if (RegDeleteKey(HKEY_CLASSES_ROOT, "*\\shellex\\ContextMenuHandlers\\gvim") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
97 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
98 if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", 0, KEY_ALL_ACCESS, &kh) != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
99 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
100 else
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
101 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
102 if (RegDeleteValue(kh, "{51EEE242-AD87-11d3-9C1E-0090278BBD99}") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
103 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
104 RegCloseKey(kh);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
105 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
106 if (RegDeleteKey(HKEY_LOCAL_MACHINE, "Software\\Vim\\Gvim") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
107 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
108 if (RegDeleteKey(HKEY_LOCAL_MACHINE, "Software\\Vim") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
109 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
110
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
111 if (fail == 6)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
112 printf("No Vim popup registry entries could be removed\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
113 else if (fail > 0)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
114 printf("Some Vim popup registry entries could not be removed\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
115 else
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
116 printf("The Vim popup registry entries have been removed\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
117 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
118
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
119 static void
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
120 remove_openwith(void)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
121 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
122 int fail = 0;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
123
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
124 if (RegDeleteKey(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell\\edit\\command") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
125 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
126 if (RegDeleteKey(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell\\edit") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
127 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
128 if (RegDeleteKey(HKEY_CLASSES_ROOT, "Applications\\gvim.exe\\shell") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
129 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
130 if (RegDeleteKey(HKEY_CLASSES_ROOT, "Applications\\gvim.exe") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
131 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
132 if (RegDeleteKey(HKEY_CLASSES_ROOT, ".htm\\OpenWithList\\gvim.exe") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
133 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
134 if (RegDeleteKey(HKEY_CLASSES_ROOT, ".vim\\OpenWithList\\gvim.exe") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
135 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
136 if (RegDeleteKey(HKEY_CLASSES_ROOT, "*\\OpenWithList\\gvim.exe") != ERROR_SUCCESS)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
137 ++fail;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
138
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
139 if (fail == 7)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
140 printf("No Vim open-with registry entries could be removed\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
141 else if (fail > 0)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
142 printf("Some Vim open-with registry entries could not be removed\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
143 else
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
144 printf("The Vim open-with registry entries have been removed\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
145 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
146 #endif
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
147
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
148 /*
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
149 * Check if a batch file is really for the current version. Don't delete a
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
150 * batch file that was written for another (possibly newer) version.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
151 */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
152 static int
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
153 batfile_thisversion(char *path)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
154 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
155 FILE *fd;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
156 char line[BUFSIZE];
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
157 char *p;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
158 int ver_len = strlen(VIM_VERSION_NODOT);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
159 int found = FALSE;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
160
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
161 fd = fopen(path, "r");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
162 if (fd != NULL)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
163 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
164 while (fgets(line, BUFSIZE, fd) != NULL)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
165 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
166 for (p = line; *p != 0; ++p)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
167 /* don't accept "vim60an" when looking for "vim60". */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
168 if (strnicmp(p, VIM_VERSION_NODOT, ver_len) == 0
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
169 && !isdigit(p[ver_len])
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
170 && !isalpha(p[ver_len]))
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
171 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
172 found = TRUE;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
173 break;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
174 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
175 if (found)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
176 break;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
177 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
178 fclose(fd);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
179 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
180 return found;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
181 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
182
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
183 static int
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
184 remove_batfiles(int doit)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
185 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
186 char *batfile_path;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
187 int i;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
188 int found = 0;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
189
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
190 for (i = 1; i < TARGET_COUNT; ++i)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
191 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
192 batfile_path = searchpath_save(targets[i].batname);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
193 if (batfile_path != NULL && batfile_thisversion(batfile_path))
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
194 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
195 ++found;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
196 if (doit)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
197 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
198 printf("removing %s\n", batfile_path);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
199 remove(batfile_path);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
200 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
201 else
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
202 printf(" - the batch file %s\n", batfile_path);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
203 free(batfile_path);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
204 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
205 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
206 return found;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
207 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
208
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
209 #ifdef WIN3264
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
210 static void
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
211 remove_if_exists(char *path, char *filename)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
212 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
213 char buf[BUFSIZE];
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
214 FILE *fd;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
215
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
216 sprintf(buf, "%s\\%s", path, filename);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
217
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
218 fd = fopen(buf, "r");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
219 if (fd != NULL)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
220 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
221 fclose(fd);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
222 printf("removing %s\n", buf);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
223 remove(buf);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
224 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
225 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
226
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
227 static void
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
228 remove_icons(void)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
229 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
230 char path[BUFSIZE];
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
231 int i;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
232
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
233 if (get_shell_folder_path(path, "desktop"))
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
234 for (i = 0; i < ICON_COUNT; ++i)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
235 remove_if_exists(path, icon_link_names[i]);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
236 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
237
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
238 static void
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
239 remove_start_menu(void)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
240 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
241 char path[BUFSIZE];
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
242 int i;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
243 struct stat st;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
244
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
245 if (get_shell_folder_path(path, VIM_STARTMENU))
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
246 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
247 for (i = 1; i < TARGET_COUNT; ++i)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
248 remove_if_exists(path, targets[i].lnkname);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
249 remove_if_exists(path, "uninstall.lnk");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
250 remove_if_exists(path, "Help.lnk");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
251 /* Win95 uses .pif, WinNT uses .lnk */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
252 remove_if_exists(path, "Vim tutor.pif");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
253 remove_if_exists(path, "Vim tutor.lnk");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
254 remove_if_exists(path, "Vim online.url");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
255 if (stat(path, &st) == 0)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
256 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
257 printf("removing %s\n", path);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
258 rmdir(path);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
259 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
260 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
261 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
262 #endif
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
263
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
264 #if 0 /* currently not used */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
265 /*
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
266 * Return TRUE when we're on Windows 95/98/ME.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
267 */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
268 static int
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
269 win95(void)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
270 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
271 static int done = FALSE;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
272 static DWORD PlatformId;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
273
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
274 if (!done)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
275 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
276 OSVERSIONINFO ovi;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
277
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
278 ovi.dwOSVersionInfoSize = sizeof(ovi);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
279 GetVersionEx(&ovi);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
280 PlatformId = ovi.dwPlatformId;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
281 done = TRUE;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
282 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
283 /* Win NT/2000/XP is VER_PLATFORM_WIN32_NT */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
284 return PlatformId == VER_PLATFORM_WIN32_WINDOWS;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
285 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
286 #endif
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
287
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
288 static void
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
289 delete_uninstall_key(void)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
290 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
291 #ifdef WIN3264
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
292 RegDeleteKey(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Vim " VIM_VERSION_SHORT);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
293 #else
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
294 FILE *fd;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
295 char buf[BUFSIZE];
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
296
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
297 /*
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
298 * On DJGPP we delete registry entries by creating a .inf file and
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
299 * installing it.
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
300 */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
301 fd = fopen("vim.inf", "w");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
302 if (fd != NULL)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
303 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
304 fprintf(fd, "[version]\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
305 fprintf(fd, "signature=\"$CHICAGO$\"\n\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
306 fprintf(fd, "[DefaultInstall]\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
307 fprintf(fd, "DelReg=DeleteMe\n\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
308 fprintf(fd, "[DeleteMe]\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
309 fprintf(fd, "HKLM,\"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Vim " VIM_VERSION_SHORT "\"\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
310 fclose(fd);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
311
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
312 /* Don't know how to detect Win NT with DJGPP. Hack: Just try the Win
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
313 * 95/98/ME method, since the DJGPP version can't use long filenames
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
314 * on Win NT anyway. */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
315 sprintf(buf, "rundll setupx.dll,InstallHinfSection DefaultInstall 132 %s\\vim.inf", installdir);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
316 run_command(buf);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
317 #if 0
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
318 /* Windows NT method (untested). */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
319 sprintf(buf, "rundll32 syssetup,SetupInfObjectInstallAction DefaultInstall 128 %s\\vim.inf", installdir);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
320 run_command(buf);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
321 #endif
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
322
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
323 remove("vim.inf");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
324 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
325 #endif
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
326 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
327
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
328 int
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
329 main(int argc, char *argv[])
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
330 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
331 int found = 0;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
332 FILE *fd;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
333 #ifdef WIN3264
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
334 int i;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
335 struct stat st;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
336 char icon[BUFSIZE];
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
337 char path[BUFSIZE];
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
338 char popup_path[BUFSIZE];
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
339
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
340 /* The nsis uninstaller calls us with a "-nsis" argument. */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
341 if (argc == 2 && stricmp(argv[1], "-nsis") == 0)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
342 interactive = FALSE;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
343 else
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
344 #endif
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
345 interactive = TRUE;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
346
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
347 /* Initialize this program. */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
348 do_inits(argv);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
349
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
350 printf("This program will remove the following items:\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
351
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
352 #ifdef WIN3264
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
353 if (popup_gvim_path(popup_path))
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
354 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
355 printf(" - the \"Edit with Vim\" entry in the popup menu\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
356 printf(" which uses \"%s\"\n", popup_path);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
357 printf("\nRemove it (y/n)? ");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
358 if (confirm())
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
359 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
360 remove_popup();
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
361 /* Assume the "Open With" entry can be removed as well, don't
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
362 * bother the user with asking him again. */
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
363 remove_openwith();
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
364 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
365 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
366 else if (openwith_gvim_path(popup_path))
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
367 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
368 printf(" - the Vim \"Open With...\" entry in the popup menu\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
369 printf(" which uses \"%s\"\n", popup_path);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
370 printf("\nRemove it (y/n)? ");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
371 if (confirm())
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
372 remove_openwith();
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
373 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
374
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
375 if (get_shell_folder_path(path, "desktop"))
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
376 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
377 printf("\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
378 for (i = 0; i < ICON_COUNT; ++i)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
379 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
380 sprintf(icon, "%s\\%s", path, icon_link_names[i]);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
381 if (stat(icon, &st) == 0)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
382 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
383 printf(" - the \"%s\" icon on the desktop\n", icon_names[i]);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
384 ++found;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
385 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
386 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
387 if (found > 0)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
388 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
389 if (interactive)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
390 printf("\nRemove %s (y/n)? ", found > 1 ? "them" : "it");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
391 if (!interactive || confirm())
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
392 remove_icons();
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
393 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
394 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
395
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
396 if (get_shell_folder_path(path, VIM_STARTMENU)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
397 && stat(path, &st) == 0)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
398 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
399 printf("\n - the \"%s\" entry in the Start Menu\n", VIM_STARTMENU);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
400 if (interactive)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
401 printf("\nRemove it (y/n)? ");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
402 if (!interactive || confirm())
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
403 remove_start_menu();
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
404 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
405 #endif
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
406
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
407 printf("\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
408 found = remove_batfiles(0);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
409 if (found > 0)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
410 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
411 if (interactive)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
412 printf("\nRemove %s (y/n)? ", found > 1 ? "them" : "it");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
413 if (!interactive || confirm())
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
414 remove_batfiles(1);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
415 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
416
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
417 fd = fopen("gvim.exe", "r");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
418 if (fd != NULL)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
419 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
420 fclose(fd);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
421 printf("gvim.exe detected. Attempting to unregister gvim with OLE\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
422 system("gvim.exe -silent -unregister");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
423 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
424
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
425 delete_uninstall_key();
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
426
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
427 if (interactive)
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
428 {
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
429 printf("\nYou may now want to delete the Vim executables and runtime files.\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
430 printf("(They are still where you unpacked them.)\n");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
431 }
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
432
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
433 rewind(stdin);
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
434 printf("\nPress Enter to exit...");
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
435 (void)getchar();
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
436
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
437 return 0;
76efa0be13f1 Initial revision
atsuki
parents:
diff changeset
438 }