Treat stacking containers as if they are in vertical orientation, add testcase

This commit is contained in:
Michael Stapelberg 2010-07-17 01:27:47 +02:00
parent 09c6b587d3
commit 69e5c0f6ce
4 changed files with 88 additions and 2 deletions

View File

@ -113,4 +113,12 @@ void con_toggle_fullscreen(Con *con);
*/ */
void con_move_to_workspace(Con *con, Con *workspace); void con_move_to_workspace(Con *con, Con *workspace);
/**
* Returns the orientation of the given container (for stacked containers,
* vertical orientation is used regardless of the actual orientation of the
* container).
*
*/
int con_orientation(Con *con);
#endif #endif

View File

@ -376,3 +376,17 @@ void con_move_to_workspace(Con *con, Con *workspace) {
con_detach(con); con_detach(con);
con_attach(con, next); con_attach(con, next);
} }
/*
* Returns the orientation of the given container (for stacked containers,
* vertical orientation is used regardless of the actual orientation of the
* container).
*
*/
int con_orientation(Con *con) {
/* stacking containers behave like they are in vertical orientation */
if (con->layout == L_STACKED)
return VERT;
return con->orientation;
}

View File

@ -332,7 +332,7 @@ void tree_render() {
void tree_next(char way, orientation_t orientation) { void tree_next(char way, orientation_t orientation) {
/* 1: get the first parent with the same orientation */ /* 1: get the first parent with the same orientation */
Con *parent = focused->parent; Con *parent = focused->parent;
while (parent->orientation != orientation) { while (con_orientation(parent) != orientation) {
LOG("need to go one level further up\n"); LOG("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
* and the orientation still does not match */ * and the orientation still does not match */
@ -377,7 +377,7 @@ void tree_move(char way, orientation_t orientation) {
if (focused->type == CT_WORKSPACE) if (focused->type == CT_WORKSPACE)
return; return;
bool level_changed = false; bool level_changed = false;
while (parent->orientation != orientation) { while (con_orientation(parent) != orientation) {
LOG("need to go one level further up\n"); LOG("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
* and the orientation still does not match */ * and the orientation still does not match */

View File

@ -0,0 +1,64 @@
#!perl
# vim:ts=4:sw=4:expandtab
#
# Check if stacking containers can be used independantly of
# the split mode (horizontal/vertical) of the underlying
# container.
#
use i3test tests => 7;
use Time::HiRes qw(sleep);
my $i3 = i3("/tmp/nestedcons");
my $tmp = get_unused_workspace();
$i3->command("workspace $tmp")->recv;
ok(@{get_ws_content($tmp)} == 0, 'no containers yet');
# Enforce vertical split mode
$i3->command('split v')->recv;
$i3->command('open')->recv;
my ($nodes, $focus) = get_ws_content($tmp);
my $first = $focus->[0];
$i3->command('open')->recv;
($nodes, $focus) = get_ws_content($tmp);
my $second = $focus->[0];
isnt($first, $second, 'two different containers opened');
##############################################################
# change mode to stacking and cycle through the containers
##############################################################
$i3->command('layout stacking')->recv;
($nodes, $focus) = get_ws_content($tmp);
is($focus->[0], $second, 'second container still focused');
$i3->command('next v')->recv;
($nodes, $focus) = get_ws_content($tmp);
is($focus->[0], $first, 'first container focused');
$i3->command('prev v')->recv;
($nodes, $focus) = get_ws_content($tmp);
is($focus->[0], $second, 'second container focused again');
##############################################################
# now change the orientation to horizontal and cycle
##############################################################
$i3->command('level up')->recv;
$i3->command('split h')->recv;
$i3->command('level down')->recv;
$i3->command('next v')->recv;
($nodes, $focus) = get_ws_content($tmp);
is($focus->[0], $first, 'first container focused');
$i3->command('prev v')->recv;
($nodes, $focus) = get_ws_content($tmp);
is($focus->[0], $second, 'second container focused again');
diag( "Testing i3, Perl $], $^X" );