]> Dogcows Code - chaz/openbox/commitdiff
ungrab the keyboard for passive grabs. kill interactive actions for exec actions...
authorDana Jansens <danakj@orodu.net>
Mon, 14 May 2007 23:31:41 +0000 (23:31 +0000)
committerDana Jansens <danakj@orodu.net>
Mon, 14 May 2007 23:31:41 +0000 (23:31 +0000)
openbox/action.c
openbox/keyboard.c

index df496850ead5dcb9a13994a5b89453c0196f6aa1..3f43a238ea6ad7abb51fe79bd1836a7131e00f43 100644 (file)
@@ -1111,7 +1111,6 @@ void action_run_list(GSList *acts, ObClient *c, ObFrameContext context,
 {
     GSList *it;
     ObAction *a;
-    gboolean ungrabbed = FALSE;
 
     if (!acts)
         return;
@@ -1139,33 +1138,6 @@ void action_run_list(GSList *acts, ObClient *c, ObFrameContext context,
                     if (!keyboard_interactive_grab(state, a->data.any.c, a))
                         continue;
             }
-            else if (!ungrabbed) {
-                /* Ungrab the keyboard before running the action if it's not
-                   interactive.
-
-                   If there is an interactive action going on, then cancel it
-                   to release the keyboard. If not, then call
-                   XUngrabKeyboard().
-
-                   We call XUngrabKeyboard() because a key press causes a
-                   passive grab on the keyboard, and so if program we are
-                   executing wants to grab the keyboard, it will fail if the
-                   button is still held down (which is likely).
-
-                   Use the X function not out own, because we're not
-                   considering a grab to be in place at all so our function
-                   won't try ungrab anything.
-                */
-                if (keyboard_interactively_grabbed())
-                    keyboard_interactive_cancel();
-                else
-                    XUngrabKeyboard(ob_display, time);
-
-                /* We don't the same with XUngrabPointer, even though it can
-                   cause the same problem. But then Press bindings cause
-                   Drag bindings to break.
-                XUngrabPointer(ob_display, time);*/
-            }
 
             /* XXX UGLY HACK race with motion event starting a move and the
                button release gettnig processed first. answer: don't queue
@@ -1240,6 +1212,12 @@ void action_execute(union ActionData *data)
     if (data->execute.path) {
         cmd = g_filename_from_utf8(data->execute.path, -1, NULL, NULL, NULL);
         if (cmd) {
+            /* If there is an interactive action going on, then cancel it
+               to release the keyboard, so that the run application
+               can grab the keyboard if it wants to. */
+            if (keyboard_interactively_grabbed())
+                keyboard_interactive_cancel();
+
             if (!g_shell_parse_argv (cmd, NULL, &argv, &e)) {
                 g_message(_("Failed to execute '%s': %s"),
                           cmd, e->message);
index b834046b9cdc4282a51f19093346c53d1d6852c0..ab9d05b09859c631b026bbf31d307adeba1b0c83 100644 (file)
@@ -311,6 +311,14 @@ void keyboard_event(ObClient *client, const XEvent *e)
             else {
                 keyboard_reset_chains(0);
 
+                /* If we don't have the keyboard grabbed, then ungrab it with
+                   XUngrabKeyboard, so that there is not a passive grab left
+                   on from the KeyPress. If the grab is left on, and focus
+                   moves during that time, it will be NotifyWhileGrabbed, and
+                   applications like to ignore those! */
+                if (!keyboard_interactively_grabbed())
+                    XUngrabKeyboard(ob_display, e->xkey.time);
+
                 action_run_key(p->actions, client, e->xkey.state,
                                e->xkey.x_root, e->xkey.y_root,
                                e->xkey.time);
This page took 0.026608 seconds and 4 git commands to generate.