]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: fix crash when using multiple for_window statements that move windows (Thanks...
authorMichael Stapelberg <michael@stapelberg.de>
Thu, 12 Jun 2014 07:32:55 +0000 (09:32 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Thu, 12 Jun 2014 07:32:55 +0000 (09:32 +0200)
fixes #1257

src/manage.c
testcases/t/203-regress-assign-and-move.t

index 87f7653e29745e520370c88ec0d3661cf6675358..3afde994325d385c9ddc720a87ba24b604dde076 100644 (file)
@@ -480,6 +480,10 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
          * workspace isn’t enough either — it needs the rect. */
         ws->rect = ws->parent->rect;
         render_con(ws, true);
+        /* Disable setting focus, otherwise we’d move focus to an invisible
+         * workspace, which we generally prevent (e.g. in
+         * con_move_to_workspace). */
+        set_focus = false;
     }
     render_con(croot, false);
 
@@ -488,8 +492,10 @@ 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) {
+        DLOG("Now setting focus.\n");
         con_focus(nc);
+    }
 
     tree_render();
 
index 51a1676f02b68fdff469ed200b167a81c82be052..fd11c27aa1032f202212f9466593885f22b0f413 100644 (file)
@@ -42,4 +42,34 @@ does_i3_live;
 
 exit_gracefully($pid);
 
+################################################################################
+# Related bug: multiple for_window assignments caused a crash
+################################################################################
+
+$config = <<EOT;
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+for_window [instance=__i3-test-window1] move workspace 3
+for_window [instance=__i3-test-window2] move workspace 2
+EOT
+
+$pid = launch_with_config($config);
+
+my $window1 = open_window(
+    wm_class => '__i3-test-window1',
+    dont_map => 1,
+);
+$window1->map;
+
+my $window2 = open_window(
+    wm_class => '__i3-test-window2',
+    dont_map => 1,
+);
+$window2->map;
+
+does_i3_live;
+
+exit_gracefully($pid);
+
 done_testing;