bugfix: forgot to mark split containers as split = true (+test) (Thanks szalik)

When the workspace layout (formerly orientation) was forced to change
due to a move command, the split container we created was not marked as
split = true, which caused tree_flatten() to errnously kill the contents
of it and thus one window ended up unmanaged.

Also, the logic in tree_flatten() was inverted due to commit de94f6da.

fixes #790
next
Michael Stapelberg 2012-09-05 22:03:45 +02:00
parent a598544b5a
commit d644dbff64
3 changed files with 26 additions and 3 deletions

View File

@ -617,8 +617,8 @@ void tree_flatten(Con *con) {
/* The child must have a different orientation than the con but the same as
* the cons parent to be redundant */
if (con->split ||
child->split ||
if (!con->split ||
!child->split ||
con_orientation(con) == con_orientation(child) ||
con_orientation(child) != con_orientation(parent))
goto recurse;

View File

@ -699,6 +699,7 @@ void ws_force_orientation(Con *ws, orientation_t orientation) {
/* 1: create a new split container */
Con *split = con_new(NULL, NULL);
split->parent = ws;
split->split = true;
/* 2: copy layout from workspace */
split->layout = ws->layout;
@ -715,9 +716,10 @@ void ws_force_orientation(Con *ws, orientation_t orientation) {
/* 4: switch workspace layout */
ws->layout = (orientation == HORIZ) ? L_SPLITH : L_SPLITV;
DLOG("split->layout = %d, ws->layout = %d\n", split->layout, ws->layout);
/* 5: attach the new split container to the workspace */
DLOG("Attaching new split to ws\n");
DLOG("Attaching new split (%p) to ws (%p)\n", split, ws);
con_attach(split, ws, false);
/* 6: fix the percentages */

View File

@ -0,0 +1,21 @@
#!perl
# vim:ts=4:sw=4:expandtab
# Regression test: moving a window to the right out of a splitv container would
# make it vanish.
# Ticket: #790
# Bug still in: 4.2-277-ga598544
use i3test;
my $ws = fresh_workspace;
my $top = open_window;
cmd 'split v';
my $bottom = open_window;
is_num_children($ws, 2, 'two windows on workspace level');
cmd 'move right';
is_num_children($ws, 2, 'still two windows on workspace level');
done_testing;