also fixes save themes/icons

>From c2ca765ee93b57cb91f6c8d800ab031677a793c1 Mon Sep 17 00:00:00 2001
From: Tamas TEVESZ <[email protected]>
Date: Sat, 3 Apr 2010 13:20:05 +0200
Subject: [PATCH] Poke wmgenmenu some more

- change some variable names to better reflect their purpose, do a little
  write-up how a menu is built
- auto-detect what terminal to use for apps in need of a terminal
- fix the chunk that adds the terminal-based apps
---
 util/wmgenmenu.c |  250 +++++++++++++++++++++++++++++++++---------------------
 util/wmgenmenu.h |    3 +-
 2 files changed, 153 insertions(+), 100 deletions(-)

diff --git a/util/wmgenmenu.c b/util/wmgenmenu.c
index 1956895..263d982 100644
--- a/util/wmgenmenu.c
+++ b/util/wmgenmenu.c
@@ -20,19 +20,19 @@
 
 #include "wmgenmenu.h"
 
-static void find_and_write(char *group, char **list);
+static void find_and_write(char *group, char **list, int this_is_terminals);
 static void other_window_managers(void);
 static void print_help(int print_usage, int exitval);
 
 extern char *__progname;
 
-char *path;
+char *path, *terminal = NULL;
 
-WMPropList *MenuRoot, *MenuGroup, *MenuItem;
+WMPropList *RMenu, *L1Menu, *L2Menu, *L3Menu;
 
 int main(int argc, char *argv[])
 {
-       char *t, *locale;
+       char *t;
        int ch;
 
        struct option longopts[] = {
@@ -62,7 +62,6 @@ int main(int argc, char *argv[])
                print_help(0, 1);
 
        path = getenv("PATH");
-       locale = getenv("LANG");
        setlocale(LC_ALL, "");
 
 #if HAVE_LIBINTL_H && I18N
@@ -75,157 +74,184 @@ int main(int argc, char *argv[])
        textdomain("wmgenmenu");
 #endif
 
-       MenuRoot = WMCreatePLArray(WMCreatePLString(_("Window Maker")), NULL);
-       MenuGroup = WMCreatePLArray(WMCreatePLString(_("Applications")), NULL);
+       /*
+        * The menu generated is a four-level hierarchy, of which the
+        * top level (RMenu) is only used to hold the others (a single
+        * PLString, which will be the title of the root menu)
+        *
+        * RMenu                Window Maker
+        *   L1Menu               Applications
+        *     L2Menu               Terminals
+        *       L3Menu               XTerm
+        *       L3Menu               RXVT
+        *     L2Menu               Internet
+        *       L3Menu               Firefox
+        *     L2Menu               E-mail
+        *   L1Menu               Appearance
+        *     L2Menu               Themes
+        *   L1Menu               Configure Window Maker
+        *
+        */
+
+       RMenu = WMCreatePLArray(WMCreatePLString(_("Window Maker")), NULL);
+
+       L1Menu = WMCreatePLArray(WMCreatePLString(_("Applications")), NULL);
 
        /* Submenus in Applications */
-       find_and_write(_("Terminals"), terminals);
-       find_and_write(_("Internet"), internet);
-       find_and_write(_("Email"), email);
-       find_and_write(_("Mathematics"), Mathematiks);
-       find_and_write(_("File Managers"), file_managers);
-       find_and_write(_("Graphics"), Graphics);
-       find_and_write(_("Multimedia"), Multimedia);
-       find_and_write(_("Editors"), Editors);
-       find_and_write(_("Development"), development);
-       find_and_write(_("Window Maker"), WindowMaker);
-       find_and_write(_("Office"), Office);
-       find_and_write(_("Astronomy"), Astronomie);
-       find_and_write(_("Sound"), Sound);
-       find_and_write(_("Comics"), Comics);
-       find_and_write(_("Viewers"), Viewers);
-       find_and_write(_("Utilities"), Utilities);
-       find_and_write(_("System"), System);
-       find_and_write(_("Video"), Video);
-       find_and_write(_("Chat and Talk"), Chat);
-       find_and_write(_("P2P-Network"), P2P);
-       find_and_write(_("Games"), Games);
-       find_and_write(_("OpenSUSE"), OpenSUSE);
-       find_and_write(_("Mandriva"), Mandriva);
-
-       WMAddToPLArray(MenuRoot, MenuGroup);
+       find_and_write(_("Terminals"), terminals, 1);   /* always keep 
terminals the top item */
+       find_and_write(_("Internet"), internet, 0);
+       find_and_write(_("Email"), email, 0);
+       find_and_write(_("Mathematics"), Mathematiks, 0);
+       find_and_write(_("File Managers"), file_managers, 0);
+       find_and_write(_("Graphics"), Graphics, 0);
+       find_and_write(_("Multimedia"), Multimedia, 0);
+       find_and_write(_("Editors"), Editors, 0);
+       find_and_write(_("Development"), development, 0);
+       find_and_write(_("Window Maker"), WindowMaker, 0);
+       find_and_write(_("Office"), Office, 0);
+       find_and_write(_("Astronomy"), Astronomie, 0);
+       find_and_write(_("Sound"), Sound, 0);
+       find_and_write(_("Comics"), Comics, 0);
+       find_and_write(_("Viewers"), Viewers, 0);
+       find_and_write(_("Utilities"), Utilities, 0);
+       find_and_write(_("System"), System, 0);
+       find_and_write(_("Video"), Video, 0);
+       find_and_write(_("Chat and Talk"), Chat, 0);
+       find_and_write(_("P2P-Network"), P2P, 0);
+       find_and_write(_("Games"), Games, 0);
+       find_and_write(_("OpenSUSE"), OpenSUSE, 0);
+       find_and_write(_("Mandriva"), Mandriva, 0);
+
+       WMAddToPLArray(RMenu, L1Menu);
 
        /* `Run' dialog */
-       MenuItem = WMCreatePLArray(
+       L1Menu = WMCreatePLArray(
                WMCreatePLString(_("Run...")),
                WMCreatePLString("SHEXEC"),
                WMCreatePLString(_("%A(Run, Type command:)")),
                NULL
        );
-       WMAddToPLArray(MenuRoot, MenuItem);
+       WMAddToPLArray(RMenu, L1Menu);
 
        /* Appearance-related items */
-       MenuGroup = WMCreatePLArray(WMCreatePLString(_("Appearance")), NULL);
-       MenuItem = WMCreatePLArray(
+       L1Menu = WMCreatePLArray(WMCreatePLString(_("Appearance")), NULL);
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Themes")),
                WMCreatePLString("OPEN_MENU"),
                WMCreatePLString("-noext 
$HOME/GNUstep/Library/WindowMaker/Themes WITH setstyle"),
                NULL
        );
-       WMAddToPLArray(MenuGroup, MenuItem);
+       WMAddToPLArray(L1Menu, L2Menu);
 
-       MenuItem = WMCreatePLArray(
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Icons")),
                WMCreatePLString("OPEN_MENU"),
                WMCreatePLString("-noext 
$HOME/GNUstep/Library/WindowMaker/IconSets WITH seticons"),
                NULL
        );
-       WMAddToPLArray(MenuGroup, MenuItem);
+       WMAddToPLArray(L1Menu, L2Menu);
 
-       MenuItem = WMCreatePLArray(
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Background")),
                WMCreatePLString("OPEN_MENU"),
                WMCreatePLString("-noext 
$HOME/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t"),
                NULL
        );
-       WMAddToPLArray(MenuGroup, MenuItem);
+       WMAddToPLArray(L1Menu, L2Menu);
 
-       MenuItem = WMCreatePLArray(
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Save Theme")),
                WMCreatePLString("SHEXEC"),
-               WMCreatePLString("getstyle -t 
$HOME/GNUstep/Library/WindowMaker/Themes/\"%%a(Theme name)\""),
+               WMCreatePLString("getstyle -t 
$HOME/GNUstep/Library/WindowMaker/Themes/"
+                       "\"%a(Theme name, Name to save theme as)\""),
                NULL
        );
-       WMAddToPLArray(MenuGroup, MenuItem);
+       WMAddToPLArray(L1Menu, L2Menu);
 
-       MenuItem = WMCreatePLArray(
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Save Icons")),
                WMCreatePLString("SHEXEC"),
-               WMCreatePLString("geticonset 
$HOME/GNUstep/Library/WindowMaker/IconSets/\"%%a(IconSet name)\""),
+               WMCreatePLString("geticonset 
$HOME/GNUstep/Library/WindowMaker/IconSets/"
+                       "\"%a(IconSet name,Name to save icon set as)\""),
                NULL
        );
-       WMAddToPLArray(MenuGroup, MenuItem);
-       WMAddToPLArray(MenuRoot, MenuGroup);
+       WMAddToPLArray(L1Menu, L2Menu);
+       WMAddToPLArray(RMenu, L1Menu);
 
        /* Workspace-related items */
-       MenuGroup = WMCreatePLArray(
+       L1Menu = WMCreatePLArray(
                WMCreatePLString(_("Workspaces")),
                WMCreatePLString("WORKSPACE_MENU"),
                NULL
        );
-       WMAddToPLArray(MenuRoot, MenuGroup);
+       WMAddToPLArray(RMenu, L1Menu);
 
-       MenuGroup = WMCreatePLArray(WMCreatePLString(_("Workspace")), NULL);
-       MenuItem = WMCreatePLArray(
+       L1Menu = WMCreatePLArray(WMCreatePLString(_("Workspace")), NULL);
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Hide Others")),
                WMCreatePLString("HIDE_OTHERS"),
                NULL
        );
-       WMAddToPLArray(MenuGroup, MenuItem);
-       MenuItem = WMCreatePLArray(
+       WMAddToPLArray(L1Menu, L2Menu);
+
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Show All")),
                WMCreatePLString("SHOW_ALL"),
                NULL
        );
-       WMAddToPLArray(MenuGroup, MenuItem);
-       MenuItem = WMCreatePLArray(
+       WMAddToPLArray(L1Menu, L2Menu);
+
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Arrange Icons")),
                WMCreatePLString("ARRANGE_ICONS"),
                NULL
        );
-       WMAddToPLArray(MenuGroup, MenuItem);
+       WMAddToPLArray(L1Menu, L2Menu);
 
-       MenuItem = WMCreatePLArray(
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Refresh")),
                WMCreatePLString("REFRESH"),
                NULL
        );
-       WMAddToPLArray(MenuGroup, MenuItem);
-       MenuItem = WMCreatePLArray(
+       WMAddToPLArray(L1Menu, L2Menu);
+
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Save Session")),
                WMCreatePLString("SAVE_SESSION"),
                NULL
        );
-       WMAddToPLArray(MenuGroup, MenuItem);
-       MenuItem = WMCreatePLArray(
+       WMAddToPLArray(L1Menu, L2Menu);
+
+       L2Menu = WMCreatePLArray(
                WMCreatePLString(_("Clear Session")),
                WMCreatePLString("CLEAR_SESSION"),
                NULL
        );
-       WMAddToPLArray(MenuRoot, MenuGroup);
+       WMAddToPLArray(L1Menu, L2Menu);
+       WMAddToPLArray(RMenu, L1Menu);
 
        /* Configuration-related items */
-       MenuItem = WMCreatePLArray(
+       L1Menu = WMCreatePLArray(
                WMCreatePLString(_("Configure Window Maker")),
                WMCreatePLString("EXEC"),
                WMCreatePLString("WPrefs"),
                NULL
        );
-       WMAddToPLArray(MenuRoot, MenuItem);
+       WMAddToPLArray(RMenu, L1Menu);
 
-       MenuItem = WMCreatePLArray(
+       L1Menu = WMCreatePLArray(
                WMCreatePLString(_("Info Panel")),
                WMCreatePLString("INFO_PANEL"),
                NULL
        );
-       WMAddToPLArray(MenuRoot, MenuItem);
+       WMAddToPLArray(RMenu, L1Menu);
 
-       MenuItem = WMCreatePLArray(
+       L1Menu = WMCreatePLArray(
                WMCreatePLString(_("Restart")),
                WMCreatePLString("RESTART"),
                NULL
        );
-       WMAddToPLArray(MenuRoot, MenuItem);
+       WMAddToPLArray(RMenu, L1Menu);
 
        /* Other window managers */
        other_window_managers();
@@ -233,35 +259,45 @@ int main(int argc, char *argv[])
        /* XLock */
        t = wfindfile(path, "xlock");
        if (t) {
-               MenuItem = WMCreatePLArray(
+               L1Menu = WMCreatePLArray(
                        WMCreatePLString(_("Lock Screen")),
                        WMCreatePLString("EXEC"),
                        WMCreatePLString("xlock -allowroot -usefirst -mode 
matrix"),
                        NULL
                );
-               WMAddToPLArray(MenuRoot, MenuItem);
+               WMAddToPLArray(RMenu, L1Menu);
                wfree(t);
        }
 
        /* Exit */
-       MenuItem = WMCreatePLArray(
+       L1Menu = WMCreatePLArray(
                WMCreatePLString(_("Exit Window Maker")),
                WMCreatePLString("EXIT"),
                NULL
        );
-       WMAddToPLArray(MenuRoot, MenuItem);
+       WMAddToPLArray(RMenu, L1Menu);
 
-       printf("%s", WMGetPropListDescription(MenuRoot, True));
+       printf("%s", WMGetPropListDescription(RMenu, True));
+       puts("");
 
        return 0;
 }
 
-static void find_and_write(char *group, char **list)
+/*
+ * Creates an L2Menu made of L3Menu items
+ * Attaches to L1Menu
+ * - make sure previous menus of these levels are
+ *   attached to their parent before calling
+ */
+static void find_and_write(char *group, char **list, int this_is_terminals)
 {
        int i, argc;
        char *t, **argv, buf[PATH_MAX];
-       extern char *path;
-       WMPropList *SubGroup = NULL, *SubGroupItem = NULL;
+
+       /* or else pre-existing menus of these levels
+        * will badly disturb empty group detection */
+       L2Menu = NULL;
+       L3Menu = NULL;
 
        i = 0;
        while (list[i]) {
@@ -269,67 +305,85 @@ static void find_and_write(char *group, char **list)
                wtokensplit(list[i], &argv, &argc);
                t = wfindfile(path, argv[0]);
                if (t) {
-                       /* check whether it is to be executed in a terminal */
-                       if (strcmp("!", argv[argc - 1]) < 0)
-                               SubGroupItem = WMCreatePLArray(
+                       /* find a terminal to be used for cmnds that need a 
terminal */
+                       if (this_is_terminals && !terminal)
+                               terminal = wstrdup(list[i]);
+                       if (*(argv[argc-1]) != '!') {
+                               L3Menu = WMCreatePLArray(
                                        WMCreatePLString(argv[0]),
                                        WMCreatePLString("EXEC"),
                                        WMCreatePLString(list[i]),
                                        NULL
                                );
-                       else {
-                               char comm[50], *ptr;
+                       } else {
+                               char comm[PATH_MAX], *ptr;
 
                                strcpy(comm, list[i]);
-                               /* ugly hack to delete character ! from list[i] 
*/
+                               /* delete character " !" from the command */
                                ptr = strchr(comm, '!');
                                while (ptr >= comm && (*ptr == '!' || 
isspace(*ptr)))
                                        *ptr-- = '\0';
-                               snprintf(buf, sizeof(buf), "xterm -e %s", comm);
-                               SubGroupItem = WMCreatePLArray(
+                               snprintf(buf, sizeof(buf), "%s -e %s", terminal 
? terminal : "xterm" , comm);
+                               L3Menu = WMCreatePLArray(
                                        WMCreatePLString(argv[0]),
                                        WMCreatePLString("EXEC"),
-                                       WMCreatePLString(comm),
+                                       WMCreatePLString(buf),
                                        NULL
                                );
                        }
-                       if (!SubGroup)
-                               SubGroup = 
WMCreatePLArray(WMCreatePLString(group), NULL);
-                       WMAddToPLArray(SubGroup, SubGroupItem);
+                       if (!L2Menu)
+                               L2Menu = WMCreatePLArray(
+                                       WMCreatePLString(group),
+                                       NULL
+                               );
+                       WMAddToPLArray(L2Menu, L3Menu);
                        wfree(t);
                }
                i++;
        }
-       if (SubGroup)
-               WMAddToPLArray(MenuGroup, SubGroup);
+       if (L2Menu)
+               WMAddToPLArray(L1Menu, L2Menu);
 }
 
+/*
+ * Creates an L1Menu made of L2Menu items
+ * - make sure previous menus of these levels are
+ *   attached to their parent before calling
+ * Attaches to RMenu
+ */
 static void other_window_managers(void)
 {
        int i;
        char *t, buf[PATH_MAX];
-       WMPropList *SubGroup = NULL, *SubGroupItem = NULL;
+
+       /* or else pre-existing menus of these levels
+        * will badly disturb empty group detection */
+       L1Menu = NULL;
+       L2Menu = NULL;
 
        i = 0;
        while (other_wm[i]) {
                t = wfindfile(path, other_wm[i]);
                if (t) {
                        snprintf(buf, sizeof(buf), _("Start %s"), other_wm[i]);
-                       SubGroupItem = WMCreatePLArray(
+                       L2Menu = WMCreatePLArray(
                                WMCreatePLString(buf),
                                WMCreatePLString("RESTART"),
                                WMCreatePLString(other_wm[i]),
                                NULL
                        );
-                       if (!SubGroup)
-                               SubGroup = 
WMCreatePLArray(WMCreatePLString(_("Other Window Managers")), NULL);
-                       WMAddToPLArray(SubGroup, SubGroupItem);
+                       if (!L1Menu)
+                               L1Menu = WMCreatePLArray(
+                                       WMCreatePLString(_("Other Window 
Managers")), 
+                                       NULL
+                               );
+                       WMAddToPLArray(L1Menu, L2Menu);
                        wfree(t);
                }
                i++;
        }
-       if (SubGroup)
-               WMAddToPLArray(MenuRoot, SubGroup);
+       if (L1Menu)
+               WMAddToPLArray(RMenu, L1Menu);
 }
 
 void print_help(int print_usage, int exitval)
diff --git a/util/wmgenmenu.h b/util/wmgenmenu.h
index 1b03589..389aa7b 100644
--- a/util/wmgenmenu.h
+++ b/util/wmgenmenu.h
@@ -2,8 +2,7 @@
 
 /*
  * If the program should run from inside a terminal it has
- * to finish with a space followed by '!', e.g.
- * "mutt !"
+ * to end with a space followed by '!', e.g.  "mutt !"
  */
 
 char *terminals[MAX_NR_APPS] = {
-- 
1.7.0


-- 
[-]

mkdir /nonexistent
From c2ca765ee93b57cb91f6c8d800ab031677a793c1 Mon Sep 17 00:00:00 2001
From: Tamas TEVESZ <[email protected]>
Date: Sat, 3 Apr 2010 13:20:05 +0200
Subject: [PATCH] Poke wmgenmenu some more

- change some variable names to better reflect their purpose, do a little
  write-up how a menu is built
- auto-detect what terminal to use for apps in need of a terminal
- fix the chunk that adds the terminal-based apps
---
 util/wmgenmenu.c |  250 +++++++++++++++++++++++++++++++++---------------------
 util/wmgenmenu.h |    3 +-
 2 files changed, 153 insertions(+), 100 deletions(-)

diff --git a/util/wmgenmenu.c b/util/wmgenmenu.c
index 1956895..263d982 100644
--- a/util/wmgenmenu.c
+++ b/util/wmgenmenu.c
@@ -20,19 +20,19 @@
 
 #include "wmgenmenu.h"
 
-static void find_and_write(char *group, char **list);
+static void find_and_write(char *group, char **list, int this_is_terminals);
 static void other_window_managers(void);
 static void print_help(int print_usage, int exitval);
 
 extern char *__progname;
 
-char *path;
+char *path, *terminal = NULL;
 
-WMPropList *MenuRoot, *MenuGroup, *MenuItem;
+WMPropList *RMenu, *L1Menu, *L2Menu, *L3Menu;
 
 int main(int argc, char *argv[])
 {
-	char *t, *locale;
+	char *t;
 	int ch;
 
 	struct option longopts[] = {
@@ -62,7 +62,6 @@ int main(int argc, char *argv[])
 		print_help(0, 1);
 
 	path = getenv("PATH");
-	locale = getenv("LANG");
 	setlocale(LC_ALL, "");
 
 #if HAVE_LIBINTL_H && I18N
@@ -75,157 +74,184 @@ int main(int argc, char *argv[])
 	textdomain("wmgenmenu");
 #endif
 
-	MenuRoot = WMCreatePLArray(WMCreatePLString(_("Window Maker")), NULL);
-	MenuGroup = WMCreatePLArray(WMCreatePLString(_("Applications")), NULL);
+	/*
+	 * The menu generated is a four-level hierarchy, of which the
+	 * top level (RMenu) is only used to hold the others (a single
+	 * PLString, which will be the title of the root menu)
+	 *
+	 * RMenu		Window Maker
+	 *   L1Menu		  Applications
+	 *     L2Menu		    Terminals
+	 *       L3Menu		      XTerm
+	 *       L3Menu		      RXVT
+	 *     L2Menu		    Internet
+	 *       L3Menu		      Firefox
+	 *     L2Menu		    E-mail
+	 *   L1Menu		  Appearance
+	 *     L2Menu		    Themes
+	 *   L1Menu		  Configure Window Maker
+	 *
+	 */
+
+	RMenu = WMCreatePLArray(WMCreatePLString(_("Window Maker")), NULL);
+
+	L1Menu = WMCreatePLArray(WMCreatePLString(_("Applications")), NULL);
 
 	/* Submenus in Applications */
-	find_and_write(_("Terminals"), terminals);
-	find_and_write(_("Internet"), internet);
-	find_and_write(_("Email"), email);
-	find_and_write(_("Mathematics"), Mathematiks);
-	find_and_write(_("File Managers"), file_managers);
-	find_and_write(_("Graphics"), Graphics);
-	find_and_write(_("Multimedia"), Multimedia);
-	find_and_write(_("Editors"), Editors);
-	find_and_write(_("Development"), development);
-	find_and_write(_("Window Maker"), WindowMaker);
-	find_and_write(_("Office"), Office);
-	find_and_write(_("Astronomy"), Astronomie);
-	find_and_write(_("Sound"), Sound);
-	find_and_write(_("Comics"), Comics);
-	find_and_write(_("Viewers"), Viewers);
-	find_and_write(_("Utilities"), Utilities);
-	find_and_write(_("System"), System);
-	find_and_write(_("Video"), Video);
-	find_and_write(_("Chat and Talk"), Chat);
-	find_and_write(_("P2P-Network"), P2P);
-	find_and_write(_("Games"), Games);
-	find_and_write(_("OpenSUSE"), OpenSUSE);
-	find_and_write(_("Mandriva"), Mandriva);
-
-	WMAddToPLArray(MenuRoot, MenuGroup);
+	find_and_write(_("Terminals"), terminals, 1);	/* always keep terminals the top item */
+	find_and_write(_("Internet"), internet, 0);
+	find_and_write(_("Email"), email, 0);
+	find_and_write(_("Mathematics"), Mathematiks, 0);
+	find_and_write(_("File Managers"), file_managers, 0);
+	find_and_write(_("Graphics"), Graphics, 0);
+	find_and_write(_("Multimedia"), Multimedia, 0);
+	find_and_write(_("Editors"), Editors, 0);
+	find_and_write(_("Development"), development, 0);
+	find_and_write(_("Window Maker"), WindowMaker, 0);
+	find_and_write(_("Office"), Office, 0);
+	find_and_write(_("Astronomy"), Astronomie, 0);
+	find_and_write(_("Sound"), Sound, 0);
+	find_and_write(_("Comics"), Comics, 0);
+	find_and_write(_("Viewers"), Viewers, 0);
+	find_and_write(_("Utilities"), Utilities, 0);
+	find_and_write(_("System"), System, 0);
+	find_and_write(_("Video"), Video, 0);
+	find_and_write(_("Chat and Talk"), Chat, 0);
+	find_and_write(_("P2P-Network"), P2P, 0);
+	find_and_write(_("Games"), Games, 0);
+	find_and_write(_("OpenSUSE"), OpenSUSE, 0);
+	find_and_write(_("Mandriva"), Mandriva, 0);
+
+	WMAddToPLArray(RMenu, L1Menu);
 
 	/* `Run' dialog */
-	MenuItem = WMCreatePLArray(
+	L1Menu = WMCreatePLArray(
 		WMCreatePLString(_("Run...")),
 		WMCreatePLString("SHEXEC"),
 		WMCreatePLString(_("%A(Run, Type command:)")),
 		NULL
 	);
-	WMAddToPLArray(MenuRoot, MenuItem);
+	WMAddToPLArray(RMenu, L1Menu);
 
 	/* Appearance-related items */
-	MenuGroup = WMCreatePLArray(WMCreatePLString(_("Appearance")), NULL);
-	MenuItem = WMCreatePLArray(
+	L1Menu = WMCreatePLArray(WMCreatePLString(_("Appearance")), NULL);
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Themes")),
 		WMCreatePLString("OPEN_MENU"),
 		WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/Themes WITH setstyle"),
 		NULL
 	);
-	WMAddToPLArray(MenuGroup, MenuItem);
+	WMAddToPLArray(L1Menu, L2Menu);
 
-	MenuItem = WMCreatePLArray(
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Icons")),
 		WMCreatePLString("OPEN_MENU"),
 		WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/IconSets WITH seticons"),
 		NULL
 	);
-	WMAddToPLArray(MenuGroup, MenuItem);
+	WMAddToPLArray(L1Menu, L2Menu);
 
-	MenuItem = WMCreatePLArray(
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Background")),
 		WMCreatePLString("OPEN_MENU"),
 		WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t"),
 		NULL
 	);
-	WMAddToPLArray(MenuGroup, MenuItem);
+	WMAddToPLArray(L1Menu, L2Menu);
 
-	MenuItem = WMCreatePLArray(
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Save Theme")),
 		WMCreatePLString("SHEXEC"),
-		WMCreatePLString("getstyle -t $HOME/GNUstep/Library/WindowMaker/Themes/\"%%a(Theme name)\""),
+		WMCreatePLString("getstyle -t $HOME/GNUstep/Library/WindowMaker/Themes/"
+			"\"%a(Theme name, Name to save theme as)\""),
 		NULL
 	);
-	WMAddToPLArray(MenuGroup, MenuItem);
+	WMAddToPLArray(L1Menu, L2Menu);
 
-	MenuItem = WMCreatePLArray(
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Save Icons")),
 		WMCreatePLString("SHEXEC"),
-		WMCreatePLString("geticonset $HOME/GNUstep/Library/WindowMaker/IconSets/\"%%a(IconSet name)\""),
+		WMCreatePLString("geticonset $HOME/GNUstep/Library/WindowMaker/IconSets/"
+			"\"%a(IconSet name,Name to save icon set as)\""),
 		NULL
 	);
-	WMAddToPLArray(MenuGroup, MenuItem);
-	WMAddToPLArray(MenuRoot, MenuGroup);
+	WMAddToPLArray(L1Menu, L2Menu);
+	WMAddToPLArray(RMenu, L1Menu);
 
 	/* Workspace-related items */
-	MenuGroup = WMCreatePLArray(
+	L1Menu = WMCreatePLArray(
 		WMCreatePLString(_("Workspaces")),
 		WMCreatePLString("WORKSPACE_MENU"),
 		NULL
 	);
-	WMAddToPLArray(MenuRoot, MenuGroup);
+	WMAddToPLArray(RMenu, L1Menu);
 
-	MenuGroup = WMCreatePLArray(WMCreatePLString(_("Workspace")), NULL);
-	MenuItem = WMCreatePLArray(
+	L1Menu = WMCreatePLArray(WMCreatePLString(_("Workspace")), NULL);
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Hide Others")),
 		WMCreatePLString("HIDE_OTHERS"),
 		NULL
 	);
-	WMAddToPLArray(MenuGroup, MenuItem);
-	MenuItem = WMCreatePLArray(
+	WMAddToPLArray(L1Menu, L2Menu);
+
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Show All")),
 		WMCreatePLString("SHOW_ALL"),
 		NULL
 	);
-	WMAddToPLArray(MenuGroup, MenuItem);
-	MenuItem = WMCreatePLArray(
+	WMAddToPLArray(L1Menu, L2Menu);
+
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Arrange Icons")),
 		WMCreatePLString("ARRANGE_ICONS"),
 		NULL
 	);
-	WMAddToPLArray(MenuGroup, MenuItem);
+	WMAddToPLArray(L1Menu, L2Menu);
 
-	MenuItem = WMCreatePLArray(
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Refresh")),
 		WMCreatePLString("REFRESH"),
 		NULL
 	);
-	WMAddToPLArray(MenuGroup, MenuItem);
-	MenuItem = WMCreatePLArray(
+	WMAddToPLArray(L1Menu, L2Menu);
+
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Save Session")),
 		WMCreatePLString("SAVE_SESSION"),
 		NULL
 	);
-	WMAddToPLArray(MenuGroup, MenuItem);
-	MenuItem = WMCreatePLArray(
+	WMAddToPLArray(L1Menu, L2Menu);
+
+	L2Menu = WMCreatePLArray(
 		WMCreatePLString(_("Clear Session")),
 		WMCreatePLString("CLEAR_SESSION"),
 		NULL
 	);
-	WMAddToPLArray(MenuRoot, MenuGroup);
+	WMAddToPLArray(L1Menu, L2Menu);
+	WMAddToPLArray(RMenu, L1Menu);
 
 	/* Configuration-related items */
-	MenuItem = WMCreatePLArray(
+	L1Menu = WMCreatePLArray(
 		WMCreatePLString(_("Configure Window Maker")),
 		WMCreatePLString("EXEC"),
 		WMCreatePLString("WPrefs"),
 		NULL
 	);
-	WMAddToPLArray(MenuRoot, MenuItem);
+	WMAddToPLArray(RMenu, L1Menu);
 
-	MenuItem = WMCreatePLArray(
+	L1Menu = WMCreatePLArray(
 		WMCreatePLString(_("Info Panel")),
 		WMCreatePLString("INFO_PANEL"),
 		NULL
 	);
-	WMAddToPLArray(MenuRoot, MenuItem);
+	WMAddToPLArray(RMenu, L1Menu);
 
-	MenuItem = WMCreatePLArray(
+	L1Menu = WMCreatePLArray(
 		WMCreatePLString(_("Restart")),
 		WMCreatePLString("RESTART"),
 		NULL
 	);
-	WMAddToPLArray(MenuRoot, MenuItem);
+	WMAddToPLArray(RMenu, L1Menu);
 
 	/* Other window managers */
 	other_window_managers();
@@ -233,35 +259,45 @@ int main(int argc, char *argv[])
 	/* XLock */
 	t = wfindfile(path, "xlock");
 	if (t) {
-		MenuItem = WMCreatePLArray(
+		L1Menu = WMCreatePLArray(
 			WMCreatePLString(_("Lock Screen")),
 			WMCreatePLString("EXEC"),
 			WMCreatePLString("xlock -allowroot -usefirst -mode matrix"),
 			NULL
 		);
-		WMAddToPLArray(MenuRoot, MenuItem);
+		WMAddToPLArray(RMenu, L1Menu);
 		wfree(t);
 	}
 
 	/* Exit */
-	MenuItem = WMCreatePLArray(
+	L1Menu = WMCreatePLArray(
 		WMCreatePLString(_("Exit Window Maker")),
 		WMCreatePLString("EXIT"),
 		NULL
 	);
-	WMAddToPLArray(MenuRoot, MenuItem);
+	WMAddToPLArray(RMenu, L1Menu);
 
-	printf("%s", WMGetPropListDescription(MenuRoot, True));
+	printf("%s", WMGetPropListDescription(RMenu, True));
+	puts("");
 
 	return 0;
 }
 
-static void find_and_write(char *group, char **list)
+/*
+ * Creates an L2Menu made of L3Menu items
+ * Attaches to L1Menu
+ * - make sure previous menus of these levels are
+ *   attached to their parent before calling
+ */
+static void find_and_write(char *group, char **list, int this_is_terminals)
 {
 	int i, argc;
 	char *t, **argv, buf[PATH_MAX];
-	extern char *path;
-	WMPropList *SubGroup = NULL, *SubGroupItem = NULL;
+
+	/* or else pre-existing menus of these levels
+	 * will badly disturb empty group detection */
+	L2Menu = NULL;
+	L3Menu = NULL;
 
 	i = 0;
 	while (list[i]) {
@@ -269,67 +305,85 @@ static void find_and_write(char *group, char **list)
 		wtokensplit(list[i], &argv, &argc);
 		t = wfindfile(path, argv[0]);
 		if (t) {
-			/* check whether it is to be executed in a terminal */
-			if (strcmp("!", argv[argc - 1]) < 0)
-				SubGroupItem = WMCreatePLArray(
+			/* find a terminal to be used for cmnds that need a terminal */
+			if (this_is_terminals && !terminal)
+				terminal = wstrdup(list[i]);
+			if (*(argv[argc-1]) != '!') {
+				L3Menu = WMCreatePLArray(
 					WMCreatePLString(argv[0]),
 					WMCreatePLString("EXEC"),
 					WMCreatePLString(list[i]),
 					NULL
 				);
-			else {
-				char comm[50], *ptr;
+			} else {
+				char comm[PATH_MAX], *ptr;
 
 				strcpy(comm, list[i]);
-				/* ugly hack to delete character ! from list[i] */
+				/* delete character " !" from the command */
 				ptr = strchr(comm, '!');
 				while (ptr >= comm && (*ptr == '!' || isspace(*ptr)))
 					*ptr-- = '\0';
-				snprintf(buf, sizeof(buf), "xterm -e %s", comm);
-				SubGroupItem = WMCreatePLArray(
+				snprintf(buf, sizeof(buf), "%s -e %s", terminal ? terminal : "xterm" , comm);
+				L3Menu = WMCreatePLArray(
 					WMCreatePLString(argv[0]),
 					WMCreatePLString("EXEC"),
-					WMCreatePLString(comm),
+					WMCreatePLString(buf),
 					NULL
 				);
 			}
-			if (!SubGroup)
-				SubGroup = WMCreatePLArray(WMCreatePLString(group), NULL);
-			WMAddToPLArray(SubGroup, SubGroupItem);
+			if (!L2Menu)
+				L2Menu = WMCreatePLArray(
+					WMCreatePLString(group),
+					NULL
+				);
+			WMAddToPLArray(L2Menu, L3Menu);
 			wfree(t);
 		}
 		i++;
 	}
-	if (SubGroup)
-		WMAddToPLArray(MenuGroup, SubGroup);
+	if (L2Menu)
+		WMAddToPLArray(L1Menu, L2Menu);
 }
 
+/*
+ * Creates an L1Menu made of L2Menu items
+ * - make sure previous menus of these levels are
+ *   attached to their parent before calling
+ * Attaches to RMenu
+ */
 static void other_window_managers(void)
 {
 	int i;
 	char *t, buf[PATH_MAX];
-	WMPropList *SubGroup = NULL, *SubGroupItem = NULL;
+
+	/* or else pre-existing menus of these levels
+	 * will badly disturb empty group detection */
+	L1Menu = NULL;
+	L2Menu = NULL;
 
 	i = 0;
 	while (other_wm[i]) {
 		t = wfindfile(path, other_wm[i]);
 		if (t) {
 			snprintf(buf, sizeof(buf), _("Start %s"), other_wm[i]);
-			SubGroupItem = WMCreatePLArray(
+			L2Menu = WMCreatePLArray(
 				WMCreatePLString(buf),
 				WMCreatePLString("RESTART"),
 				WMCreatePLString(other_wm[i]),
 				NULL
 			);
-			if (!SubGroup)
-				SubGroup = WMCreatePLArray(WMCreatePLString(_("Other Window Managers")), NULL);
-			WMAddToPLArray(SubGroup, SubGroupItem);
+			if (!L1Menu)
+				L1Menu = WMCreatePLArray(
+					WMCreatePLString(_("Other Window Managers")), 
+					NULL
+				);
+			WMAddToPLArray(L1Menu, L2Menu);
 			wfree(t);
 		}
 		i++;
 	}
-	if (SubGroup)
-		WMAddToPLArray(MenuRoot, SubGroup);
+	if (L1Menu)
+		WMAddToPLArray(RMenu, L1Menu);
 }
 
 void print_help(int print_usage, int exitval)
diff --git a/util/wmgenmenu.h b/util/wmgenmenu.h
index 1b03589..389aa7b 100644
--- a/util/wmgenmenu.h
+++ b/util/wmgenmenu.h
@@ -2,8 +2,7 @@
 
 /*
  * If the program should run from inside a terminal it has
- * to finish with a space followed by '!', e.g.
- * "mutt !"
+ * to end with a space followed by '!', e.g.  "mutt !"
  */
 
 char *terminals[MAX_NR_APPS] = {
-- 
1.7.0

Reply via email to