summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
Diffstat (limited to 'openbox')
-rw-r--r--openbox/event.c7
-rw-r--r--openbox/menu.c11
2 files changed, 11 insertions, 7 deletions
diff --git a/openbox/event.c b/openbox/event.c
index b59707bb..8e0a6bb3 100644
--- a/openbox/event.c
+++ b/openbox/event.c
@@ -1792,8 +1792,9 @@ static gboolean event_handle_menu_input(XEvent *ev)
if (ev->type == ButtonRelease || ev->type == ButtonPress) {
ObMenuEntryFrame *e;
- if (menu_hide_delay_reached() &&
- (ev->xbutton.button < 4 || ev->xbutton.button > 5))
+ if ((ev->xbutton.button < 4 || ev->xbutton.button > 5) &&
+ ((ev->type == ButtonRelease && menu_hide_delay_reached()) ||
+ ev->type == ButtonPress))
{
if ((e = menu_entry_frame_under(ev->xbutton.x_root,
ev->xbutton.y_root)))
@@ -1804,7 +1805,7 @@ static gboolean event_handle_menu_input(XEvent *ev)
if (ev->type == ButtonRelease)
menu_entry_frame_execute(e, ev->xbutton.state);
}
- else if (ev->type == ButtonRelease)
+ else
menu_frame_hide_all();
}
ret = TRUE;
diff --git a/openbox/menu.c b/openbox/menu.c
index 374aeec1..a4f62f6c 100644
--- a/openbox/menu.c
+++ b/openbox/menu.c
@@ -49,6 +49,7 @@ static GHashTable *menu_hash = NULL;
static ObtXmlInst *menu_parse_inst;
static ObMenuParseState menu_parse_state;
static gboolean menu_can_hide = FALSE;
+static guint menu_timeout_id = 0;
static void menu_destroy_hash_value(ObMenu *self);
static void parse_menu_item(xmlNodePtr node, gpointer data);
@@ -437,6 +438,7 @@ void menu_free(ObMenu *menu)
static gboolean menu_hide_delay_func(gpointer data)
{
menu_can_hide = TRUE;
+ menu_timeout_id = 0;
return FALSE; /* no repeat */
}
@@ -486,10 +488,11 @@ void menu_show(gchar *name, gint x, gint y, gboolean mouse, ObClient *client)
menu_can_hide = TRUE;
else {
menu_can_hide = FALSE;
- g_timeout_add_full(G_PRIORITY_DEFAULT,
- config_menu_hide_delay,
- menu_hide_delay_func,
- NULL, NULL);
+ if (menu_timeout_id) g_source_remove(menu_timeout_id);
+ menu_timeout_id = g_timeout_add_full(G_PRIORITY_DEFAULT,
+ config_menu_hide_delay,
+ menu_hide_delay_func,
+ NULL, NULL);
}
}
}