resizing: traverse containers up properly (+test) (Thanks oblique)

In certain situations (when you have a h-split within a h-split) you
couldn’t properly resize previously. This commit makes the resize
command properly traverse up the containers.

fixes #754
This commit is contained in:
Michael Stapelberg 2012-07-22 21:37:26 +02:00
parent a97e70d483
commit ac7278eb1a
2 changed files with 68 additions and 27 deletions

View File

@ -519,6 +519,8 @@ static bool cmd_resize_tiling_direction(I3_CMD, char *way, char *direction, int
LOG("tiling resize\n");
/* get the appropriate current container (skip stacked/tabbed cons) */
Con *current = focused;
Con *other = NULL;
double percentage = 0;
while (current->parent->layout == L_STACKED ||
current->parent->layout == L_TABBED)
current = current->parent;
@ -527,40 +529,50 @@ static bool cmd_resize_tiling_direction(I3_CMD, char *way, char *direction, int
orientation_t search_orientation =
(strcmp(direction, "left") == 0 || strcmp(direction, "right") == 0 ? HORIZ : VERT);
while (current->type != CT_WORKSPACE &&
current->type != CT_FLOATING_CON &&
current->parent->orientation != search_orientation)
current = current->parent;
do {
if (current->parent->orientation != search_orientation) {
current = current->parent;
continue;
}
/* get the default percentage */
int children = con_num_children(current->parent);
Con *other;
LOG("ins. %d children\n", children);
double percentage = 1.0 / children;
LOG("default percentage = %f\n", percentage);
/* get the default percentage */
int children = con_num_children(current->parent);
LOG("ins. %d children\n", children);
percentage = 1.0 / children;
LOG("default percentage = %f\n", percentage);
orientation_t orientation = current->parent->orientation;
orientation_t orientation = current->parent->orientation;
if ((orientation == HORIZ &&
(strcmp(direction, "up") == 0 || strcmp(direction, "down") == 0)) ||
(orientation == VERT &&
(strcmp(direction, "left") == 0 || strcmp(direction, "right") == 0))) {
LOG("You cannot resize in that direction. Your focus is in a %s split container currently.\n",
(orientation == HORIZ ? "horizontal" : "vertical"));
if ((orientation == HORIZ &&
(strcmp(direction, "up") == 0 || strcmp(direction, "down") == 0)) ||
(orientation == VERT &&
(strcmp(direction, "left") == 0 || strcmp(direction, "right") == 0))) {
LOG("You cannot resize in that direction. Your focus is in a %s split container currently.\n",
(orientation == HORIZ ? "horizontal" : "vertical"));
ysuccess(false);
return false;
}
if (strcmp(direction, "up") == 0 || strcmp(direction, "left") == 0) {
other = TAILQ_PREV(current, nodes_head, nodes);
} else {
other = TAILQ_NEXT(current, nodes);
}
if (other == TAILQ_END(workspaces)) {
LOG("No other container in this direction found, trying to look further up in the tree...\n");
current = current->parent;
continue;
}
break;
} while (current->type != CT_WORKSPACE &&
current->type != CT_FLOATING_CON);
if (other == NULL) {
LOG("No other container in this direction found, trying to look further up in the tree...\n");
ysuccess(false);
return false;
}
if (strcmp(direction, "up") == 0 || strcmp(direction, "left") == 0) {
other = TAILQ_PREV(current, nodes_head, nodes);
} else {
other = TAILQ_NEXT(current, nodes);
}
if (other == TAILQ_END(workspaces)) {
LOG("No other container in this direction found, cannot resize.\n");
ysuccess(false);
return false;
}
LOG("other->percent = %f\n", other->percent);
LOG("current->percent before = %f\n", current->percent);
if (current->percent == 0.0)

View File

@ -0,0 +1,29 @@
#!perl
# vim:ts=4:sw=4:expandtab
# Verifies that you can resize across different levels of containers even when
# they are all of the same orientation.
# (Ticket #754)
use i3test;
my $tmp = fresh_workspace;
open_window;
open_window;
cmd 'split v';
my $middle = open_window;
open_window;
cmd 'focus parent';
cmd 'split h';
open_window;
cmd '[id="' . $middle->id . '"] focus';
is($x->input_focus, $middle->id, 'middle window focused');
cmd 'resize grow left 10px or 25ppt';
my ($nodes, $focus) = get_ws_content($tmp);
ok(cmp_float($nodes->[0]->{percent}, 0.25), 'left container got only 25%');
ok(cmp_float($nodes->[1]->{percent}, 0.75), 'right container got 75%');
done_testing;