From 68a55be998d72324530b63f20866b49cf94b9e9f Mon Sep 17 00:00:00 2001 From: Tamas TEVESZ 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 | 248 +++++++++++++++++++++++++++++------------------ util/wmgenmenu.h | 3 +- 2 files changed, 152 insertions(+), 99 deletions(-) diff --git a/util/wmgenmenu.c b/util/wmgenmenu.c index 19568953..b9741e64 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); + 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(MenuRoot, MenuGroup); + 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 1b035895..389aa7b7 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] = {