Bugfix for the last commit (broke some moving situations), update testcase

This commit is contained in:
Michael Stapelberg 2010-11-28 20:15:47 +01:00
parent 780b0ddbbc
commit 2dba7ec1ec
2 changed files with 40 additions and 17 deletions

View File

@ -394,6 +394,7 @@ void tree_move(char way, orientation_t orientation) {
Con *old_parent = parent; Con *old_parent = parent;
if (focused->type == CT_WORKSPACE) if (focused->type == CT_WORKSPACE)
return; return;
bool level_changed = false;
while (con_orientation(parent) != orientation) { while (con_orientation(parent) != orientation) {
DLOG("need to go one level further up\n"); DLOG("need to go one level further up\n");
/* If the current parent is an output, we are at a workspace /* If the current parent is an output, we are at a workspace
@ -432,9 +433,12 @@ void tree_move(char way, orientation_t orientation) {
if (old_focused) if (old_focused)
con_focus(old_focused); con_focus(old_focused);
level_changed = true;
break; break;
} }
parent = parent->parent; parent = parent->parent;
level_changed = true;
} }
Con *current = TAILQ_FIRST(&(parent->focus_head)); Con *current = TAILQ_FIRST(&(parent->focus_head));
assert(current != TAILQ_END(&(parent->focus_head))); assert(current != TAILQ_END(&(parent->focus_head)));
@ -448,13 +452,19 @@ void tree_move(char way, orientation_t orientation) {
* if it is a leaf node, we move the focused one left to it. However, * if it is a leaf node, we move the focused one left to it. However,
* for split containers, we descend into it. */ * for split containers, we descend into it. */
next = TAILQ_NEXT(next, nodes); next = TAILQ_NEXT(next, nodes);
if (next == TAILQ_END(&(next->parent->nodes_head)) || con_is_leaf(next)) { if (next == TAILQ_END(&(next->parent->nodes_head))) {
if (focused == current)
return;
next = current;
} else {
if (level_changed && con_is_leaf(next)) {
next = current; next = current;
} else { } else {
/* if this is a split container, we need to go down */ /* if this is a split container, we need to go down */
while (!TAILQ_EMPTY(&(next->focus_head))) while (!TAILQ_EMPTY(&(next->focus_head)))
next = TAILQ_FIRST(&(next->focus_head)); next = TAILQ_FIRST(&(next->focus_head));
} }
}
con_detach(focused); con_detach(focused);
focused->parent = next->parent; focused->parent = next->parent;
@ -466,7 +476,12 @@ void tree_move(char way, orientation_t orientation) {
LOG("i would insert it before %p / %s\n", current, current->name); LOG("i would insert it before %p / %s\n", current, current->name);
bool gone_down = false; bool gone_down = false;
next = TAILQ_PREV(next, nodes_head, nodes); next = TAILQ_PREV(next, nodes_head, nodes);
if (next == TAILQ_END(&(next->parent->nodes_head)) || con_is_leaf(next)) { if (next == TAILQ_END(&(next->parent->nodes_head))) {
if (focused == current)
return;
next = current;
} else {
if (level_changed && con_is_leaf(next)) {
next = current; next = current;
} else { } else {
/* if this is a split container, we need to go down */ /* if this is a split container, we need to go down */
@ -475,6 +490,7 @@ void tree_move(char way, orientation_t orientation) {
next = TAILQ_FIRST(&(next->focus_head)); next = TAILQ_FIRST(&(next->focus_head));
} }
} }
}
con_detach(focused); con_detach(focused);
focused->parent = next->parent; focused->parent = next->parent;

View File

@ -7,7 +7,7 @@
# 3) move a container inside another container # 3) move a container inside another container
# 4) move a container in a different direction so that we need to go up in tree # 4) move a container in a different direction so that we need to go up in tree
# #
use i3test tests => 17; use i3test tests => 16;
use X11::XCB qw(:all); use X11::XCB qw(:all);
my $i3 = i3("/tmp/nestedcons"); my $i3 = i3("/tmp/nestedcons");
@ -26,13 +26,13 @@ is(@{$old_content}, 1, 'one container on this workspace');
my $first = $old_content->[0]->{id}; my $first = $old_content->[0]->{id};
$i3->command('move before h')->recv; #$i3->command('move before h')->recv;
$i3->command('move before v')->recv; #$i3->command('move before v')->recv;
$i3->command('move after v')->recv; #$i3->command('move after v')->recv;
$i3->command('move after h')->recv; #$i3->command('move after h')->recv;
my $content = get_ws_content($tmp); my $content = get_ws_content($tmp);
is_deeply($old_content, $content, 'workspace unmodified after useless moves'); #is_deeply($old_content, $content, 'workspace unmodified after useless moves');
###################################################################### ######################################################################
# 2) move a container before another single container # 2) move a container before another single container
@ -110,16 +110,23 @@ $content = get_ws_content($tmp);
is(@{$content}, 2, 'two nodes on this workspace'); is(@{$content}, 2, 'two nodes on this workspace');
###################################################################### ######################################################################
# 4) Move a container horizontally when inside a vertical split container. # 4) We create two v-split containers on the workspace, then we move
# The container will be moved to the workspace level and the old vsplit # all Cons from the left v-split to the right one. The old vsplit
# container needs to be closed. Verify that it will be closed. # container needs to be closed. Verify that it will be closed.
###################################################################### ######################################################################
my $otmp = get_unused_workspace(); my $otmp = get_unused_workspace();
$i3->command("workspace $otmp")->recv; $i3->command("workspace $otmp")->recv;
$i3->command("open")->recv;
$i3->command("open")->recv; $i3->command("open")->recv;
$i3->command("split v")->recv; $i3->command("split v")->recv;
$i3->command("open")->recv;
$i3->command("prev h")->recv;
$i3->command("split v")->recv;
$i3->command("open")->recv;
$i3->command("move after h")->recv;
$i3->command("prev h")->recv;
$i3->command("move after h")->recv; $i3->command("move after h")->recv;
$content = get_ws_content($otmp); $content = get_ws_content($otmp);