diff --git a/src/manage.c b/src/manage.c index 87f7653e..3afde994 100644 --- a/src/manage.c +++ b/src/manage.c @@ -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(); diff --git a/testcases/t/203-regress-assign-and-move.t b/testcases/t/203-regress-assign-and-move.t index 51a1676f..fd11c27a 100644 --- a/testcases/t/203-regress-assign-and-move.t +++ b/testcases/t/203-regress-assign-and-move.t @@ -42,4 +42,34 @@ does_i3_live; exit_gracefully($pid); +################################################################################ +# Related bug: multiple for_window assignments caused a crash +################################################################################ + +$config = < '__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;