Bugfix: fix crash when using multiple for_window statements that move windows (Thanks Antonio)

fixes #1257
This commit is contained in:
Michael Stapelberg 2014-06-12 09:32:55 +02:00
parent a76a81f80b
commit 0552fd5666
2 changed files with 37 additions and 1 deletions

View File

@ -480,6 +480,10 @@ void manage_window(xcb_window_t window, xcb_get_window_attributes_cookie_t cooki
* workspace isnt enough either it needs the rect. */ * workspace isnt enough either it needs the rect. */
ws->rect = ws->parent->rect; ws->rect = ws->parent->rect;
render_con(ws, true); render_con(ws, true);
/* Disable setting focus, otherwise wed move focus to an invisible
* workspace, which we generally prevent (e.g. in
* con_move_to_workspace). */
set_focus = false;
} }
render_con(croot, 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 /* Defer setting focus after the 'new' event has been sent to ensure the
* proper window event sequence. */ * proper window event sequence. */
if (set_focus) if (set_focus) {
DLOG("Now setting focus.\n");
con_focus(nc); con_focus(nc);
}
tree_render(); tree_render();

View File

@ -42,4 +42,34 @@ does_i3_live;
exit_gracefully($pid); 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; done_testing;