]> Dogcows Code - chaz/openbox/blobdiff - openbox/menu.c
cache pipe menus until the menus close
[chaz/openbox] / openbox / menu.c
index 21c00a314131883bd33ee116fe742e24e2423e59..344e1a5a1ea49b2ac97cfadcbac13d2fed1ff133 100644 (file)
@@ -134,7 +134,22 @@ void menu_shutdown(gboolean reconfig)
 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 @@ void menu_pipe_execute(ObMenu *self)
 
     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 @@ void menu_pipe_execute(ObMenu *self)
     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);
This page took 0.021582 seconds and 4 git commands to generate.