From b0aa29db6973d3a052980459c413c1c193bcc671 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sat, 2 Jun 2007 19:14:32 +0000 Subject: [PATCH] do the menu_can_hide thing properly. was such a hack before? and the variable was getting set from all kinds of events like motion notify. totally not reliable. now it works all nice. --- openbox/event.c | 19 ++----------------- openbox/menu.c | 23 +++++++++++++++++++++++ openbox/menu.h | 1 + 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/openbox/event.c b/openbox/event.c index 5d29dc97..6b372a85 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -93,13 +93,10 @@ static gboolean focus_delay_cmp(gconstpointer d1, gconstpointer d2); static gboolean focus_delay_func(gpointer data); static void focus_delay_client_dest(ObClient *client, gpointer data); -static gboolean menu_hide_delay_func(gpointer data); - /* The time for the current event being processed */ Time event_curtime = CurrentTime; static guint ignore_enter_focus = 0; -static gboolean menu_can_hide; static gboolean focus_left_screen = FALSE; #ifdef USE_SM @@ -1706,8 +1703,8 @@ static gboolean event_handle_menu(XEvent *ev) switch (ev->type) { case ButtonRelease: - if ((ev->xbutton.button < 4 || ev->xbutton.button > 5) - && menu_can_hide) + if (menu_hide_delay_reached() && + (ev->xbutton.button < 4 || ev->xbutton.button > 5)) { if ((e = menu_entry_frame_under(ev->xbutton.x_root, ev->xbutton.y_root))) @@ -1783,12 +1780,6 @@ static void event_handle_user_input(ObClient *client, XEvent *e) moved/resized */ client = moveresize_client; - menu_can_hide = FALSE; - ob_main_loop_timeout_add(ob_main_loop, - config_menu_hide_delay * 1000, - menu_hide_delay_func, - NULL, g_direct_equal, NULL); - if (e->type == ButtonPress || e->type == ButtonRelease || e->type == MotionNotify) @@ -1804,12 +1795,6 @@ static void event_handle_user_input(ObClient *client, XEvent *e) } } -static gboolean menu_hide_delay_func(gpointer data) -{ - menu_can_hide = TRUE; - return FALSE; /* no repeat */ -} - static void focus_delay_dest(gpointer data) { g_free(data); diff --git a/openbox/menu.c b/openbox/menu.c index 6a217fc6..21c00a31 100644 --- a/openbox/menu.c +++ b/openbox/menu.c @@ -20,6 +20,7 @@ #include "debug.h" #include "menu.h" #include "openbox.h" +#include "mainloop.h" #include "stacking.h" #include "client.h" #include "config.h" @@ -45,6 +46,7 @@ struct _ObMenuParseState static GHashTable *menu_hash = NULL; static ObParseInst *menu_parse_inst; static ObMenuParseState menu_parse_state; +static gboolean menu_can_hide = FALSE; static void menu_destroy_hash_value(ObMenu *self); static void parse_menu_item(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, @@ -384,6 +386,12 @@ void menu_free(ObMenu *menu) g_hash_table_remove(menu_hash, menu->name); } +static gboolean menu_hide_delay_func(gpointer data) +{ + menu_can_hide = TRUE; + return FALSE; /* no repeat */ +} + void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client) { ObMenu *self; @@ -420,6 +428,21 @@ void menu_show(gchar *name, gint x, gint y, gint button, ObClient *client) break; } } + + if (!button) + menu_can_hide = TRUE; + else { + menu_can_hide = FALSE; + ob_main_loop_timeout_add(ob_main_loop, + config_menu_hide_delay * 1000, + menu_hide_delay_func, + NULL, g_direct_equal, NULL); + } +} + +gboolean menu_hide_delay_reached() +{ + return menu_can_hide; } static ObMenuEntry* menu_entry_new(ObMenu *menu, ObMenuEntryType type, gint id) diff --git a/openbox/menu.h b/openbox/menu.h index 6d4bbd47..591dfb65 100644 --- a/openbox/menu.h +++ b/openbox/menu.h @@ -172,6 +172,7 @@ void menu_show_all_shortcuts(ObMenu *self, gboolean show); void menu_show(gchar *name, gint x, gint y, gint button, struct _ObClient *client); +gboolean menu_hide_delay_reached(); void menu_set_show_func(ObMenu *menu, ObMenuShowFunc func); void menu_set_hide_func(ObMenu *menu, ObMenuHideFunc func); -- 2.39.2