1 /* Copyright (C) 2010 Carlos R. Mafra */
4 #define _GNU_SOURCE /* getopt_long */
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
[])
38 struct option longopts
[] = {
39 { "version", no_argument
, NULL
, 'v' },
40 { "help", no_argument
, NULL
, 'h' },
44 while ((ch
= getopt_long(argc
, argv
, "hv", longopts
, NULL
)) != -1)
47 printf("%s (Window Maker %s)\n", __progname
, VERSION
);
64 path
= getenv("PATH");
65 setlocale(LC_ALL
, "");
67 #if HAVE_LIBINTL_H && I18N
68 if (getenv("NLSPATH"))
69 bindtextdomain("wmgenmenu", getenv("NLSPATH"));
71 bindtextdomain("wmgenmenu", LOCALEDIR
);
73 bind_textdomain_codeset("wmgenmenu", "UTF-8");
74 textdomain("wmgenmenu");
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)
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
);
128 L1Menu
= WMCreatePLArray(
129 WMCreatePLString(_("Run...")),
130 WMCreatePLString("SHEXEC"),
131 WMCreatePLString(_("%A(Run, Type command:)")),
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"),
144 WMAddToPLArray(L1Menu
, L2Menu
);
146 L2Menu
= WMCreatePLArray(
147 WMCreatePLString(_("Icons")),
148 WMCreatePLString("OPEN_MENU"),
149 WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/IconSets WITH seticons"),
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"),
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)\""),
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)\""),
178 WMAddToPLArray(L1Menu
, L2Menu
);
179 WMAddToPLArray(RMenu
, L1Menu
);
181 /* Workspace-related items */
182 L1Menu
= WMCreatePLArray(
183 WMCreatePLString(_("Workspaces")),
184 WMCreatePLString("WORKSPACE_MENU"),
187 WMAddToPLArray(RMenu
, L1Menu
);
189 L1Menu
= WMCreatePLArray(WMCreatePLString(_("Workspace")), NULL
);
190 L2Menu
= WMCreatePLArray(
191 WMCreatePLString(_("Hide Others")),
192 WMCreatePLString("HIDE_OTHERS"),
195 WMAddToPLArray(L1Menu
, L2Menu
);
197 L2Menu
= WMCreatePLArray(
198 WMCreatePLString(_("Show All")),
199 WMCreatePLString("SHOW_ALL"),
202 WMAddToPLArray(L1Menu
, L2Menu
);
204 L2Menu
= WMCreatePLArray(
205 WMCreatePLString(_("Arrange Icons")),
206 WMCreatePLString("ARRANGE_ICONS"),
209 WMAddToPLArray(L1Menu
, L2Menu
);
211 L2Menu
= WMCreatePLArray(
212 WMCreatePLString(_("Refresh")),
213 WMCreatePLString("REFRESH"),
216 WMAddToPLArray(L1Menu
, L2Menu
);
218 L2Menu
= WMCreatePLArray(
219 WMCreatePLString(_("Save Session")),
220 WMCreatePLString("SAVE_SESSION"),
223 WMAddToPLArray(L1Menu
, L2Menu
);
225 L2Menu
= WMCreatePLArray(
226 WMCreatePLString(_("Clear Session")),
227 WMCreatePLString("CLEAR_SESSION"),
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"),
240 WMAddToPLArray(RMenu
, L1Menu
);
242 L1Menu
= WMCreatePLArray(
243 WMCreatePLString(_("Info Panel")),
244 WMCreatePLString("INFO_PANEL"),
247 WMAddToPLArray(RMenu
, L1Menu
);
249 L1Menu
= WMCreatePLArray(
250 WMCreatePLString(_("Restart Window Maker")),
251 WMCreatePLString("RESTART"),
254 WMAddToPLArray(RMenu
, L1Menu
);
256 /* Other window managers */
257 other_window_managers();
260 t
= wfindfile(path
, "xlock");
262 L1Menu
= WMCreatePLArray(
263 WMCreatePLString(_("Lock Screen")),
264 WMCreatePLString("EXEC"),
265 WMCreatePLString("xlock -allowroot -usefirst -mode matrix"),
268 WMAddToPLArray(RMenu
, L1Menu
);
273 L1Menu
= WMCreatePLArray(
274 WMCreatePLString(_("Exit Window Maker")),
275 WMCreatePLString("EXIT"),
278 WMAddToPLArray(RMenu
, L1Menu
);
280 printf("%s", WMGetPropListDescription(RMenu
, True
));
287 * Creates an L2Menu made of L3Menu items
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
)
295 char *t
, **argv
, buf
[PATH_MAX
];
297 /* or else pre-existing menus of these levels
298 * will badly disturb empty group detection */
304 /* Before checking if app exists, split its options */
305 wtokensplit(list
[i
][1], &argv
, &argc
);
306 t
= wfindfile(path
, argv
[0]);
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]),
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
)))
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
),
335 L2Menu
= WMCreatePLArray(
336 WMCreatePLString(group
),
339 WMAddToPLArray(L2Menu
, L3Menu
);
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
354 static void other_window_managers(void)
357 char *t
, buf
[PATH_MAX
];
359 /* or else pre-existing menus of these levels
360 * will badly disturb empty group detection */
365 while (other_wm
[i
][0]) {
366 t
= wfindfile(path
, other_wm
[i
][1]);
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]),
376 L1Menu
= WMCreatePLArray(
377 WMCreatePLString(_("Other Window Managers")),
380 WMAddToPLArray(L1Menu
, L2Menu
);
386 WMAddToPLArray(RMenu
, L1Menu
);
389 void print_help(int print_usage
, int exitval
)
391 printf("Usage: %s [-h] [-v]\n", __progname
);
393 puts("Writes a menu structure usable as ~/GNUstep/Defaults/WMRootMenu to stdout");
395 puts(" -h, --help display this help and exit");
396 puts(" -v, --version output version information and exit");