]> git.sur5r.net Git - i3/i3/commitdiff
added "toggle" option to "split" command 2139/head
authorJohannes Lange <johannes.lange@rwth-aachen.de>
Mon, 4 Jan 2016 16:31:47 +0000 (17:31 +0100)
committerJohannes Lange <johannes.lange@rwth-aachen.de>
Mon, 4 Jan 2016 16:31:47 +0000 (17:31 +0100)
as requested in #1814

docs/userguide
include/commands.h
parser-specs/commands.spec
src/commands.c
testcases/t/122-split.t

index 89791bf7701752ea3560cda451ec9ff46f8a6dc8..59833ed5e3535e6adc71a4668ac9204c8216d71f 100644 (file)
@@ -1750,20 +1750,24 @@ get placed below the current one (splitv).
 
 If you apply this command to a split container with the same orientation,
 nothing will happen. If you use a different orientation, the split container’s
-orientation will be changed (if it does not have more than one window). Use
-+layout toggle split+ to change the layout of any split container from splitv
-to splith or vice-versa.
+orientation will be changed (if it does not have more than one window).
+The +toggle+ option will toggle the orientation of the split container if it
+contains a single window. Otherwise it makes the current window a split
+container with opposite orientation compared to the parent container.
+Use +layout toggle split+ to change the layout of any split container from
+splitv to splith or vice-versa.
 
 *Syntax*:
--------------------------
-split vertical|horizontal
--------------------------
+--------------------------------
+split vertical|horizontal|toggle
+--------------------------------
 
 *Example*:
-------------------------------
+-------------------------------
 bindsym $mod+v split vertical
 bindsym $mod+h split horizontal
-------------------------------
+bindsym $mod+t split toggle
+-------------------------------
 
 === Manipulating layout
 
index 5e8dd05c297cebafe571ee6df812822cfcc58dd5..968bfbef4075b35ba09644d050f779d03cbeff5d 100644 (file)
@@ -157,7 +157,7 @@ void cmd_floating(I3_CMD, const char *floating_mode);
 void cmd_move_workspace_to_output(I3_CMD, const char *name);
 
 /**
- * Implementation of 'split v|h|vertical|horizontal'.
+ * Implementation of 'split v|h|t|vertical|horizontal|toggle'.
  *
  */
 void cmd_split(I3_CMD, const char *direction);
index 98812132cb7abe3b84a6b3a15afb657c47c147e6..e6480a35dca349271c3def7cc39f67f0be266d2b 100644 (file)
@@ -191,9 +191,9 @@ state STICKY:
   action = 'enable', 'disable', 'toggle'
       -> call cmd_sticky($action)
 
-# split v|h|vertical|horizontal
+# split v|h|t|vertical|horizontal|toggle
 state SPLIT:
-  direction = 'horizontal', 'vertical', 'v', 'h'
+  direction = 'horizontal', 'vertical', 'toggle', 'v', 'h', 't'
       -> call cmd_split($direction)
 
 # floating enable|disable|toggle
index 579b5e0eb5072c987c79c5e1b6930ad0ae5755fc..e9e5c7dddbb23a7ea7cc95f156a65896dd476f1f 100644 (file)
@@ -1228,7 +1228,7 @@ void cmd_move_workspace_to_output(I3_CMD, const char *name) {
 }
 
 /*
- * Implementation of 'split v|h|vertical|horizontal'.
+ * Implementation of 'split v|h|t|vertical|horizontal|toggle'.
  *
  */
 void cmd_split(I3_CMD, const char *direction) {
@@ -1243,7 +1243,22 @@ void cmd_split(I3_CMD, const char *direction) {
         }
 
         DLOG("matching: %p / %s\n", current->con, current->con->name);
-        tree_split(current->con, (direction[0] == 'v' ? VERT : HORIZ));
+        if (direction[0] == 't') {
+            layout_t current_layout;
+            if (current->con->type == CT_WORKSPACE) {
+                current_layout = current->con->layout;
+            } else {
+                current_layout = current->con->parent->layout;
+            }
+            /* toggling split orientation */
+            if (current_layout == L_SPLITH) {
+                tree_split(current->con, VERT);
+            } else {
+                tree_split(current->con, HORIZ);
+            }
+        } else {
+            tree_split(current->con, (direction[0] == 'v' ? VERT : HORIZ));
+        }
     }
 
     cmd_output->needs_tree_render = true;
index e9d069385c3895ad2bb9a337c6c642209c32a042..6fd9b0e747313da53d43707c7601960f5c7d2e81 100644 (file)
@@ -178,4 +178,34 @@ 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');
 
+######################################################################
+# Test split toggle
+######################################################################
+
+$tmp = fresh_workspace;
+cmd 'split h';
+cmd 'split toggle';
+$ws = get_ws($tmp);
+is($ws->{layout}, 'splitv', 'toggled workspace split');
+
+$tmp = fresh_workspace;
+cmd 'split h';
+cmd 'split toggle';
+cmd 'split toggle';
+$ws = get_ws($tmp);
+is($ws->{layout}, 'splith', 'toggled workspace back and forth');
+
+cmd 'open';
+cmd 'open';
+cmd 'split toggle';
+
+$content = get_ws_content($tmp);
+my $second = $content->[1];
+is($second->{layout}, 'splitv', 'toggled container orientation to vertical');
+
+cmd 'split toggle';
+$content = get_ws_content($tmp);
+$second = $content->[1];
+is($second->{layout}, 'splith', 'toggled container orientation back to horizontal');
+
 done_testing;