all repos — openbox @ 56d7bc50f0da9fe694b20751fa67aaa7e9158967

openbox fork - make it a bit more like ryudo

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
Dana Jansens danakj@orodu.net
commit

56d7bc50f0da9fe694b20751fa67aaa7e9158967

parent

acfa2af3c2eacd099869cc5aebdcfa1241214e8b

3 files changed, 23 insertions(+), 3 deletions(-)

jump to
M openbox/client.copenbox/client.c

@@ -3397,6 +3397,16 @@ ob_debug_type(OB_DEBUG_FOCUS,

"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. */
M openbox/keyboard.copenbox/keyboard.c

@@ -199,17 +199,25 @@ /* ungrab first so they won't be NotifyWhileGrabbed */

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) { if (istate.active && istate.client == client) istate.client = NULL; +} + + +void keyboard_interactive_cancel() +{ + keyboard_interactive_end(0, TRUE, event_curtime, TRUE); } gboolean keyboard_interactive_grab(guint state, ObClient *client,

@@ -333,7 +341,7 @@ if (!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);
M openbox/keyboard.hopenbox/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