]> git.sur5r.net Git - i3/i3/commitdiff
bugfix: don't set input focus if not accepted
authorTony Crisci <tony@dubstepdish.com>
Tue, 17 Jun 2014 06:49:39 +0000 (02:49 -0400)
committerMichael Stapelberg <michael@stapelberg.de>
Thu, 19 Jun 2014 09:55:28 +0000 (11:55 +0200)
http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.7

> Clients using the Globally Active model can only use a SetInputFocus request
> to acquire the input focus when they do not already have it on receipt of one
> of the following events:
> * ButtonPress
> * ButtonRelease
> * Passive-grabbed KeyPress
> * Passive-grabbed KeyRelease

Since managing a window happens on a MapNotify (which is absent from this
list), the window cannot accept input focus, so we should not try to focus
the window at all.

Fixes an issue with xfce4-notifyd which (correctly) declines focus when
we send WM_TAKE_FOCUS, which puts i3 in a state where i3 focus and X
focus are different when a notification appears.

src/ewmh.c
src/manage.c
testcases/t/158-wm_take_focus.t

index 7ab0c22adfd2c14e94712af09b1c38bbd33563c0..3ef79937e00cccae438877c3e03fe6c6a2848a78 100644 (file)
@@ -48,9 +48,9 @@ void ewmh_update_number_of_desktops(void) {
     Con *output;
     uint32_t idx = 0;
 
-    TAILQ_FOREACH (output, &(croot->nodes_head), nodes) {
+    TAILQ_FOREACH(output, &(croot->nodes_head), nodes) {
         Con *ws;
-        TAILQ_FOREACH (ws, &(output_get_content(output)->nodes_head), nodes) {
+        TAILQ_FOREACH(ws, &(output_get_content(output)->nodes_head), nodes) {
             if (STARTS_WITH(ws->name, "__"))
                 continue;
             ++idx;
@@ -58,7 +58,7 @@ void ewmh_update_number_of_desktops(void) {
     }
 
     xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root,
-            A__NET_NUMBER_OF_DESKTOPS, XCB_ATOM_CARDINAL, 32, 1, &idx);
+                        A__NET_NUMBER_OF_DESKTOPS, XCB_ATOM_CARDINAL, 32, 1, &idx);
 }
 
 /*
index 227e9d24552fb4c30b3f23460c6c83530f477522..202b0649fd68bbcb68f9b1b10f4f62cdf56db7d2 100644 (file)
@@ -505,7 +505,7 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
 
     /* Defer setting focus after the 'new' event has been sent to ensure the
      * proper window event sequence. */
-    if (set_focus) {
+    if (set_focus && !nc->window->doesnt_accept_focus) {
         DLOG("Now setting focus.\n");
         con_focus(nc);
     }
index ba03913a8f524ce8c2355f1bf52c21f09397d882..050e11623f95e250b4bfe6e7fe0e15e4c1261a47 100644 (file)
@@ -59,6 +59,18 @@ subtest 'Window without WM_TAKE_FOCUS', sub {
     done_testing;
 };
 
+# http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.7
+# > Clients using the Globally Active model can only use a SetInputFocus request
+# > to acquire the input focus when they do not already have it on receipt of one
+# > of the following events:
+# > * ButtonPress
+# > * ButtonRelease
+# > * Passive-grabbed KeyPress
+# > * Passive-grabbed KeyRelease
+#
+# Since managing a window happens on a MapNotify (which is absent from this
+# list), the window cannot accept input focus, so we should not try to focus
+# the window at all.
 subtest 'Window with WM_TAKE_FOCUS and without InputHint', sub {
     fresh_workspace;
 
@@ -74,7 +86,7 @@ subtest 'Window with WM_TAKE_FOCUS and without InputHint', sub {
 
     $window->map;
 
-    ok(recv_take_focus($window), 'got ClientMessage with WM_TAKE_FOCUS atom');
+    ok(!recv_take_focus($window), 'did not receive ClientMessage');
 
     done_testing;
 };