]> Dogcows Code - chaz/openbox/blobdiff - openbox/menu.c
let you lower a window without lowering its children, or its siblings
[chaz/openbox] / openbox / menu.c
index 21c00a314131883bd33ee116fe742e24e2423e59..c82eab8033f323899407e48b88575be0022a8bf1 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);
@@ -410,6 +424,9 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client)
 
     menu_frame_hide_all();
 
+    /* clear the pipe menus when showing a new menu */
+    menu_clear_pipe_caches();
+
     frame = menu_frame_new(self, 0, client);
     if (!menu_frame_show_topmenu(frame, x, y, button))
         menu_frame_free(frame);
This page took 0.021885 seconds and 4 git commands to generate.