Allow selecting menu entries during menuHideDelay if you click again, bug 5501
authorMikael Magnusson <mikachu@gmail.com>
Wed, 5 Nov 2014 08:58:57 +0000 (09:58 +0100)
committerMikael Magnusson <mikachu@gmail.com>
Wed, 5 Nov 2014 08:59:09 +0000 (09:59 +0100)
openbox/event.c
openbox/menu.c
openbox/menu.h

index be42ddb..5774f67 100644 (file)
@@ -1836,8 +1836,14 @@ static gboolean event_handle_menu_input(XEvent *ev)
             if ((e = menu_entry_frame_under(ev->xbutton.x_root,
                                             ev->xbutton.y_root)))
             {
-                if (ev->type == ButtonPress && e->frame->child)
-                    menu_frame_select(e->frame->child, NULL, TRUE);
+                if (ev->type == ButtonPress) {
+                    /* We know this is a new press, so we don't have to
+                     * block release events anymore */
+                    menu_hide_delay_reset();
+
+                    if (e->frame->child)
+                        menu_frame_select(e->frame->child, NULL, TRUE);
+                }
                 menu_frame_select(e->frame, e, TRUE);
                 if (ev->type == ButtonRelease)
                     menu_entry_frame_execute(e, ev->xbutton.state);
index ae69acb..8804e12 100644 (file)
@@ -454,6 +454,7 @@ static gboolean menu_hide_delay_func(gpointer data)
 {
     menu_can_hide = TRUE;
     menu_timeout_id = 0;
+
     return FALSE; /* no repeat */
 }
 
@@ -518,6 +519,12 @@ gboolean menu_hide_delay_reached(void)
     return menu_can_hide;
 }
 
+void menu_hide_delay_reset(void)
+{
+    if (menu_timeout_id) g_source_remove(menu_timeout_id);
+    menu_hide_delay_func(NULL);
+}
+
 static ObMenuEntry* menu_entry_new(ObMenu *menu, ObMenuEntryType type, gint id)
 {
     ObMenuEntry *self;
index 3f5d024..8c2ecd7 100644 (file)
@@ -185,6 +185,7 @@ void menu_show(gchar *name, const GravityPoint *pos, gint monitor,
                gboolean mouse, gboolean user_positioned,
                struct _ObClient *client);
 gboolean menu_hide_delay_reached(void);
+void menu_hide_delay_reset(void);
 
 /*! The show function is called right after a menu is shown */
 void menu_set_show_func(ObMenu *menu, ObMenuShowFunc func);