1
0
mirror of https://github.com/gryf/wmaker.git synced 2025-12-22 14:08:06 +01:00

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
This commit is contained in:
Tamas TEVESZ
2010-04-03 13:20:05 +02:00
committed by Carlos R. Mafra
parent 68f70da310
commit 68a55be998
2 changed files with 152 additions and 99 deletions

View File

@@ -20,19 +20,19 @@
#include "wmgenmenu.h" #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 other_window_managers(void);
static void print_help(int print_usage, int exitval); static void print_help(int print_usage, int exitval);
extern char *__progname; extern char *__progname;
char *path; char *path, *terminal = NULL;
WMPropList *MenuRoot, *MenuGroup, *MenuItem; WMPropList *RMenu, *L1Menu, *L2Menu, *L3Menu;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
char *t, *locale; char *t;
int ch; int ch;
struct option longopts[] = { struct option longopts[] = {
@@ -62,7 +62,6 @@ int main(int argc, char *argv[])
print_help(0, 1); print_help(0, 1);
path = getenv("PATH"); path = getenv("PATH");
locale = getenv("LANG");
setlocale(LC_ALL, ""); setlocale(LC_ALL, "");
#if HAVE_LIBINTL_H && I18N #if HAVE_LIBINTL_H && I18N
@@ -75,157 +74,184 @@ int main(int argc, char *argv[])
textdomain("wmgenmenu"); textdomain("wmgenmenu");
#endif #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 */ /* Submenus in Applications */
find_and_write(_("Terminals"), terminals); find_and_write(_("Terminals"), terminals, 1); /* always keep terminals the top item */
find_and_write(_("Internet"), internet); find_and_write(_("Internet"), internet, 0);
find_and_write(_("Email"), email); find_and_write(_("Email"), email, 0);
find_and_write(_("Mathematics"), Mathematiks); find_and_write(_("Mathematics"), Mathematiks, 0);
find_and_write(_("File Managers"), file_managers); find_and_write(_("File Managers"), file_managers, 0);
find_and_write(_("Graphics"), Graphics); find_and_write(_("Graphics"), Graphics, 0);
find_and_write(_("Multimedia"), Multimedia); find_and_write(_("Multimedia"), Multimedia, 0);
find_and_write(_("Editors"), Editors); find_and_write(_("Editors"), Editors, 0);
find_and_write(_("Development"), development); find_and_write(_("Development"), development, 0);
find_and_write(_("Window Maker"), WindowMaker); find_and_write(_("Window Maker"), WindowMaker, 0);
find_and_write(_("Office"), Office); find_and_write(_("Office"), Office, 0);
find_and_write(_("Astronomy"), Astronomie); find_and_write(_("Astronomy"), Astronomie, 0);
find_and_write(_("Sound"), Sound); find_and_write(_("Sound"), Sound, 0);
find_and_write(_("Comics"), Comics); find_and_write(_("Comics"), Comics, 0);
find_and_write(_("Viewers"), Viewers); find_and_write(_("Viewers"), Viewers, 0);
find_and_write(_("Utilities"), Utilities); find_and_write(_("Utilities"), Utilities, 0);
find_and_write(_("System"), System); find_and_write(_("System"), System, 0);
find_and_write(_("Video"), Video); find_and_write(_("Video"), Video, 0);
find_and_write(_("Chat and Talk"), Chat); find_and_write(_("Chat and Talk"), Chat, 0);
find_and_write(_("P2P-Network"), P2P); find_and_write(_("P2P-Network"), P2P, 0);
find_and_write(_("Games"), Games); find_and_write(_("Games"), Games, 0);
find_and_write(_("OpenSUSE"), OpenSUSE); find_and_write(_("OpenSUSE"), OpenSUSE, 0);
find_and_write(_("Mandriva"), Mandriva); find_and_write(_("Mandriva"), Mandriva, 0);
WMAddToPLArray(MenuRoot, MenuGroup); WMAddToPLArray(RMenu, L1Menu);
/* `Run' dialog */ /* `Run' dialog */
MenuItem = WMCreatePLArray( L1Menu = WMCreatePLArray(
WMCreatePLString(_("Run...")), WMCreatePLString(_("Run...")),
WMCreatePLString("SHEXEC"), WMCreatePLString("SHEXEC"),
WMCreatePLString(_("%A(Run, Type command:)")), WMCreatePLString(_("%A(Run, Type command:)")),
NULL NULL
); );
WMAddToPLArray(MenuRoot, MenuItem); WMAddToPLArray(RMenu, L1Menu);
/* Appearance-related items */ /* Appearance-related items */
MenuGroup = WMCreatePLArray(WMCreatePLString(_("Appearance")), NULL); L1Menu = WMCreatePLArray(WMCreatePLString(_("Appearance")), NULL);
MenuItem = WMCreatePLArray( L2Menu = WMCreatePLArray(
WMCreatePLString(_("Themes")), WMCreatePLString(_("Themes")),
WMCreatePLString("OPEN_MENU"), WMCreatePLString("OPEN_MENU"),
WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/Themes WITH setstyle"), WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/Themes WITH setstyle"),
NULL NULL
); );
WMAddToPLArray(MenuGroup, MenuItem); WMAddToPLArray(L1Menu, L2Menu);
MenuItem = WMCreatePLArray( L2Menu = WMCreatePLArray(
WMCreatePLString(_("Icons")), WMCreatePLString(_("Icons")),
WMCreatePLString("OPEN_MENU"), WMCreatePLString("OPEN_MENU"),
WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/IconSets WITH seticons"), WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/IconSets WITH seticons"),
NULL NULL
); );
WMAddToPLArray(MenuGroup, MenuItem); WMAddToPLArray(L1Menu, L2Menu);
MenuItem = WMCreatePLArray( L2Menu = WMCreatePLArray(
WMCreatePLString(_("Background")), WMCreatePLString(_("Background")),
WMCreatePLString("OPEN_MENU"), WMCreatePLString("OPEN_MENU"),
WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t"), WMCreatePLString("-noext $HOME/GNUstep/Library/WindowMaker/Backgrounds WITH wmsetbg -u -t"),
NULL NULL
); );
WMAddToPLArray(MenuGroup, MenuItem); WMAddToPLArray(L1Menu, L2Menu);
MenuItem = WMCreatePLArray( L2Menu = WMCreatePLArray(
WMCreatePLString(_("Save Theme")), WMCreatePLString(_("Save Theme")),
WMCreatePLString("SHEXEC"), 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 NULL
); );
WMAddToPLArray(MenuGroup, MenuItem); WMAddToPLArray(L1Menu, L2Menu);
MenuItem = WMCreatePLArray( L2Menu = WMCreatePLArray(
WMCreatePLString(_("Save Icons")), WMCreatePLString(_("Save Icons")),
WMCreatePLString("SHEXEC"), 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 NULL
); );
WMAddToPLArray(MenuGroup, MenuItem); WMAddToPLArray(L1Menu, L2Menu);
WMAddToPLArray(MenuRoot, MenuGroup); WMAddToPLArray(RMenu, L1Menu);
/* Workspace-related items */ /* Workspace-related items */
MenuGroup = WMCreatePLArray( L1Menu = WMCreatePLArray(
WMCreatePLString(_("Workspaces")), WMCreatePLString(_("Workspaces")),
WMCreatePLString("WORKSPACE_MENU"), WMCreatePLString("WORKSPACE_MENU"),
NULL NULL
); );
WMAddToPLArray(MenuRoot, MenuGroup); WMAddToPLArray(RMenu, L1Menu);
MenuGroup = WMCreatePLArray(WMCreatePLString(_("Workspace")), NULL); L1Menu = WMCreatePLArray(WMCreatePLString(_("Workspace")), NULL);
MenuItem = WMCreatePLArray( L2Menu = WMCreatePLArray(
WMCreatePLString(_("Hide Others")), WMCreatePLString(_("Hide Others")),
WMCreatePLString("HIDE_OTHERS"), WMCreatePLString("HIDE_OTHERS"),
NULL NULL
); );
WMAddToPLArray(MenuGroup, MenuItem); WMAddToPLArray(L1Menu, L2Menu);
MenuItem = WMCreatePLArray(
L2Menu = WMCreatePLArray(
WMCreatePLString(_("Show All")), WMCreatePLString(_("Show All")),
WMCreatePLString("SHOW_ALL"), WMCreatePLString("SHOW_ALL"),
NULL NULL
); );
WMAddToPLArray(MenuGroup, MenuItem); WMAddToPLArray(L1Menu, L2Menu);
MenuItem = WMCreatePLArray(
L2Menu = WMCreatePLArray(
WMCreatePLString(_("Arrange Icons")), WMCreatePLString(_("Arrange Icons")),
WMCreatePLString("ARRANGE_ICONS"), WMCreatePLString("ARRANGE_ICONS"),
NULL NULL
); );
WMAddToPLArray(MenuGroup, MenuItem); WMAddToPLArray(L1Menu, L2Menu);
MenuItem = WMCreatePLArray( L2Menu = WMCreatePLArray(
WMCreatePLString(_("Refresh")), WMCreatePLString(_("Refresh")),
WMCreatePLString("REFRESH"), WMCreatePLString("REFRESH"),
NULL NULL
); );
WMAddToPLArray(MenuGroup, MenuItem); WMAddToPLArray(L1Menu, L2Menu);
MenuItem = WMCreatePLArray(
L2Menu = WMCreatePLArray(
WMCreatePLString(_("Save Session")), WMCreatePLString(_("Save Session")),
WMCreatePLString("SAVE_SESSION"), WMCreatePLString("SAVE_SESSION"),
NULL NULL
); );
WMAddToPLArray(MenuGroup, MenuItem); WMAddToPLArray(L1Menu, L2Menu);
MenuItem = WMCreatePLArray(
L2Menu = WMCreatePLArray(
WMCreatePLString(_("Clear Session")), WMCreatePLString(_("Clear Session")),
WMCreatePLString("CLEAR_SESSION"), WMCreatePLString("CLEAR_SESSION"),
NULL NULL
); );
WMAddToPLArray(MenuRoot, MenuGroup); WMAddToPLArray(L1Menu, L2Menu);
WMAddToPLArray(RMenu, L1Menu);
/* Configuration-related items */ /* Configuration-related items */
MenuItem = WMCreatePLArray( L1Menu = WMCreatePLArray(
WMCreatePLString(_("Configure Window Maker")), WMCreatePLString(_("Configure Window Maker")),
WMCreatePLString("EXEC"), WMCreatePLString("EXEC"),
WMCreatePLString("WPrefs"), WMCreatePLString("WPrefs"),
NULL NULL
); );
WMAddToPLArray(MenuRoot, MenuItem); WMAddToPLArray(RMenu, L1Menu);
MenuItem = WMCreatePLArray( L1Menu = WMCreatePLArray(
WMCreatePLString(_("Info Panel")), WMCreatePLString(_("Info Panel")),
WMCreatePLString("INFO_PANEL"), WMCreatePLString("INFO_PANEL"),
NULL NULL
); );
WMAddToPLArray(MenuRoot, MenuItem); WMAddToPLArray(RMenu, L1Menu);
MenuItem = WMCreatePLArray( L1Menu = WMCreatePLArray(
WMCreatePLString(_("Restart")), WMCreatePLString(_("Restart")),
WMCreatePLString("RESTART"), WMCreatePLString("RESTART"),
NULL NULL
); );
WMAddToPLArray(MenuRoot, MenuItem); WMAddToPLArray(RMenu, L1Menu);
/* Other window managers */ /* Other window managers */
other_window_managers(); other_window_managers();
@@ -233,35 +259,45 @@ int main(int argc, char *argv[])
/* XLock */ /* XLock */
t = wfindfile(path, "xlock"); t = wfindfile(path, "xlock");
if (t) { if (t) {
MenuItem = WMCreatePLArray( L1Menu = WMCreatePLArray(
WMCreatePLString(_("Lock Screen")), WMCreatePLString(_("Lock Screen")),
WMCreatePLString("EXEC"), WMCreatePLString("EXEC"),
WMCreatePLString("xlock -allowroot -usefirst -mode matrix"), WMCreatePLString("xlock -allowroot -usefirst -mode matrix"),
NULL NULL
); );
WMAddToPLArray(MenuRoot, MenuItem); WMAddToPLArray(RMenu, L1Menu);
wfree(t); wfree(t);
} }
/* Exit */ /* Exit */
MenuItem = WMCreatePLArray( L1Menu = WMCreatePLArray(
WMCreatePLString(_("Exit Window Maker")), WMCreatePLString(_("Exit Window Maker")),
WMCreatePLString("EXIT"), WMCreatePLString("EXIT"),
NULL NULL
); );
WMAddToPLArray(MenuRoot, MenuItem); WMAddToPLArray(RMenu, L1Menu);
printf("%s", WMGetPropListDescription(MenuRoot, True)); printf("%s", WMGetPropListDescription(RMenu, True));
puts("");
return 0; 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; int i, argc;
char *t, **argv, buf[PATH_MAX]; 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; i = 0;
while (list[i]) { while (list[i]) {
@@ -269,67 +305,85 @@ static void find_and_write(char *group, char **list)
wtokensplit(list[i], &argv, &argc); wtokensplit(list[i], &argv, &argc);
t = wfindfile(path, argv[0]); t = wfindfile(path, argv[0]);
if (t) { if (t) {
/* check whether it is to be executed in a terminal */ /* find a terminal to be used for cmnds that need a terminal */
if (strcmp("!", argv[argc - 1]) < 0) if (this_is_terminals && !terminal)
SubGroupItem = WMCreatePLArray( terminal = wstrdup(list[i]);
if (*(argv[argc-1]) != '!') {
L3Menu = WMCreatePLArray(
WMCreatePLString(argv[0]), WMCreatePLString(argv[0]),
WMCreatePLString("EXEC"), WMCreatePLString("EXEC"),
WMCreatePLString(list[i]), WMCreatePLString(list[i]),
NULL NULL
); );
else { } else {
char comm[50], *ptr; char comm[PATH_MAX], *ptr;
strcpy(comm, list[i]); strcpy(comm, list[i]);
/* ugly hack to delete character ! from list[i] */ /* delete character " !" from the command */
ptr = strchr(comm, '!'); ptr = strchr(comm, '!');
while (ptr >= comm && (*ptr == '!' || isspace(*ptr))) while (ptr >= comm && (*ptr == '!' || isspace(*ptr)))
*ptr-- = '\0'; *ptr-- = '\0';
snprintf(buf, sizeof(buf), "xterm -e %s", comm); snprintf(buf, sizeof(buf), "%s -e %s", terminal ? terminal : "xterm" , comm);
SubGroupItem = WMCreatePLArray( L3Menu = WMCreatePLArray(
WMCreatePLString(argv[0]), WMCreatePLString(argv[0]),
WMCreatePLString("EXEC"), WMCreatePLString("EXEC"),
WMCreatePLString(comm), WMCreatePLString(buf),
NULL NULL
); );
} }
if (!SubGroup) if (!L2Menu)
SubGroup = WMCreatePLArray(WMCreatePLString(group), NULL); L2Menu = WMCreatePLArray(
WMAddToPLArray(SubGroup, SubGroupItem); WMCreatePLString(group),
NULL
);
WMAddToPLArray(L2Menu, L3Menu);
wfree(t); wfree(t);
} }
i++; i++;
} }
if (SubGroup) if (L2Menu)
WMAddToPLArray(MenuGroup, SubGroup); 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) static void other_window_managers(void)
{ {
int i; int i;
char *t, buf[PATH_MAX]; 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; i = 0;
while (other_wm[i]) { while (other_wm[i]) {
t = wfindfile(path, other_wm[i]); t = wfindfile(path, other_wm[i]);
if (t) { if (t) {
snprintf(buf, sizeof(buf), _("Start %s"), other_wm[i]); snprintf(buf, sizeof(buf), _("Start %s"), other_wm[i]);
SubGroupItem = WMCreatePLArray( L2Menu = WMCreatePLArray(
WMCreatePLString(buf), WMCreatePLString(buf),
WMCreatePLString("RESTART"), WMCreatePLString("RESTART"),
WMCreatePLString(other_wm[i]), WMCreatePLString(other_wm[i]),
NULL NULL
); );
if (!SubGroup) if (!L1Menu)
SubGroup = WMCreatePLArray(WMCreatePLString(_("Other Window Managers")), NULL); L1Menu = WMCreatePLArray(
WMAddToPLArray(SubGroup, SubGroupItem); WMCreatePLString(_("Other Window Managers")),
NULL
);
WMAddToPLArray(L1Menu, L2Menu);
wfree(t); wfree(t);
} }
i++; i++;
} }
if (SubGroup) if (L1Menu)
WMAddToPLArray(MenuRoot, SubGroup); WMAddToPLArray(RMenu, L1Menu);
} }
void print_help(int print_usage, int exitval) void print_help(int print_usage, int exitval)

View File

@@ -2,8 +2,7 @@
/* /*
* If the program should run from inside a terminal it has * If the program should run from inside a terminal it has
* to finish with a space followed by '!', e.g. * to end with a space followed by '!', e.g. "mutt !"
* "mutt !"
*/ */
char *terminals[MAX_NR_APPS] = { char *terminals[MAX_NR_APPS] = {