From: Mats Date: Thu, 24 Jan 2013 16:56:03 +0000 (+0100) Subject: Split workspace instead of changing orientation X-Git-Tag: 4.5~18 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=fa4301e06db3e18150102d8eca2ddd9db7b387a6;p=i3%2Fi3 Split workspace instead of changing orientation Move all children of the workspace into a new container if there is more than one otherwise simply change the orientation. fixes #922 --- diff --git a/src/tree.c b/src/tree.c index 2973c4b8..32bec965 100644 --- a/src/tree.c +++ b/src/tree.c @@ -373,17 +373,23 @@ void tree_close_con(kill_window_t kill_window) { * */ void tree_split(Con *con, orientation_t orientation) { - /* for a workspace, we just need to change orientation */ - if (con->type == CT_WORKSPACE) { - DLOG("Workspace, simply changing orientation to %d\n", orientation); - con->layout = (orientation == HORIZ) ? L_SPLITH : L_SPLITV; - return; - } - else if (con->type == CT_FLOATING_CON) { + if (con->type == CT_FLOATING_CON) { DLOG("Floating containers can't be split.\n"); return; } + if (con->type == CT_WORKSPACE) { + if (con_num_children(con) < 2) { + DLOG("Just changing orientation of workspace\n"); + con->layout = (orientation == HORIZ) ? L_SPLITH : L_SPLITV; + return; + } else { + /* if there is more than one container on the workspace + * move them into a new container and handle this instead */ + con = workspace_encapsulate(con); + } + } + Con *parent = con->parent; /* Force re-rendering to make the indicator border visible. */ diff --git a/testcases/t/122-split.t b/testcases/t/122-split.t index 01765e1e..361716c1 100644 --- a/testcases/t/122-split.t +++ b/testcases/t/122-split.t @@ -158,4 +158,24 @@ is(get_output_content()->{layout}, 'splith', 'content container layout ok'); cmd 'layout stacked'; is(get_output_content()->{layout}, 'splith', 'content container layout still ok'); +###################################################################### +# Splitting a workspace that has more than one child +###################################################################### + +$tmp = fresh_workspace; + +cmd 'open'; +cmd 'open'; +cmd 'focus parent'; +cmd 'split v'; +cmd 'open'; + +my $content = get_ws_content($tmp); +my $fst = $content->[0]; +my $snd = $content->[1]; + +is(@{$content}, 2, 'two containers on workspace'); +is(@{$fst->{nodes}}, 2, 'first child has two children'); +is(@{$snd->{nodes}}, 0, 'second child has no children'); + done_testing;