Add nice labels to wmgenmenu
[wmaker-crm.git] / util / wmgenmenu.c
blob2fef1c96919edecedbf39a3fed73602126869777
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;
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 four-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 * L1Menu Configure Window Maker
96 RMenu = WMCreatePLArray(WMCreatePLString(_("Window Maker")), NULL);
98 L1Menu = WMCreatePLArray(WMCreatePLString(_("Applications")), NULL);
100 /* Submenus in Applications */
101 find_and_write(_("Terminals"), Terminals, 1); /* always keep terminals the top item */
102 find_and_write(_("Internet"), Internet, 0);
103 find_and_write(_("Email"), Email, 0);
104 find_and_write(_("Mathematics"), Mathematics, 0);
105 find_and_write(_("File Managers"), File_managers, 0);
106 find_and_write(_("Graphics"), Graphics, 0);
107 find_and_write(_("Multimedia"), Multimedia, 0);
108 find_and_write(_("Editors"), Editors, 0);
109 find_and_write(_("Development"), Development, 0);
110 find_and_write(_("Window Maker"), WindowMaker, 0);
111 find_and_write(_("Office"), Office, 0);
112 find_and_write(_("Astronomy"), Astronomy, 0);
113 find_and_write(_("Sound"), Sound, 0);
114 find_and_write(_("Comics"), Comics, 0);
115 find_and_write(_("Viewers"), Viewers, 0);
116 find_and_write(_("Utilities"), Utilities, 0);
117 find_and_write(_("System"), System, 0);
118 find_and_write(_("Video"), Video, 0);
119 find_and_write(_("Chat and Talk"), Chat, 0);
120 find_and_write(_("P2P-Network"), P2P, 0);
121 find_and_write(_("Games"), Games, 0);
122 find_and_write(_("OpenSUSE"), OpenSUSE, 0);
123 find_and_write(_("Mandriva"), Mandriva, 0);
125 WMAddToPLArray(RMenu, L1Menu);
127 /* `Run' dialog */
128 L1Menu = WMCreatePLArray(
129 WMCreatePLString(_("Run...")),
130 WMCreatePLString("SHEXEC"),
131 WMCreatePLString(_("%A(Run, Type command:)")),
132 NULL
134 WMAddToPLArray(RMenu, L1Menu);
136 /* Appearance-related items */
137 L1Menu = WMCreatePLArray(WMCreatePLString(_("Appearance")), NULL);
138 L2Menu = WMCreatePLArray(
139 WMCreatePLString(_("Themes")),
140 WMCreatePLString("OPEN_MENU"),
141 WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/Themes WITH setstyle"),
142 NULL
144 WMAddToPLArray(L1Menu, L2Menu);
146 L2Menu = WMCreatePLArray(
147 WMCreatePLString(_("Icons")),
148 WMCreatePLString("OPEN_MENU"),
149 WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/IconSets WITH seticons"),
150 NULL
152 WMAddToPLArray(L1Menu, L2Menu);
154 L2Menu = WMCreatePLArray(
155 WMCreatePLString(_("Background")),
156 WMCreatePLString("OPEN_MENU"),
157 WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t"),
158 NULL
160 WMAddToPLArray(L1Menu, L2Menu);
162 L2Menu = WMCreatePLArray(
163 WMCreatePLString(_("Save Theme")),
164 WMCreatePLString("SHEXEC"),
165 WMCreatePLString("getstyle -t $HOME/GNUstep/Library/WindowMaker/Themes/"
166 "\"%a(Theme name, Name to save theme as)\""),
167 NULL
169 WMAddToPLArray(L1Menu, L2Menu);
171 L2Menu = WMCreatePLArray(
172 WMCreatePLString(_("Save Icons")),
173 WMCreatePLString("SHEXEC"),
174 WMCreatePLString("geticonset $HOME/GNUstep/Library/WindowMaker/IconSets/"
175 "\"%a(IconSet name,Name to save icon set as)\""),
176 NULL
178 WMAddToPLArray(L1Menu, L2Menu);
179 WMAddToPLArray(RMenu, L1Menu);
181 /* Workspace-related items */
182 L1Menu = WMCreatePLArray(
183 WMCreatePLString(_("Workspaces")),
184 WMCreatePLString("WORKSPACE_MENU"),
185 NULL
187 WMAddToPLArray(RMenu, L1Menu);
189 L1Menu = WMCreatePLArray(WMCreatePLString(_("Workspace")), NULL);
190 L2Menu = WMCreatePLArray(
191 WMCreatePLString(_("Hide Others")),
192 WMCreatePLString("HIDE_OTHERS"),
193 NULL
195 WMAddToPLArray(L1Menu, L2Menu);
197 L2Menu = WMCreatePLArray(
198 WMCreatePLString(_("Show All")),
199 WMCreatePLString("SHOW_ALL"),
200 NULL
202 WMAddToPLArray(L1Menu, L2Menu);
204 L2Menu = WMCreatePLArray(
205 WMCreatePLString(_("Arrange Icons")),
206 WMCreatePLString("ARRANGE_ICONS"),
207 NULL
209 WMAddToPLArray(L1Menu, L2Menu);
211 L2Menu = WMCreatePLArray(
212 WMCreatePLString(_("Refresh")),
213 WMCreatePLString("REFRESH"),
214 NULL
216 WMAddToPLArray(L1Menu, L2Menu);
218 L2Menu = WMCreatePLArray(
219 WMCreatePLString(_("Save Session")),
220 WMCreatePLString("SAVE_SESSION"),
221 NULL
223 WMAddToPLArray(L1Menu, L2Menu);
225 L2Menu = WMCreatePLArray(
226 WMCreatePLString(_("Clear Session")),
227 WMCreatePLString("CLEAR_SESSION"),
228 NULL
230 WMAddToPLArray(L1Menu, L2Menu);
231 WMAddToPLArray(RMenu, L1Menu);
233 /* Configuration-related items */
234 L1Menu = WMCreatePLArray(
235 WMCreatePLString(_("Configure Window Maker")),
236 WMCreatePLString("EXEC"),
237 WMCreatePLString("WPrefs"),
238 NULL
240 WMAddToPLArray(RMenu, L1Menu);
242 L1Menu = WMCreatePLArray(
243 WMCreatePLString(_("Info Panel")),
244 WMCreatePLString("INFO_PANEL"),
245 NULL
247 WMAddToPLArray(RMenu, L1Menu);
249 L1Menu = WMCreatePLArray(
250 WMCreatePLString(_("Restart Window Maker")),
251 WMCreatePLString("RESTART"),
252 NULL
254 WMAddToPLArray(RMenu, L1Menu);
256 /* Other window managers */
257 other_window_managers();
259 /* XLock */
260 t = wfindfile(path, "xlock");
261 if (t) {
262 L1Menu = WMCreatePLArray(
263 WMCreatePLString(_("Lock Screen")),
264 WMCreatePLString("EXEC"),
265 WMCreatePLString("xlock -allowroot -usefirst -mode matrix"),
266 NULL
268 WMAddToPLArray(RMenu, L1Menu);
269 wfree(t);
272 /* Exit */
273 L1Menu = WMCreatePLArray(
274 WMCreatePLString(_("Exit Window Maker")),
275 WMCreatePLString("EXIT"),
276 NULL
278 WMAddToPLArray(RMenu, L1Menu);
280 printf("%s", WMGetPropListDescription(RMenu, True));
281 puts("");
283 return 0;
287 * Creates an L2Menu made of L3Menu items
288 * Attaches to L1Menu
289 * - make sure previous menus of these levels are
290 * attached to their parent before calling
292 static void find_and_write(char *group, char *list[][2], int this_is_terminals)
294 int i, argc;
295 char *t, **argv, buf[PATH_MAX];
297 /* or else pre-existing menus of these levels
298 * will badly disturb empty group detection */
299 L2Menu = NULL;
300 L3Menu = NULL;
302 i = 0;
303 while (list[i][0]) {
304 /* Before checking if app exists, split its options */
305 wtokensplit(list[i][1], &argv, &argc);
306 t = wfindfile(path, argv[0]);
307 if (t) {
308 /* find a terminal to be used for cmnds that need a terminal */
309 if (this_is_terminals && !terminal)
310 terminal = wstrdup(list[i][0]);
311 if (*(argv[argc-1]) != '!') {
312 L3Menu = WMCreatePLArray(
313 WMCreatePLString(list[i][0]),
314 WMCreatePLString("EXEC"),
315 WMCreatePLString(list[i][1]),
316 NULL
318 } else {
319 char comm[PATH_MAX], *ptr;
321 strcpy(comm, list[i][1]);
322 /* delete character " !" from the command */
323 ptr = strchr(comm, '!');
324 while (ptr >= comm && (*ptr == '!' || isspace(*ptr)))
325 *ptr-- = '\0';
326 snprintf(buf, sizeof(buf), "%s -e %s", terminal ? terminal : "xterm" , comm);
327 L3Menu = WMCreatePLArray(
328 WMCreatePLString(list[i][0]),
329 WMCreatePLString("EXEC"),
330 WMCreatePLString(buf),
331 NULL
334 if (!L2Menu)
335 L2Menu = WMCreatePLArray(
336 WMCreatePLString(group),
337 NULL
339 WMAddToPLArray(L2Menu, L3Menu);
340 wfree(t);
342 i++;
344 if (L2Menu)
345 WMAddToPLArray(L1Menu, L2Menu);
349 * Creates an L1Menu made of L2Menu items
350 * - make sure previous menus of these levels are
351 * attached to their parent before calling
352 * Attaches to RMenu
354 static void other_window_managers(void)
356 int i;
357 char *t, buf[PATH_MAX];
359 /* or else pre-existing menus of these levels
360 * will badly disturb empty group detection */
361 L1Menu = NULL;
362 L2Menu = NULL;
364 i = 0;
365 while (other_wm[i][0]) {
366 t = wfindfile(path, other_wm[i][1]);
367 if (t) {
368 snprintf(buf, sizeof(buf), _("Start %s"), other_wm[i][0]);
369 L2Menu = WMCreatePLArray(
370 WMCreatePLString(buf),
371 WMCreatePLString("RESTART"),
372 WMCreatePLString(other_wm[i][1]),
373 NULL
375 if (!L1Menu)
376 L1Menu = WMCreatePLArray(
377 WMCreatePLString(_("Other Window Managers")),
378 NULL
380 WMAddToPLArray(L1Menu, L2Menu);
381 wfree(t);
383 i++;
385 if (L1Menu)
386 WMAddToPLArray(RMenu, L1Menu);
389 void print_help(int print_usage, int exitval)
391 printf("Usage: %s [-h] [-v]\n", __progname);
392 if (print_usage) {
393 puts("Writes a menu structure usable as ~/GNUstep/Defaults/WMRootMenu to stdout");
394 puts("");
395 puts(" -h, --help display this help and exit");
396 puts(" -v, --version output version information and exit");
398 exit(exitval);