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
This commit is contained in:
Dana Jansens 2007-05-13 15:29:49 +00:00
parent acfa2af3c2
commit 56d7bc50f0
3 changed files with 23 additions and 3 deletions

View file

@ -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. */

View file

@ -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);

View file

@ -49,4 +49,6 @@ gboolean keyboard_process_interactive_grab(const XEvent *e,
struct _ObClient **client);
gboolean keyboard_interactively_grabbed();
void keyboard_interactive_cancel();
#endif