From: Dana Jansens Date: Wed, 10 Sep 2003 19:37:52 +0000 (+0000) Subject: make menu hiding-on-release based on a timer rather than on where it is released... X-Git-Url: https://git.brokenzipper.com/gitweb?a=commitdiff_plain;h=0453a1dbedddadddf31c8ca40e1326e7c34d6362;p=chaz%2Fopenbox make menu hiding-on-release based on a timer rather than on where it is released (on the frame border) --- diff --git a/openbox/event.c b/openbox/event.c index b5ad2924..f5b2ec48 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -45,6 +45,8 @@ static void event_handle_client(ObClient *c, XEvent *e); static gboolean focus_delay_func(gpointer data); static void focus_delay_client_dest(gpointer data); +static gboolean menu_hide_delay_func(gpointer data); + #define INVALID_FOCUSIN(e) ((e)->xfocus.detail == NotifyInferior || \ (e)->xfocus.detail == NotifyAncestor || \ (e)->xfocus.detail > NotifyNonlinearVirtual) @@ -70,6 +72,8 @@ static int mask_table_size; static ObClient *focus_delay_client; +static gboolean menu_can_hide; + #ifdef USE_SM static void ice_handler(int fd, gpointer conn) { @@ -492,6 +496,12 @@ static void event_process(const XEvent *ec, gpointer data) if (moveresize_in_progress) moveresize_event(e); + menu_can_hide = FALSE; + ob_main_loop_timeout_add(ob_main_loop, + G_USEC_PER_SEC / 4, + menu_hide_delay_func, + NULL, NULL); + if (e->type == ButtonPress || e->type == ButtonRelease || e->type == MotionNotify) mouse_event(client, e); @@ -1122,14 +1132,11 @@ static void event_handle_menu(XEvent *ev) switch (ev->type) { case ButtonRelease: - if (!(f = menu_frame_under(ev->xbutton.x_root, - ev->xbutton.y_root))) + if ((e = menu_entry_frame_under(ev->xbutton.x_root, + ev->xbutton.y_root))) + menu_entry_frame_execute(e, ev->xbutton.state); + else if (menu_can_hide) menu_frame_hide_all(); - else { - if ((e = menu_entry_frame_under(ev->xbutton.x_root, - ev->xbutton.y_root))) - menu_entry_frame_execute(e, ev->xbutton.state); - } break; case MotionNotify: if ((f = menu_frame_under(ev->xmotion.x_root, @@ -1168,6 +1175,12 @@ static void event_handle_menu(XEvent *ev) } } +static gboolean menu_hide_delay_func(gpointer data) +{ + menu_can_hide = TRUE; + return FALSE; /* no repeat */ +} + static gboolean focus_delay_func(gpointer data) { client_focus(focus_delay_client);