all repos — openbox @ 6a79805b7c4116ee6ced87e78fb488f3274098ef

openbox fork - make it a bit more like ryudo

cache pipe menus until the menus close
Dana Jansens danakj@orodu.net
commit

6a79805b7c4116ee6ced87e78fb488f3274098ef

parent

e437dff20ca687a67b7ef3e9328b4045c25d0eb5

3 files changed, 25 insertions(+), 5 deletions(-)

jump to
M openbox/menu.copenbox/menu.c

@@ -134,7 +134,22 @@

static gboolean menu_pipe_submenu(gpointer key, gpointer val, gpointer data) { 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)

@@ -146,6 +161,8 @@ GError *err = NULL;

if (!self->execute) return; + if (self->entries) /* the entries are already created and cached */ + return; if (!g_spawn_command_line_sync(self->execute, &output, NULL, NULL, &err)) { g_message(_("Failed to execute command for pipe-menu '%s': %s"),

@@ -157,9 +174,6 @@

if (parse_load_mem(output, strlen(output), "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.parent = self; parse_tree(menu_parse_inst, doc, node->children);
M openbox/menu.hopenbox/menu.h

@@ -165,8 +165,10 @@ ObMenu* menu_new(const gchar *name, const gchar *title,

gboolean allow_shortcut_selection, gpointer data); 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); +/*! Clear a pipe-menu's entries */ +void menu_clear_pipe_caches(); void menu_show_all_shortcuts(ObMenu *self, gboolean show);
M openbox/menuframe.copenbox/menuframe.c

@@ -1058,6 +1058,8 @@ menu_entry_frame_submenu_timeout);

} if ((it = g_list_last(menu_frame_visible))) menu_frame_hide(it->data); + + menu_clear_pipe_caches(); } void menu_frame_hide_all_client(ObClient *client)

@@ -1068,6 +1070,8 @@ ObMenuFrame *f = it->data;

if (f->client == client) menu_frame_hide(f); } + + menu_clear_pipe_caches(); }