]> git.sur5r.net Git - i3/i3/commitdiff
Split workspace instead of changing orientation
authorMats <d912e3@gmail.com>
Thu, 24 Jan 2013 16:56:03 +0000 (17:56 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 15 Feb 2013 02:16:02 +0000 (03:16 +0100)
Move all children of the workspace into a new container if there is more
than one otherwise simply change the orientation.

fixes #922

src/tree.c
testcases/t/122-split.t

index 2973c4b8edfb713f616cf6b69bf8ec524b12548b..32bec965d0b5236c0e3338016b8854fddb8a5fb2 100644 (file)
@@ -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. */
index 01765e1e92a8dbeb9f09081c8812b0c705d041e4..361716c14d449f534e880d96c0c95b83b25d13d8 100644 (file)
@@ -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;