Do not mark product names as translatable
[wmaker-crm.git] / util / wmgenmenu.c
blobb7793cfd88a10080b52ad2b619cbf044cdb41c46
1 /* Copyright (C) 2010 Carlos R. Mafra */
3 #ifdef __GLIBC__
4 #define _GNU_SOURCE /* getopt_long */
5 #endif
7 #include <getopt.h>
8 #include <limits.h>
9 #include <locale.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
14 #include <WINGs/WUtil.h>
16 #include "../src/wconfig.h"
18 #define MAX_NR_APPS 50 /* Maximum number of entries in each apps list */
19 #define MAX_WMS 10 /* Maximum number of other window managers to check */
21 #include "wmgenmenu.h"
23 static void find_and_write(char *group, char *list[][2], int this_is_terminals);
24 static void other_window_managers(void);
25 static void print_help(int print_usage, int exitval);
27 extern char *__progname;
29 char *path, *terminal = NULL;
31 WMPropList *RMenu, *L1Menu, *L2Menu, *L3Menu, *L4Menu;
33 int main(int argc, char *argv[])
35 char *t;
36 int ch;
38 struct option longopts[] = {
39 { "version", no_argument, NULL, 'v' },
40 { "help", no_argument, NULL, 'h' },
41 { NULL, 0, NULL, 0 }
44 while ((ch = getopt_long(argc, argv, "hv", longopts, NULL)) != -1)
45 switch (ch) {
46 case 'v':
47 printf("%s (Window Maker %s)\n", __progname, VERSION);
48 return 0;
49 /* NOTREACHED */
50 case 'h':
51 print_help(1, 0);
52 /* NOTREACHED */
53 default:
54 print_help(0, 1);
55 /* NOTREACHED */
58 argc -= optind;
59 argv += optind;
61 if (argc != 0)
62 print_help(0, 1);
64 path = getenv("PATH");
65 setlocale(LC_ALL, "");
67 #if HAVE_LIBINTL_H && I18N
68 if (getenv("NLSPATH"))
69 bindtextdomain("wmgenmenu", getenv("NLSPATH"));
70 else
71 bindtextdomain("wmgenmenu", LOCALEDIR);
73 bind_textdomain_codeset("wmgenmenu", "UTF-8");
74 textdomain("wmgenmenu");
75 #endif
78 * The menu generated is a five-level hierarchy, of which the
79 * top level (RMenu) is only used to hold the others (a single
80 * PLString, which will be the title of the root menu)
82 * RMenu Window Maker
83 * L1Menu Applications
84 * L2Menu Terminals
85 * L3Menu XTerm
86 * L3Menu RXVT
87 * L2Menu Internet
88 * L3Menu Firefox
89 * L2Menu E-mail
90 * L1Menu Appearance
91 * L2Menu Themes
92 * L2Menu Background
93 * L3Menu Solid
94 * L4Menu Indigo
95 * L1Menu Configure Window Maker
99 /* Root */
100 RMenu = WMCreatePLArray(WMCreatePLString("Window Maker"), NULL);
102 /* Root -> Applications */
103 L1Menu = WMCreatePLArray(WMCreatePLString(_("Applications")), NULL);
105 /* Root -> Applications -> <category> */
106 find_and_write(_("Terminals"), Terminals, 1); /* always keep terminals the top item */
107 find_and_write(_("Internet"), Internet, 0);
108 find_and_write(_("Email"), Email, 0);
109 find_and_write(_("Mathematics"), Mathematics, 0);
110 find_and_write(_("File Managers"), File_managers, 0);
111 find_and_write(_("Graphics"), Graphics, 0);
112 find_and_write(_("Multimedia"), Multimedia, 0);
113 find_and_write(_("Editors"), Editors, 0);
114 find_and_write(_("Development"), Development, 0);
115 find_and_write("Window Maker", WindowMaker, 0);
116 find_and_write(_("Office"), Office, 0);
117 find_and_write(_("Astronomy"), Astronomy, 0);
118 find_and_write(_("Sound"), Sound, 0);
119 find_and_write(_("Comics"), Comics, 0);
120 find_and_write(_("Viewers"), Viewers, 0);
121 find_and_write(_("Utilities"), Utilities, 0);
122 find_and_write(_("System"), System, 0);
123 find_and_write(_("Video"), Video, 0);
124 find_and_write(_("Chat and Talk"), Chat, 0);
125 find_and_write(_("P2P Network"), P2P, 0);
126 find_and_write(_("Games"), Games, 0);
127 find_and_write("OpenSUSE", OpenSUSE, 0);
128 find_and_write("Mandriva", Mandriva, 0);
130 WMAddToPLArray(RMenu, L1Menu);
132 /* Root -> `Run' dialog */
133 L1Menu = WMCreatePLArray(
134 WMCreatePLString(_("Run...")),
135 WMCreatePLString("SHEXEC"),
136 WMCreatePLString(_("%A(Run, Type command:)")),
137 NULL
139 WMAddToPLArray(RMenu, L1Menu);
141 /* Root -> Appearance */
142 L1Menu = WMCreatePLArray(WMCreatePLString(_("Appearance")), NULL);
144 /* Root -> Appearance -> Themes */
145 L2Menu = WMCreatePLArray(
146 WMCreatePLString(_("Themes")),
147 WMCreatePLString("OPEN_MENU"),
148 WMCreatePLString("-noext /usr/local/share/WindowMaker/Themes $HOME/GNUstep/Library/WindowMaker/Themes WITH setstyle"),
149 NULL
151 WMAddToPLArray(L1Menu, L2Menu);
153 /* Root -> Appearance -> Styles */
154 L2Menu = WMCreatePLArray(
155 WMCreatePLString(_("Styles")),
156 WMCreatePLString("OPEN_MENU"),
157 WMCreatePLString("-noext /usr/local/share/WindowMaker/Styles $HOME/GNUstep/Library/WindowMaker/Styles WITH setstyle"),
158 NULL
160 WMAddToPLArray(L1Menu, L2Menu);
162 /* Root -> Appearance -> Icon Sets */
163 L2Menu = WMCreatePLArray(
164 WMCreatePLString(_("Icon Sets")),
165 WMCreatePLString("OPEN_MENU"),
166 WMCreatePLString("-noext /usr/local/share/WindowMaker/IconSets $HOME/GNUstep/Library/WindowMaker/IconSets WITH seticons"),
167 NULL
169 WMAddToPLArray(L1Menu, L2Menu);
171 /* Root -> Appearance -> Background */
172 L2Menu = WMCreatePLArray(WMCreatePLString(_("Background")), NULL);
174 /* Root -> Appearance -> Background -> Solid */
175 L3Menu = WMCreatePLArray(WMCreatePLString(_("Solid")), NULL);
177 #define SOLID_BACK(label, colorspec) \
178 L4Menu = WMCreatePLArray( \
179 WMCreatePLString(label), \
180 WMCreatePLString("EXEC"), \
181 WMCreatePLString("wdwrite WindowMaker WorkspaceBack '(solid, \"" colorspec "\")'"), \
182 NULL \
183 ); \
184 WMAddToPLArray(L3Menu, L4Menu)
186 /* Root -> Appearance -> Background -> Solid -> <color> */
187 SOLID_BACK(_("Black"), "black");
188 SOLID_BACK(_("Blue"), "#505075");
189 SOLID_BACK(_("Indigo"), "#243e6c");
190 SOLID_BACK(_("Bluemarine"), "#243e6c");
191 SOLID_BACK(_("Purple"), "#554466");
192 SOLID_BACK(_("Wheat"), "wheat4");
193 SOLID_BACK(_("Dark Gray"), "#333340");
194 SOLID_BACK(_("Wine"), "#400020");
195 #undef SOLID_BACK
196 WMAddToPLArray(L2Menu, L3Menu);
198 /* Root -> Appearance -> Background -> Gradient */
199 L3Menu = WMCreatePLArray(WMCreatePLString(_("Gradient")), NULL);
201 #define GRADIENT_BACK(label, fcolorspec, tcolorspec) \
202 L4Menu = WMCreatePLArray( \
203 WMCreatePLString(label), \
204 WMCreatePLString("EXEC"), \
205 WMCreatePLString("wdwrite WindowMaker WorkspaceBack '(vgradient, \"" \
206 fcolorspec "\", \"" tcolorspec "\"'"), \
207 NULL \
208 ); \
209 WMAddToPLArray(L3Menu, L4Menu)
211 /* Root -> Appearance -> Background -> Gradient -> <color> */
212 L4Menu = WMCreatePLArray(
213 WMCreatePLString(_("Sunset")),
214 WMCreatePLString("EXEC"),
215 WMCreatePLString("wdwrite WindowMaker WorkspaceBack "
216 "'(mvgradient, deepskyblue4, black, deepskyblue4, tomato4)'"),
217 NULL
219 WMAddToPLArray(L3Menu, L4Menu);
220 GRADIENT_BACK(_("Sky"), "blue4", "white");
221 GRADIENT_BACK(_("Blue Shades"), "#7080a5", "#101020");
222 GRADIENT_BACK(_("Indigo Shades"), "#746ebc", "#242e4c");
223 GRADIENT_BACK(_("Purple Shades"), "#654c66", "#151426");
224 GRADIENT_BACK(_("Wheat Shades"), "#a09060", "#302010");
225 GRADIENT_BACK(_("Grey Shades"), "#636380", "#131318");
226 GRADIENT_BACK(_("Wine Shades"), "#600040", "#180010");
227 #undef GRADIENT_BACK
228 WMAddToPLArray(L2Menu, L3Menu);
230 /* Root -> Appearance -> Background -> Images */
231 L3Menu = WMCreatePLArray(
232 WMCreatePLString(_("Images")),
233 WMCreatePLString("OPEN_MENU"),
234 WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t"),
235 NULL
237 WMAddToPLArray(L2Menu, L3Menu);
239 WMAddToPLArray(L1Menu, L2Menu);
241 /* Root -> Appearance -> Save Theme */
242 L2Menu = WMCreatePLArray(
243 WMCreatePLString(_("Save Theme")),
244 WMCreatePLString("SHEXEC"),
245 WMCreatePLString("getstyle -t $HOME/GNUstep/Library/WindowMaker/Themes/"
246 "\"%a(Theme name, Name to save theme as)\""),
247 NULL
249 WMAddToPLArray(L1Menu, L2Menu);
251 /* Root -> Appearance -> Save IconSet */
252 L2Menu = WMCreatePLArray(
253 WMCreatePLString(_("Save IconSet")),
254 WMCreatePLString("SHEXEC"),
255 WMCreatePLString("geticonset $HOME/GNUstep/Library/WindowMaker/IconSets/"
256 "\"%a(IconSet name,Name to save icon set as)\""),
257 NULL
259 WMAddToPLArray(L1Menu, L2Menu);
260 WMAddToPLArray(RMenu, L1Menu);
262 /* Root -> Workspaces */
263 L1Menu = WMCreatePLArray(
264 WMCreatePLString(_("Workspaces")),
265 WMCreatePLString("WORKSPACE_MENU"),
266 NULL
268 WMAddToPLArray(RMenu, L1Menu);
270 /* Root -> Workspace */
271 L1Menu = WMCreatePLArray(WMCreatePLString(_("Workspace")), NULL);
272 L2Menu = WMCreatePLArray(
273 WMCreatePLString(_("Hide Others")),
274 WMCreatePLString("HIDE_OTHERS"),
275 NULL
277 WMAddToPLArray(L1Menu, L2Menu);
279 /* Root -> Workspace -> Show All */
280 L2Menu = WMCreatePLArray(
281 WMCreatePLString(_("Show All")),
282 WMCreatePLString("SHOW_ALL"),
283 NULL
285 WMAddToPLArray(L1Menu, L2Menu);
287 /* Root -> Workspace -> Arrange Icons */
288 L2Menu = WMCreatePLArray(
289 WMCreatePLString(_("Arrange Icons")),
290 WMCreatePLString("ARRANGE_ICONS"),
291 NULL
293 WMAddToPLArray(L1Menu, L2Menu);
295 /* Root -> Workspace -> Refresh */
296 L2Menu = WMCreatePLArray(
297 WMCreatePLString(_("Refresh")),
298 WMCreatePLString("REFRESH"),
299 NULL
301 WMAddToPLArray(L1Menu, L2Menu);
303 /* Root -> Workspace -> Save Session */
304 L2Menu = WMCreatePLArray(
305 WMCreatePLString(_("Save Session")),
306 WMCreatePLString("SAVE_SESSION"),
307 NULL
309 WMAddToPLArray(L1Menu, L2Menu);
311 /* Root -> Workspace -> Clear Session */
312 L2Menu = WMCreatePLArray(
313 WMCreatePLString(_("Clear Session")),
314 WMCreatePLString("CLEAR_SESSION"),
315 NULL
317 WMAddToPLArray(L1Menu, L2Menu);
318 WMAddToPLArray(RMenu, L1Menu);
320 /* Root -> Configure Window Maker */
321 L1Menu = WMCreatePLArray(
322 WMCreatePLString(_("Configure Window Maker")),
323 WMCreatePLString("EXEC"),
324 WMCreatePLString("WPrefs"),
325 NULL
327 WMAddToPLArray(RMenu, L1Menu);
329 /* Root -> Info Panel */
330 L1Menu = WMCreatePLArray(
331 WMCreatePLString(_("Info Panel")),
332 WMCreatePLString("INFO_PANEL"),
333 NULL
335 WMAddToPLArray(RMenu, L1Menu);
337 /* Root -> Restart Window Maker */
338 L1Menu = WMCreatePLArray(
339 WMCreatePLString(_("Restart Window Maker")),
340 WMCreatePLString("RESTART"),
341 NULL
343 WMAddToPLArray(RMenu, L1Menu);
345 /* Root -> Other Window Managers [-> <other window manager> ...] */
346 other_window_managers();
348 /* Root -> Lock Screen */
349 t = wfindfile(path, "xlock");
350 if (t) {
351 L1Menu = WMCreatePLArray(
352 WMCreatePLString(_("Lock Screen")),
353 WMCreatePLString("EXEC"),
354 WMCreatePLString("xlock -allowroot -usefirst -mode matrix"),
355 NULL
357 WMAddToPLArray(RMenu, L1Menu);
358 wfree(t);
361 /* Root -> Exit Window Maker */
362 L1Menu = WMCreatePLArray(
363 WMCreatePLString(_("Exit Window Maker")),
364 WMCreatePLString("EXIT"),
365 NULL
367 WMAddToPLArray(RMenu, L1Menu);
369 printf("%s", WMGetPropListDescription(RMenu, True));
370 puts("");
372 return 0;
376 * Creates an L2Menu made of L3Menu items
377 * Attaches to L1Menu
378 * - make sure previous menus of these levels are
379 * attached to their parent before calling
381 static void find_and_write(char *group, char *list[][2], int this_is_terminals)
383 int i, argc;
384 char *t, **argv, buf[PATH_MAX];
386 /* or else pre-existing menus of these levels
387 * will badly disturb empty group detection */
388 L2Menu = NULL;
389 L3Menu = NULL;
391 i = 0;
392 while (list[i][0]) {
393 /* Before checking if app exists, split its options */
394 wtokensplit(list[i][1], &argv, &argc);
395 t = wfindfile(path, argv[0]);
396 if (t) {
397 /* find a terminal to be used for cmnds that need a terminal */
398 if (this_is_terminals && !terminal)
399 terminal = wstrdup(list[i][1]);
400 if (*(argv[argc-1]) != '!') {
401 L3Menu = WMCreatePLArray(
402 WMCreatePLString(_(list[i][0])),
403 WMCreatePLString("EXEC"),
404 WMCreatePLString(list[i][1]),
405 NULL
407 } else {
408 char comm[PATH_MAX], *ptr;
410 strcpy(comm, list[i][1]);
411 /* delete character " !" from the command */
412 ptr = strchr(comm, '!');
413 while (ptr >= comm && (*ptr == '!' || isspace(*ptr)))
414 *ptr-- = '\0';
415 snprintf(buf, sizeof(buf), "%s -e %s", terminal ? terminal : "xterm" , comm);
416 /* Root -> Applications -> <category> -> <application> */
417 L3Menu = WMCreatePLArray(
418 WMCreatePLString(_(list[i][0])),
419 WMCreatePLString("EXEC"),
420 WMCreatePLString(buf),
421 NULL
424 if (!L2Menu)
425 L2Menu = WMCreatePLArray(
426 WMCreatePLString(group),
427 NULL
429 WMAddToPLArray(L2Menu, L3Menu);
430 wfree(t);
432 i++;
434 if (L2Menu)
435 WMAddToPLArray(L1Menu, L2Menu);
439 * Creates an L1Menu made of L2Menu items
440 * - make sure previous menus of these levels are
441 * attached to their parent before calling
442 * Attaches to RMenu
444 static void other_window_managers(void)
446 int i;
447 char *t, buf[PATH_MAX];
449 /* or else pre-existing menus of these levels
450 * will badly disturb empty group detection */
451 L1Menu = NULL;
452 L2Menu = NULL;
454 i = 0;
455 while (other_wm[i][0]) {
456 t = wfindfile(path, other_wm[i][1]);
457 if (t) {
458 snprintf(buf, sizeof(buf), _("Start %s"), _(other_wm[i][0]));
459 /* Root -> Other Window Managers -> <other window manager> */
460 L2Menu = WMCreatePLArray(
461 WMCreatePLString(buf),
462 WMCreatePLString("RESTART"),
463 WMCreatePLString(other_wm[i][1]),
464 NULL
466 if (!L1Menu)
467 L1Menu = WMCreatePLArray(
468 WMCreatePLString(_("Other Window Managers")),
469 NULL
471 WMAddToPLArray(L1Menu, L2Menu);
472 wfree(t);
474 i++;
476 if (L1Menu)
477 WMAddToPLArray(RMenu, L1Menu);
480 void print_help(int print_usage, int exitval)
482 printf("Usage: %s [-h] [-v]\n", __progname);
483 if (print_usage) {
484 puts("Writes a menu structure usable as ~/GNUstep/Defaults/WMRootMenu to stdout");
485 puts("");
486 puts(" -h, --help display this help and exit");
487 puts(" -v, --version output version information and exit");
489 exit(exitval);