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:
committed by
Carlos R. Mafra
parent
68f70da310
commit
68a55be998
248
util/wmgenmenu.c
248
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)
|
||||
|
||||
@@ -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] = {
|
||||
|
||||
Reference in New Issue
Block a user