]> Dogcows Code - chaz/openbox/commitdiff
don't allow focus to move during an interactive grab. if users set up actions
authorDana Jansens <danakj@orodu.net>
Sun, 13 May 2007 15:29:49 +0000 (15:29 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 13 May 2007 15:29:49 +0000 (15:29 +0000)
such that this would happen, then kill the interactive grab before moving
focus.
this is to avoid NotifyWhileGrabbed FocusOut's

openbox/client.c
openbox/keyboard.c
openbox/keyboard.h

index 73696c897518dd98fce6f51df139dc7a16a21bfb..7a01e5109bce9b580b32b173f6056b3e0a315088 100644 (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. */
index 1534e1983162d95b1b3d532a57c2181bd649d583..5cfd45713dbdff021d5f870be52e3cbcc90ce877 100644 (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);
 
index 4c6f3bb59ec1c830a7e7b84cf7760d61f5016831..3d70448f4655c9215421087a6cede97a0b3c0b52 100644 (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
This page took 0.027937 seconds and 4 git commands to generate.