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 /nonexistentFrom 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