X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fevent.c;h=22a074fd462cfe420cc6864b114a5868f3134f3b;hb=be15e8c01c49327ff328e44bced78b220e16f132;hp=79d350775ed43be0fc2364f37b581928f25af560;hpb=8fe0cb8989c1fe12b30b9030b446345f25340d35;p=chaz%2Fopenbox diff --git a/openbox/event.c b/openbox/event.c index 79d35077..22a074fd 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) { @@ -488,10 +492,16 @@ static void event_process(const XEvent *ec, gpointer data) if (menu_frame_visible) event_handle_menu(e); else { - if (!keyboard_process_interactive_grab(e)) { + if (!keyboard_process_interactive_grab(e, &client)) { 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); @@ -500,7 +510,8 @@ static void event_process(const XEvent *ec, gpointer data) causes the window which appears to be focused to be the one on which the actions will be executed */ keyboard_event((focus_cycle_target ? - focus_cycle_target : client), e); + focus_cycle_target : + (client ? client : focus_client)), e); } } } @@ -570,7 +581,9 @@ static void event_handle_client(ObClient *client, XEvent *e) /* Wheel buttons don't draw because they are an instant click, so it is a waste of resources to go drawing it. */ if (!(e->xbutton.button == 4 || e->xbutton.button == 5)) { - switch (frame_context(client, e->xbutton.window)) { + con = frame_context(client, e->xbutton.window); + con = mouse_button_frame_context(con, e->xbutton.button); + switch (con) { case OB_FRAME_CONTEXT_MAXIMIZE: client->frame->max_press = (e->type == ButtonPress); framerender_frame(client->frame); @@ -1121,14 +1134,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, @@ -1167,6 +1177,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);