mirror of
https://github.com/gryf/wmaker.git
synced 2025-12-20 12:58:08 +01:00
Add OPEN_PLMENU option to parse command generated proplist style menus
This patch adds the OPEN_PLMENU options which behaves similar to OPEN_MENU but
can be used to parse command generated proplists. This can be used e.g. in
conjunction with wmmenugen like:
(
"Generated PL Submenu",
OPEN_PLMENU,
"|| find /usr/share/applications -type f -name '*desktop' | xargs
wmmenugen -parser:xdg"
)
v2: code cleanup
This commit is contained in:
committed by
Carlos R. Mafra
parent
cc69d2aae3
commit
c21ae6b580
101
src/rootmenu.c
101
src/rootmenu.c
@@ -63,6 +63,7 @@ extern Cursor wCursor[WCUR_LAST];
|
|||||||
extern WPreferences wPreferences;
|
extern WPreferences wPreferences;
|
||||||
|
|
||||||
static WMenu *readMenuPipe(WScreen * scr, char **file_name);
|
static WMenu *readMenuPipe(WScreen * scr, char **file_name);
|
||||||
|
static WMenu *readPLMenuPipe(WScreen * scr, char **file_name);
|
||||||
static WMenu *readMenuFile(WScreen * scr, char *file_name);
|
static WMenu *readMenuFile(WScreen * scr, char *file_name);
|
||||||
static WMenu *readMenuDirectory(WScreen * scr, char *title, char **file_name, char *command);
|
static WMenu *readMenuDirectory(WScreen * scr, char *title, char **file_name, char *command);
|
||||||
static WMenu *configureMenu(WScreen * scr, WMPropList * definition, Bool includeGlobals);
|
static WMenu *configureMenu(WScreen * scr, WMPropList * definition, Bool includeGlobals);
|
||||||
@@ -119,6 +120,12 @@ static Shortcut *shortcutList = NULL;
|
|||||||
* command must be a valid menu description.
|
* command must be a valid menu description.
|
||||||
* The space between '|' and command is optional.
|
* The space between '|' and command is optional.
|
||||||
* || will do the same, but will not cache the contents.
|
* || will do the same, but will not cache the contents.
|
||||||
|
* OPEN_PLMENU | command
|
||||||
|
* - opens command and uses its stdout which must be in proplist
|
||||||
|
* fromat to construct and insert the resulting menu in current
|
||||||
|
* position.
|
||||||
|
* The space between '|' and command is optional.
|
||||||
|
* || will do the same, but will not cache the contents.
|
||||||
* SAVE_SESSION - saves the current state of the desktop, which include
|
* SAVE_SESSION - saves the current state of the desktop, which include
|
||||||
* all running applications, all their hints (geometry,
|
* all running applications, all their hints (geometry,
|
||||||
* position on screen, workspace they live on, the dock
|
* position on screen, workspace they live on, the dock
|
||||||
@@ -574,6 +581,8 @@ static WMenu *constructPLMenu(WScreen *screen, char *path)
|
|||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void constructMenu(WMenu * menu, WMenuEntry * entry)
|
static void constructMenu(WMenu * menu, WMenuEntry * entry)
|
||||||
{
|
{
|
||||||
WMenu *submenu;
|
WMenu *submenu;
|
||||||
@@ -696,6 +705,53 @@ static void constructMenu(WMenu * menu, WMenuEntry * entry)
|
|||||||
wfree(cmd);
|
wfree(cmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void constructPLMenuFromPipe(WMenu * menu, WMenuEntry * entry)
|
||||||
|
{
|
||||||
|
WMenu *submenu = NULL;
|
||||||
|
char **path;
|
||||||
|
char *cmd;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
separateCommand((char *)entry->clientdata, &path, &cmd);
|
||||||
|
if (path == NULL || *path == NULL || **path == 0) {
|
||||||
|
wwarning(_("invalid OPEN_PLMENU specification: %s"),
|
||||||
|
(char *)entry->clientdata);
|
||||||
|
if (cmd)
|
||||||
|
wfree(cmd);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (path[0][0] == '|') {
|
||||||
|
/* pipe menu */
|
||||||
|
|
||||||
|
if (!menu->cascades[entry->cascade]
|
||||||
|
|| menu->cascades[entry->cascade]->timestamp == 0) {
|
||||||
|
/* parse pipe */
|
||||||
|
submenu = readPLMenuPipe(menu->frame->screen_ptr, path);
|
||||||
|
|
||||||
|
if (submenu != NULL) {
|
||||||
|
if (path[0][1] == '|')
|
||||||
|
submenu->timestamp = 0;
|
||||||
|
else
|
||||||
|
submenu->timestamp = 1; /* there's no automatic reloading */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (submenu) {
|
||||||
|
wMenuEntryRemoveCascade(menu, entry);
|
||||||
|
wMenuEntrySetCascade(menu, entry, submenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (path[i] != NULL)
|
||||||
|
wfree(path[i++]);
|
||||||
|
|
||||||
|
wfree(path);
|
||||||
|
if (cmd)
|
||||||
|
wfree(cmd);
|
||||||
|
|
||||||
|
}
|
||||||
static void cleanupWorkspaceMenu(WMenu * menu)
|
static void cleanupWorkspaceMenu(WMenu * menu)
|
||||||
{
|
{
|
||||||
if (menu->frame->screen_ptr->workspace_menu == menu)
|
if (menu->frame->screen_ptr->workspace_menu == menu)
|
||||||
@@ -787,6 +843,23 @@ static WMenuEntry *addMenuEntry(WMenu * menu, char *title, char *shortcut, char
|
|||||||
entry->free_cdata = wfree;
|
entry->free_cdata = wfree;
|
||||||
wMenuEntrySetCascade(menu, entry, dummy);
|
wMenuEntrySetCascade(menu, entry, dummy);
|
||||||
}
|
}
|
||||||
|
} else if (strcmp(command, "OPEN_PLMENU") == 0) {
|
||||||
|
if (!params) {
|
||||||
|
wwarning(_("%s:missing parameter for menu command \"%s\""), file_name, command);
|
||||||
|
} else {
|
||||||
|
WMenu *dummy;
|
||||||
|
char *path;
|
||||||
|
|
||||||
|
path = wfindfile(DEF_CONFIG_PATHS, params);
|
||||||
|
if (!path)
|
||||||
|
path = wstrdup(params);
|
||||||
|
|
||||||
|
dummy = wMenuCreate(scr, title, False);
|
||||||
|
dummy->on_destroy = removeShortcutsForMenu;
|
||||||
|
entry = wMenuAddCallback(menu, title, constructPLMenuFromPipe, path);
|
||||||
|
entry->free_cdata = wfree;
|
||||||
|
wMenuEntrySetCascade(menu, entry, dummy);
|
||||||
|
}
|
||||||
} else if (strcmp(command, "EXEC") == 0) {
|
} else if (strcmp(command, "EXEC") == 0) {
|
||||||
if (!params)
|
if (!params)
|
||||||
wwarning(_("%s:missing parameter for menu command \"%s\""), file_name, command);
|
wwarning(_("%s:missing parameter for menu command \"%s\""), file_name, command);
|
||||||
@@ -980,6 +1053,34 @@ static WMenu *readMenuFile(WScreen * scr, char *file_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/************ Menu Configuration From Pipe *************/
|
/************ Menu Configuration From Pipe *************/
|
||||||
|
static WMenu *readPLMenuPipe(WScreen * scr, char **file_name)
|
||||||
|
{
|
||||||
|
WMPropList *plist = NULL;
|
||||||
|
WMenu *menu = NULL;
|
||||||
|
char *filename;
|
||||||
|
char flat_file[MAXLINE];
|
||||||
|
int i;
|
||||||
|
|
||||||
|
flat_file[0] = '\0';
|
||||||
|
|
||||||
|
for (i = 0; file_name[i] != NULL; i++) {
|
||||||
|
strcat(flat_file, file_name[i]);
|
||||||
|
strcat(flat_file, " ");
|
||||||
|
}
|
||||||
|
filename = flat_file + (flat_file[1] == '|' ? 2 : 1);
|
||||||
|
|
||||||
|
plist = WMReadPropListFromPipe(filename);
|
||||||
|
|
||||||
|
if (!plist)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
menu = configureMenu(scr, plist, False);
|
||||||
|
if (!menu)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
menu->on_destroy = removeShortcutsForMenu;
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
|
||||||
static WMenu *readMenuPipe(WScreen * scr, char **file_name)
|
static WMenu *readMenuPipe(WScreen * scr, char **file_name)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user