]> Dogcows Code - chaz/openbox/commitdiff
cache pipe menus until the menus close
authorDana Jansens <danakj@orodu.net>
Sun, 10 Jun 2007 18:48:58 +0000 (18:48 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 10 Jun 2007 18:48:58 +0000 (18:48 +0000)
openbox/menu.c
openbox/menu.h
openbox/menuframe.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);
index 591dfb65eb67df1b3f0d824c2f79dfaccc08d828..6288d870e9cd22ea66cf9725b5989e6f221e5223 100644 (file)
@@ -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);
 
index 654cf2ba611932012f62394b10950a2ef8093758..fa9e8e9d9ab1ab59e1c93a9670f2615c663232e2 100644 (file)
@@ -1058,6 +1058,8 @@ void menu_frame_hide_all()
     }
     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 @@ void menu_frame_hide_all_client(ObClient *client)
         if (f->client == client)
             menu_frame_hide(f);
     }
+
+    menu_clear_pipe_caches();
 }
 
 
This page took 0.027325 seconds and 4 git commands to generate.