From 27773e1cb7492de080bd19189b4fcd2a6b9a0e9e Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 22 Apr 2007 15:22:25 +0000 Subject: [PATCH] don't grab the pointer during interactive events. this allows you to alt-tab during a dnd. --- openbox/client.c | 2 ++ openbox/event.c | 11 ++++++++--- openbox/focus.c | 6 ++++++ openbox/keyboard.c | 7 ++----- openbox/popup.c | 6 ++++++ 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/openbox/client.c b/openbox/client.c index e7af5701..86acafb1 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -507,6 +507,8 @@ void client_unmanage(ObClient *self) g_assert(self != NULL); frame_hide(self->frame); + /* sync to send the hide to the server quickly, and to get back the enter + events */ XSync(ob_display, FALSE); if (focus_client == self) { diff --git a/openbox/event.c b/openbox/event.c index 871b158a..502d1962 100644 --- a/openbox/event.c +++ b/openbox/event.c @@ -590,9 +590,10 @@ static void event_process(const XEvent *ec, gpointer data) NULL, g_direct_equal, NULL); if (e->type == ButtonPress || e->type == ButtonRelease || - e->type == MotionNotify) - mouse_event(client, e); - else if (e->type == KeyPress) { + e->type == MotionNotify) { + if (!keyboard_interactively_grabbed()) + mouse_event(client, e); + } else if (e->type == KeyPress) { keyboard_event((focus_cycle_target ? focus_cycle_target : (focus_hilite ? focus_hilite : client)), e); @@ -762,6 +763,8 @@ static void event_handle_client(ObClient *client, XEvent *e) frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: + if (keyboard_interactively_grabbed()) + break; if (config_focus_follow && config_focus_delay) ob_main_loop_timeout_remove_data(ob_main_loop, focus_delay_func, @@ -803,6 +806,8 @@ static void event_handle_client(ObClient *client, XEvent *e) frame_adjust_state(client->frame); break; case OB_FRAME_CONTEXT_FRAME: + if (keyboard_interactively_grabbed()) + break; if (e->xcrossing.mode == NotifyGrab || e->xcrossing.mode == NotifyUngrab) { diff --git a/openbox/focus.c b/openbox/focus.c index 197948e9..ea3d4fab 100644 --- a/openbox/focus.c +++ b/openbox/focus.c @@ -328,10 +328,16 @@ static void popup_cycle(ObClient *c, gboolean show) void focus_cycle_draw_indicator() { if (!focus_cycle_target) { + XEvent e; + XUnmapWindow(ob_display, focus_indicator.top.win); XUnmapWindow(ob_display, focus_indicator.left.win); XUnmapWindow(ob_display, focus_indicator.right.win); XUnmapWindow(ob_display, focus_indicator.bottom.win); + + /* kill enter events cause by this unmapping */ + XSync(ob_display, FALSE); + while (XCheckTypedEvent(ob_display, EnterNotify, &e)); } else { /* if (focus_cycle_target) diff --git a/openbox/keyboard.c b/openbox/keyboard.c index 248fd1ce..ba455955 100644 --- a/openbox/keyboard.c +++ b/openbox/keyboard.c @@ -164,10 +164,8 @@ gboolean keyboard_interactive_grab(guint state, ObClient *client, g_assert(action->data.any.interactive); if (!interactive_states) { - if (!grab_keyboard(TRUE)) - return FALSE; - if (!grab_pointer(TRUE, FALSE, OB_CURSOR_NONE)) { - grab_keyboard(FALSE); + if (!grab_keyboard(TRUE)) { + ob_debug("grab KEYBOARD failed\n"); return FALSE; } } @@ -195,7 +193,6 @@ void keyboard_interactive_end(ObInteractiveState *s, if (!interactive_states) { grab_keyboard(FALSE); - grab_pointer(FALSE, FALSE, OB_CURSOR_NONE); keyboard_reset_chains(); } } diff --git a/openbox/popup.c b/openbox/popup.c index e7fcbbe5..ee44ed23 100644 --- a/openbox/popup.c +++ b/openbox/popup.c @@ -213,8 +213,14 @@ void popup_show(ObPopup *self, gchar *text) void popup_hide(ObPopup *self) { if (self->mapped) { + XEvent e; + XUnmapWindow(ob_display, self->bg); self->mapped = FALSE; + + /* kill enter events cause by this unmapping */ + XSync(ob_display, FALSE); + while (XCheckTypedEvent(ob_display, EnterNotify, &e)); } } -- 2.45.2