cache pipe menus until the menus close

This commit is contained in:
Dana Jansens 2007-06-10 18:48:58 +00:00
parent e437dff20c
commit 6a79805b7c
3 changed files with 25 additions and 5 deletions

View file

@ -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);

View file

@ -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);

View file

@ -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();
} }