From: Dana Jansens Date: Sun, 13 May 2007 15:29:49 +0000 (+0000) Subject: don't allow focus to move during an interactive grab. if users set up actions X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=56d7bc50f0da9fe694b20751fa67aaa7e9158967;p=chaz%2Fopenbox don't allow focus to move during an interactive grab. if users set up actions such that this would happen, then kill the interactive grab before moving focus. this is to avoid NotifyWhileGrabbed FocusOut's --- diff --git a/openbox/client.c b/openbox/client.c index 73696c89..7a01e510 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -3397,6 +3397,16 @@ gboolean client_focus(ObClient *self) "Focusing client \"%s\" at time %u\n", self->title, event_curtime); + /* if there is a grab going on, then we need to cancel it. if we move + focus during the grab, applications will get NotifyWhileGrabbed events + and ignore them ! + + actions should not rely on being able to move focus during an + interactive grab. + */ + if (keyboard_interactively_grabbed()) + keyboard_interactive_cancel(); + if (self->can_focus) { /* This can cause a BadMatch error with CurrentTime, or if an app passed in a bad time for _NET_WM_ACTIVE_WINDOW. */ diff --git a/openbox/keyboard.c b/openbox/keyboard.c index 1534e198..5cfd4571 100644 --- a/openbox/keyboard.c +++ b/openbox/keyboard.c @@ -199,11 +199,13 @@ static void keyboard_interactive_end(guint state, gboolean cancel, Time time, if (ungrab) grab_keyboard(FALSE); + /* set this before running the actions so they know the keyboard is not + grabbed */ + istate.active = FALSE; + alist = g_slist_append(NULL, istate.action); action_run_interactive(alist, istate.client, state, time, cancel, TRUE); g_slist_free(alist); - - istate.active = FALSE; } static void keyboard_interactive_end_client(ObClient *client, gpointer data) @@ -212,6 +214,12 @@ static void keyboard_interactive_end_client(ObClient *client, gpointer data) istate.client = NULL; } + +void keyboard_interactive_cancel() +{ + keyboard_interactive_end(0, TRUE, event_curtime, TRUE); +} + gboolean keyboard_interactive_grab(guint state, ObClient *client, ObAction *action) { @@ -333,7 +341,7 @@ void keyboard_shutdown(gboolean reconfig) client_remove_destroy_notify(keyboard_interactive_end_client); if (istate.active) - keyboard_interactive_end(0, TRUE, 0, TRUE); + keyboard_interactive_cancel(); ob_main_loop_timeout_remove(ob_main_loop, chain_timeout); diff --git a/openbox/keyboard.h b/openbox/keyboard.h index 4c6f3bb5..3d70448f 100644 --- a/openbox/keyboard.h +++ b/openbox/keyboard.h @@ -49,4 +49,6 @@ gboolean keyboard_process_interactive_grab(const XEvent *e, struct _ObClient **client); gboolean keyboard_interactively_grabbed(); +void keyboard_interactive_cancel(); + #endif