cache pipe menus until the menus close
This commit is contained in:
parent
e437dff20c
commit
6a79805b7c
3 changed files with 25 additions and 5 deletions
|
@ -134,7 +134,22 @@ void menu_shutdown(gboolean reconfig)
|
||||||
static gboolean menu_pipe_submenu(gpointer key, gpointer val, gpointer data)
|
static gboolean menu_pipe_submenu(gpointer key, gpointer val, gpointer data)
|
||||||
{
|
{
|
||||||
ObMenu *menu = val;
|
ObMenu *menu = val;
|
||||||
return menu->pipe_creator == data;
|
return menu->pipe_creator != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void clear_cache(gpointer key, gpointer val, gpointer data)
|
||||||
|
{
|
||||||
|
ObMenu *menu = val;
|
||||||
|
if (menu->execute)
|
||||||
|
menu_clear_entries(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
void menu_clear_pipe_caches()
|
||||||
|
{
|
||||||
|
/* delete any pipe menus' submenus */
|
||||||
|
g_hash_table_foreach_remove(menu_hash, menu_pipe_submenu, NULL);
|
||||||
|
/* empty the top level pipe menus */
|
||||||
|
g_hash_table_foreach(menu_hash, clear_cache, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_pipe_execute(ObMenu *self)
|
void menu_pipe_execute(ObMenu *self)
|
||||||
|
@ -146,6 +161,8 @@ void menu_pipe_execute(ObMenu *self)
|
||||||
|
|
||||||
if (!self->execute)
|
if (!self->execute)
|
||||||
return;
|
return;
|
||||||
|
if (self->entries) /* the entries are already created and cached */
|
||||||
|
return;
|
||||||
|
|
||||||
if (!g_spawn_command_line_sync(self->execute, &output, NULL, NULL, &err)) {
|
if (!g_spawn_command_line_sync(self->execute, &output, NULL, NULL, &err)) {
|
||||||
g_message(_("Failed to execute command for pipe-menu '%s': %s"),
|
g_message(_("Failed to execute command for pipe-menu '%s': %s"),
|
||||||
|
@ -157,9 +174,6 @@ void menu_pipe_execute(ObMenu *self)
|
||||||
if (parse_load_mem(output, strlen(output),
|
if (parse_load_mem(output, strlen(output),
|
||||||
"openbox_pipe_menu", &doc, &node))
|
"openbox_pipe_menu", &doc, &node))
|
||||||
{
|
{
|
||||||
g_hash_table_foreach_remove(menu_hash, menu_pipe_submenu, self);
|
|
||||||
menu_clear_entries(self);
|
|
||||||
|
|
||||||
menu_parse_state.pipe_creator = self;
|
menu_parse_state.pipe_creator = self;
|
||||||
menu_parse_state.parent = self;
|
menu_parse_state.parent = self;
|
||||||
parse_tree(menu_parse_inst, doc, node->children);
|
parse_tree(menu_parse_inst, doc, node->children);
|
||||||
|
|
|
@ -165,8 +165,10 @@ ObMenu* menu_new(const gchar *name, const gchar *title,
|
||||||
gboolean allow_shortcut_selection, gpointer data);
|
gboolean allow_shortcut_selection, gpointer data);
|
||||||
void menu_free(ObMenu *menu);
|
void menu_free(ObMenu *menu);
|
||||||
|
|
||||||
/* Repopulate a pipe-menu by running its command */
|
/*! Repopulate a pipe-menu by running its command */
|
||||||
void menu_pipe_execute(ObMenu *self);
|
void menu_pipe_execute(ObMenu *self);
|
||||||
|
/*! Clear a pipe-menu's entries */
|
||||||
|
void menu_clear_pipe_caches();
|
||||||
|
|
||||||
void menu_show_all_shortcuts(ObMenu *self, gboolean show);
|
void menu_show_all_shortcuts(ObMenu *self, gboolean show);
|
||||||
|
|
||||||
|
|
|
@ -1058,6 +1058,8 @@ void menu_frame_hide_all()
|
||||||
}
|
}
|
||||||
if ((it = g_list_last(menu_frame_visible)))
|
if ((it = g_list_last(menu_frame_visible)))
|
||||||
menu_frame_hide(it->data);
|
menu_frame_hide(it->data);
|
||||||
|
|
||||||
|
menu_clear_pipe_caches();
|
||||||
}
|
}
|
||||||
|
|
||||||
void menu_frame_hide_all_client(ObClient *client)
|
void menu_frame_hide_all_client(ObClient *client)
|
||||||
|
@ -1068,6 +1070,8 @@ void menu_frame_hide_all_client(ObClient *client)
|
||||||
if (f->client == client)
|
if (f->client == client)
|
||||||
menu_frame_hide(f);
|
menu_frame_hide(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
menu_clear_pipe_caches();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue