Amend recent wmgenmenu changes
[wmaker-crm.git] / util / wmgenmenu.c
blobf934b38a229b6a6257ed9c9df88b98f76f16fd08
1 /* Copyright (C) 2010 Carlos R. Mafra */
3 #ifdef __GLIBC__
4 #define _GNU_SOURCE /* getopt_long */
5 #endif
7 #include <ctype.h>
8 #include <getopt.h>
9 #include <limits.h>
10 #include <locale.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
15 #include <WINGs/WUtil.h>
17 #include "../src/wconfig.h"
19 #define MAX_NR_APPS 128 /* Maximum number of entries in each apps list */
20 #define MAX_WMS 10 /* Maximum number of other window managers to check */
22 #include "wmgenmenu.h"
24 static void find_and_write(char *group, char *list[][2], int this_is_terminals);
25 static void other_window_managers(void);
26 static void print_help(int print_usage, int exitval);
28 extern char *__progname;
30 char *path, *terminal = NULL;
32 WMPropList *RMenu, *L1Menu, *L2Menu, *L3Menu, *L4Menu;
34 int main(int argc, char *argv[])
36 char *t;
37 int ch;
39 struct option longopts[] = {
40 { "version", no_argument, NULL, 'v' },
41 { "help", no_argument, NULL, 'h' },
42 { NULL, 0, NULL, 0 }
45 while ((ch = getopt_long(argc, argv, "hv", longopts, NULL)) != -1)
46 switch (ch) {
47 case 'v':
48 printf("%s (Window Maker %s)\n", __progname, VERSION);
49 return 0;
50 /* NOTREACHED */
51 case 'h':
52 print_help(1, 0);
53 /* NOTREACHED */
54 default:
55 print_help(0, 1);
56 /* NOTREACHED */
59 argc -= optind;
60 argv += optind;
62 if (argc != 0)
63 print_help(0, 1);
65 path = getenv("PATH");
66 setlocale(LC_ALL, "");
68 #if HAVE_LIBINTL_H && I18N
69 if (getenv("NLSPATH"))
70 bindtextdomain("wmgenmenu", getenv("NLSPATH"));
71 else
72 bindtextdomain("wmgenmenu", LOCALEDIR);
74 bind_textdomain_codeset("wmgenmenu", "UTF-8");
75 textdomain("wmgenmenu");
76 #endif
79 * The menu generated is a five-level hierarchy, of which the
80 * top level (RMenu) is only used to hold the others (a single
81 * PLString, which will be the title of the root menu)
83 * RMenu Window Maker
84 * L1Menu Applications
85 * L2Menu Terminals
86 * L3Menu XTerm
87 * L3Menu RXVT
88 * L2Menu Internet
89 * L3Menu Firefox
90 * L2Menu E-mail
91 * L1Menu Appearance
92 * L2Menu Themes
93 * L2Menu Background
94 * L3Menu Solid
95 * L4Menu Indigo
96 * L1Menu Configure Window Maker
100 /* Root */
101 RMenu = WMCreatePLArray(WMCreatePLString("Window Maker"), NULL);
103 /* Root -> Applications */
104 L1Menu = WMCreatePLArray(WMCreatePLString(_("Applications")), NULL);
106 /* Root -> Applications -> <category> */
107 find_and_write(_("Terminals"), Terminals, 1); /* always keep terminals the top item */
108 find_and_write(_("Internet"), Internet, 0);
109 find_and_write(_("Email"), Email, 0);
110 find_and_write(_("Mathematics"), Mathematics, 0);
111 find_and_write(_("File Managers"), File_managers, 0);
112 find_and_write(_("Graphics"), Graphics, 0);
113 find_and_write(_("Multimedia"), Multimedia, 0);
114 find_and_write(_("Editors"), Editors, 0);
115 find_and_write(_("Development"), Development, 0);
116 find_and_write("Window Maker", WindowMaker, 0);
117 find_and_write(_("Office"), Office, 0);
118 find_and_write(_("Astronomy"), Astronomy, 0);
119 find_and_write(_("Sound"), Sound, 0);
120 find_and_write(_("Comics"), Comics, 0);
121 find_and_write(_("Viewers"), Viewers, 0);
122 find_and_write(_("Utilities"), Utilities, 0);
123 find_and_write(_("System"), System, 0);
124 find_and_write(_("Video"), Video, 0);
125 find_and_write(_("Chat and Talk"), Chat, 0);
126 find_and_write(_("P2P Network"), P2P, 0);
127 find_and_write(_("Games"), Games, 0);
128 find_and_write("OpenSUSE", OpenSUSE, 0);
129 find_and_write("Mandriva", Mandriva, 0);
131 WMAddToPLArray(RMenu, L1Menu);
133 /* Root -> `Run' dialog */
134 L1Menu = WMCreatePLArray(
135 WMCreatePLString(_("Run...")),
136 WMCreatePLString("SHEXEC"),
137 WMCreatePLString(_("%A(Run, Type command:)")),
138 NULL
140 WMAddToPLArray(RMenu, L1Menu);
142 /* Root -> Appearance */
143 L1Menu = WMCreatePLArray(WMCreatePLString(_("Appearance")), NULL);
145 /* Root -> Appearance -> Themes */
146 L2Menu = WMCreatePLArray(
147 WMCreatePLString(_("Themes")),
148 WMCreatePLString("OPEN_MENU"),
149 WMCreatePLString("-noext /usr/local/share/WindowMaker/Themes $HOME/GNUstep/Library/WindowMaker/Themes WITH setstyle"),
150 NULL
152 WMAddToPLArray(L1Menu, L2Menu);
154 /* Root -> Appearance -> Styles */
155 L2Menu = WMCreatePLArray(
156 WMCreatePLString(_("Styles")),
157 WMCreatePLString("OPEN_MENU"),
158 WMCreatePLString("-noext /usr/local/share/WindowMaker/Styles $HOME/GNUstep/Library/WindowMaker/Styles WITH setstyle"),
159 NULL
161 WMAddToPLArray(L1Menu, L2Menu);
163 /* Root -> Appearance -> Icon Sets */
164 L2Menu = WMCreatePLArray(
165 WMCreatePLString(_("Icon Sets")),
166 WMCreatePLString("OPEN_MENU"),
167 WMCreatePLString("-noext /usr/local/share/WindowMaker/IconSets $HOME/GNUstep/Library/WindowMaker/IconSets WITH seticons"),
168 NULL
170 WMAddToPLArray(L1Menu, L2Menu);
172 /* Root -> Appearance -> Background */
173 L2Menu = WMCreatePLArray(WMCreatePLString(_("Background")), NULL);
175 /* Root -> Appearance -> Background -> Solid */
176 L3Menu = WMCreatePLArray(WMCreatePLString(_("Solid")), NULL);
178 #define SOLID_BACK(label, colorspec) \
179 L4Menu = WMCreatePLArray( \
180 WMCreatePLString(label), \
181 WMCreatePLString("EXEC"), \
182 WMCreatePLString("wdwrite WindowMaker WorkspaceBack '(solid, \"" colorspec "\")'"), \
183 NULL \
184 ); \
185 WMAddToPLArray(L3Menu, L4Menu)
187 /* Root -> Appearance -> Background -> Solid -> <color> */
188 SOLID_BACK(_("Black"), "black");
189 SOLID_BACK(_("Blue"), "#505075");
190 SOLID_BACK(_("Indigo"), "#243e6c");
191 SOLID_BACK(_("Bluemarine"), "#243e6c");
192 SOLID_BACK(_("Purple"), "#554466");
193 SOLID_BACK(_("Wheat"), "wheat4");
194 SOLID_BACK(_("Dark Gray"), "#333340");
195 SOLID_BACK(_("Wine"), "#400020");
196 #undef SOLID_BACK
197 WMAddToPLArray(L2Menu, L3Menu);
199 /* Root -> Appearance -> Background -> Gradient */
200 L3Menu = WMCreatePLArray(WMCreatePLString(_("Gradient")), NULL);
202 #define GRADIENT_BACK(label, fcolorspec, tcolorspec) \
203 L4Menu = WMCreatePLArray( \
204 WMCreatePLString(label), \
205 WMCreatePLString("EXEC"), \
206 WMCreatePLString("wdwrite WindowMaker WorkspaceBack '(vgradient, \"" \
207 fcolorspec "\", \"" tcolorspec "\"'"), \
208 NULL \
209 ); \
210 WMAddToPLArray(L3Menu, L4Menu)
212 /* Root -> Appearance -> Background -> Gradient -> <color> */
213 L4Menu = WMCreatePLArray(
214 WMCreatePLString(_("Sunset")),
215 WMCreatePLString("EXEC"),
216 WMCreatePLString("wdwrite WindowMaker WorkspaceBack "
217 "'(mvgradient, deepskyblue4, black, deepskyblue4, tomato4)'"),
218 NULL
220 WMAddToPLArray(L3Menu, L4Menu);
221 GRADIENT_BACK(_("Sky"), "blue4", "white");
222 GRADIENT_BACK(_("Blue Shades"), "#7080a5", "#101020");
223 GRADIENT_BACK(_("Indigo Shades"), "#746ebc", "#242e4c");
224 GRADIENT_BACK(_("Purple Shades"), "#654c66", "#151426");
225 GRADIENT_BACK(_("Wheat Shades"), "#a09060", "#302010");
226 GRADIENT_BACK(_("Grey Shades"), "#636380", "#131318");
227 GRADIENT_BACK(_("Wine Shades"), "#600040", "#180010");
228 #undef GRADIENT_BACK
229 WMAddToPLArray(L2Menu, L3Menu);
231 /* Root -> Appearance -> Background -> Images */
232 L3Menu = WMCreatePLArray(
233 WMCreatePLString(_("Images")),
234 WMCreatePLString("OPEN_MENU"),
235 WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t"),
236 NULL
238 WMAddToPLArray(L2Menu, L3Menu);
240 WMAddToPLArray(L1Menu, L2Menu);
242 /* Root -> Appearance -> Save Theme */
243 L2Menu = WMCreatePLArray(
244 WMCreatePLString(_("Save Theme")),
245 WMCreatePLString("SHEXEC"),
246 WMCreatePLString("getstyle -t $HOME/GNUstep/Library/WindowMaker/Themes/"
247 "\"%a(Theme name, Name to save theme as)\""),
248 NULL
250 WMAddToPLArray(L1Menu, L2Menu);
252 /* Root -> Appearance -> Save IconSet */
253 L2Menu = WMCreatePLArray(
254 WMCreatePLString(_("Save IconSet")),
255 WMCreatePLString("SHEXEC"),
256 WMCreatePLString("geticonset $HOME/GNUstep/Library/WindowMaker/IconSets/"
257 "\"%a(IconSet name,Name to save icon set as)\""),
258 NULL
260 WMAddToPLArray(L1Menu, L2Menu);
261 WMAddToPLArray(RMenu, L1Menu);
263 /* Root -> Workspaces */
264 L1Menu = WMCreatePLArray(
265 WMCreatePLString(_("Workspaces")),
266 WMCreatePLString("WORKSPACE_MENU"),
267 NULL
269 WMAddToPLArray(RMenu, L1Menu);
271 /* Root -> Workspace */
272 L1Menu = WMCreatePLArray(WMCreatePLString(_("Workspace")), NULL);
273 L2Menu = WMCreatePLArray(
274 WMCreatePLString(_("Hide Others")),
275 WMCreatePLString("HIDE_OTHERS"),
276 NULL
278 WMAddToPLArray(L1Menu, L2Menu);
280 /* Root -> Workspace -> Show All */
281 L2Menu = WMCreatePLArray(
282 WMCreatePLString(_("Show All")),
283 WMCreatePLString("SHOW_ALL"),
284 NULL
286 WMAddToPLArray(L1Menu, L2Menu);
288 /* Root -> Workspace -> Arrange Icons */
289 L2Menu = WMCreatePLArray(
290 WMCreatePLString(_("Arrange Icons")),
291 WMCreatePLString("ARRANGE_ICONS"),
292 NULL
294 WMAddToPLArray(L1Menu, L2Menu);
296 /* Root -> Workspace -> Refresh */
297 L2Menu = WMCreatePLArray(
298 WMCreatePLString(_("Refresh")),
299 WMCreatePLString("REFRESH"),
300 NULL
302 WMAddToPLArray(L1Menu, L2Menu);
304 /* Root -> Workspace -> Save Session */
305 L2Menu = WMCreatePLArray(
306 WMCreatePLString(_("Save Session")),
307 WMCreatePLString("SAVE_SESSION"),
308 NULL
310 WMAddToPLArray(L1Menu, L2Menu);
312 /* Root -> Workspace -> Clear Session */
313 L2Menu = WMCreatePLArray(
314 WMCreatePLString(_("Clear Session")),
315 WMCreatePLString("CLEAR_SESSION"),
316 NULL
318 WMAddToPLArray(L1Menu, L2Menu);
319 WMAddToPLArray(RMenu, L1Menu);
321 /* Root -> Configure Window Maker */
322 L1Menu = WMCreatePLArray(
323 WMCreatePLString(_("Configure Window Maker")),
324 WMCreatePLString("EXEC"),
325 WMCreatePLString("WPrefs"),
326 NULL
328 WMAddToPLArray(RMenu, L1Menu);
330 /* Root -> Info Panel */
331 L1Menu = WMCreatePLArray(
332 WMCreatePLString(_("Info Panel")),
333 WMCreatePLString("INFO_PANEL"),
334 NULL
336 WMAddToPLArray(RMenu, L1Menu);
338 /* Root -> Restart Window Maker */
339 L1Menu = WMCreatePLArray(
340 WMCreatePLString(_("Restart Window Maker")),
341 WMCreatePLString("RESTART"),
342 NULL
344 WMAddToPLArray(RMenu, L1Menu);
346 /* Root -> Other Window Managers [-> <other window manager> ...] */
347 other_window_managers();
349 /* Root -> Lock Screen */
350 t = wfindfile(path, "xlock");
351 if (t) {
352 L1Menu = WMCreatePLArray(
353 WMCreatePLString(_("Lock Screen")),
354 WMCreatePLString("EXEC"),
355 WMCreatePLString("xlock -allowroot -usefirst -mode matrix"),
356 NULL
358 WMAddToPLArray(RMenu, L1Menu);
359 wfree(t);
362 /* Root -> Exit Window Maker */
363 L1Menu = WMCreatePLArray(
364 WMCreatePLString(_("Exit Window Maker")),
365 WMCreatePLString("EXIT"),
366 NULL
368 WMAddToPLArray(RMenu, L1Menu);
370 printf("%s", WMGetPropListDescription(RMenu, True));
371 puts("");
373 return 0;
377 * Creates an L2Menu made of L3Menu items
378 * Attaches to L1Menu
379 * - make sure previous menus of these levels are
380 * attached to their parent before calling
382 static void find_and_write(char *group, char *list[][2], int this_is_terminals)
384 int i, argc;
385 char *t, **argv, buf[PATH_MAX];
387 /* or else pre-existing menus of these levels
388 * will badly disturb empty group detection */
389 L2Menu = NULL;
390 L3Menu = NULL;
392 i = 0;
393 while (list[i][0]) {
394 /* Before checking if app exists, split its options */
395 wtokensplit(list[i][1], &argv, &argc);
396 t = wfindfile(path, argv[0]);
397 if (t) {
398 /* find a terminal to be used for cmnds that need a terminal */
399 if (this_is_terminals && !terminal)
400 terminal = wstrdup(list[i][1]);
401 if (*(argv[argc-1]) != '!') {
402 L3Menu = WMCreatePLArray(
403 WMCreatePLString(_(list[i][0])),
404 WMCreatePLString("EXEC"),
405 WMCreatePLString(list[i][1]),
406 NULL
408 } else {
409 char comm[PATH_MAX], *ptr;
411 strcpy(comm, list[i][1]);
412 /* delete character " !" from the command */
413 ptr = strchr(comm, '!');
414 while (ptr >= comm && (*ptr == '!' || isspace(*ptr)))
415 *ptr-- = '\0';
416 snprintf(buf, sizeof(buf), "%s -e %s", terminal ? terminal : "xterm" , comm);
417 /* Root -> Applications -> <category> -> <application> */
418 L3Menu = WMCreatePLArray(
419 WMCreatePLString(_(list[i][0])),
420 WMCreatePLString("EXEC"),
421 WMCreatePLString(buf),
422 NULL
425 if (!L2Menu)
426 L2Menu = WMCreatePLArray(
427 WMCreatePLString(group),
428 NULL
430 WMAddToPLArray(L2Menu, L3Menu);
431 wfree(t);
433 i++;
435 if (L2Menu)
436 WMAddToPLArray(L1Menu, L2Menu);
440 * Creates an L1Menu made of L2Menu items
441 * - make sure previous menus of these levels are
442 * attached to their parent before calling
443 * Attaches to RMenu
445 static void other_window_managers(void)
447 int i;
448 char *t, buf[PATH_MAX];
450 /* or else pre-existing menus of these levels
451 * will badly disturb empty group detection */
452 L1Menu = NULL;
453 L2Menu = NULL;
455 i = 0;
456 while (other_wm[i][0]) {
457 t = wfindfile(path, other_wm[i][1]);
458 if (t) {
459 snprintf(buf, sizeof(buf), _("Start %s"), _(other_wm[i][0]));
460 /* Root -> Other Window Managers -> <other window manager> */
461 L2Menu = WMCreatePLArray(
462 WMCreatePLString(buf),
463 WMCreatePLString("RESTART"),
464 WMCreatePLString(other_wm[i][1]),
465 NULL
467 if (!L1Menu)
468 L1Menu = WMCreatePLArray(
469 WMCreatePLString(_("Other Window Managers")),
470 NULL
472 WMAddToPLArray(L1Menu, L2Menu);
473 wfree(t);
475 i++;
477 if (L1Menu)
478 WMAddToPLArray(RMenu, L1Menu);
481 void print_help(int print_usage, int exitval)
483 printf("Usage: %s [-h] [-v]\n", __progname);
484 if (print_usage) {
485 puts("Writes a menu structure usable as ~/GNUstep/Defaults/WMRootMenu to stdout");
486 puts("");
487 puts(" -h, --help display this help and exit");
488 puts(" -v, --version output version information and exit");
490 exit(exitval);