Add a hook to unset the client in the open menu frame instead of closing it
authorMikael Magnusson <mikachu@gmail.com>
Mon, 18 Jan 2010 15:48:00 +0000 (16:48 +0100)
committerDana Jansens <danakj@orodu.net>
Thu, 28 Jan 2010 13:40:07 +0000 (08:40 -0500)
Also nukes menu_frame_hide_all_client() as it is now unused.

openbox/client_menu.c
openbox/menu.c
openbox/menuframe.c

index 18f847e..e70e6c0 100644 (file)
@@ -118,7 +118,8 @@ static void client_menu_execute(ObMenuEntry *e, ObMenuFrame *f,
     gint x, y;
     gulong ignore_start;
 
-    g_assert(c);
+    if (!c)
+        return;
 
     if (!config_focus_under_mouse)
         ignore_start = event_start_ignore_all_enters();
index 634a0d9..ac28ade 100644 (file)
@@ -58,13 +58,6 @@ static gunichar parse_shortcut(const gchar *label, gboolean allow_shortcut,
                                gchar **strippedlabel, guint *position,
                                gboolean *always_show);
 
-static void client_dest(ObClient *client, gpointer data)
-{
-    /* menus can be associated with a client, so close any that are since
-       we are disappearing now */
-    menu_frame_hide_all_client(client);
-}
-
 void menu_startup(gboolean reconfig)
 {
     gboolean loaded = FALSE;
@@ -114,16 +107,10 @@ void menu_startup(gboolean reconfig)
     }
 
     g_assert(menu_parse_state.parent == NULL);
-
-    if (!reconfig)
-        client_add_destroy_notify(client_dest, NULL);
 }
 
 void menu_shutdown(gboolean reconfig)
 {
-    if (!reconfig)
-        client_remove_destroy_notify(client_dest);
-
     obt_xml_instance_unref(menu_parse_inst);
     menu_parse_inst = NULL;
 
index afffc83..4ee5d31 100644 (file)
@@ -61,6 +61,19 @@ static Window createWindow(Window parent, gulong mask,
                          RrVisual(ob_rr_inst), mask, attrib);
 }
 
+static void client_dest(ObClient *client, gpointer data)
+{
+    GList *it;
+
+    /* menus can be associated with a client, so null those refs since
+       we are disappearing now */
+    for (it = menu_frame_visible; it; it = g_list_next(it)) {
+        ObMenuFrame *f = it->data;
+        if (f->client == client)
+            f->client = NULL;
+    }
+}
+
 void menu_frame_startup(gboolean reconfig)
 {
     gint i;
@@ -75,6 +88,7 @@ void menu_frame_startup(gboolean reconfig)
 
     if (reconfig) return;
 
+    client_add_destroy_notify(client_dest, NULL);
     menu_frame_map = g_hash_table_new(g_int_hash, g_int_equal);
 }
 
@@ -84,6 +98,7 @@ void menu_frame_shutdown(gboolean reconfig)
 
     if (reconfig) return;
 
+    client_remove_destroy_notify(client_dest);
     g_hash_table_destroy(menu_frame_map);
 }
 
@@ -1090,22 +1105,6 @@ void menu_frame_hide_all(void)
         menu_frame_hide(it->data);
 }
 
-void menu_frame_hide_all_client(ObClient *client)
-{
-    GList *it = g_list_last(menu_frame_visible);
-    if (it) {
-        ObMenuFrame *f = it->data;
-        if (f->client == client) {
-            if (config_submenu_show_delay) {
-                /* remove any submenu open requests */
-                obt_main_loop_timeout_remove(ob_main_loop,
-                                             submenu_show_timeout);
-            }
-            menu_frame_hide(f);
-        }
-    }
-}
-
 ObMenuFrame* menu_frame_under(gint x, gint y)
 {
     ObMenuFrame *ret = NULL;