]> git.sur5r.net Git - i3/i3/commitdiff
Implement 'split'
authorMichael Stapelberg <michael@stapelberg.de>
Mon, 10 May 2010 07:33:10 +0000 (09:33 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Mon, 10 May 2010 07:33:10 +0000 (09:33 +0200)
src/cmdparse.l
src/cmdparse.y
src/tree.c
testcases/Makefile
testcases/t/21-next-prev.t
testcases/t/22-split.t [new file with mode: 0644]
testcases/t/lib/i3test.pm

index ee73c7b9dbcd1d95d8a566d82d72c2f8c9b51b17..4a8e01fcd8d468222948ef5cf8017540d5f97984 100644 (file)
@@ -101,6 +101,7 @@ move                            { return TOK_MOVE; }
 open                            { return TOK_OPEN; }
 next                            { return TOK_NEXT; }
 prev                            { return TOK_PREV; }
+split                           { return TOK_SPLIT; }
 horizontal                      { return TOK_HORIZONTAL; }
 vertical                        { return TOK_VERTICAL; }
 
index d77fa4cac2b3db05f2c2d79541e33ee17ad4dfdc..abb30ebebb20cbd2ec40e702530af74d5b8fc336 100644 (file)
@@ -113,6 +113,7 @@ void parse_cmd(const char *new) {
 %token TOK_OPEN "open"
 %token TOK_NEXT "next"
 %token TOK_PREV "prev"
+%token TOK_SPLIT "split"
 %token TOK_HORIZONTAL "horizontal"
 %token TOK_VERTICAL "vertical"
 
@@ -256,6 +257,7 @@ operation:
     | fullscreen
     | next
     | prev
+    | split
     ;
 
 exec:
@@ -357,6 +359,14 @@ prev:
     }
     ;
 
+split:
+    TOK_SPLIT WHITESPACE direction
+    {
+        printf("splitting in direction %c\n", $<chr>3);
+        tree_split(focused, ($<chr>3 == 'v' ? VERT : HORIZ));
+    }
+    ;
+
 direction:
     TOK_HORIZONTAL  { $<chr>$ = 'h'; }
     | 'h'           { $<chr>$ = 'h'; }
index 3a6579832cd683283145efbabdf77f93fd341909..72e8645cfae523304911eaa55e905a9f6aad4611 100644 (file)
@@ -167,6 +167,11 @@ void tree_close_con() {
  *
  */
 void tree_split(Con *con, orientation_t orientation) {
+    /* for a workspace, we just need to change orientation */
+    if (con->parent->type == CT_OUTPUT) {
+        con->orientation = orientation;
+        return;
+    }
     /* 2: replace it with a new Con */
     Con *new = con_new(NULL);
     Con *parent = con->parent;
index f433546f44b8bd1c4cf0c0ab1cc301af8995e833..9741c24c32ab640865ed58130d140d34c6bd053f 100644 (file)
@@ -1,5 +1,5 @@
 test:
-       PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(1)" -It/lib t/21*
+       PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(1)" -It/lib t/22*
 
 all: test
 
index 8ed3ada720de657298aeef03d4f1e93ef4b914b2..bc0e6025942f1cec7a588dd668425e6c58bcc66a 100644 (file)
@@ -81,10 +81,4 @@ $i3->command('next horizontal')->recv;
 ($nodes, $focus) = get_ws_content($tmp);
 is($focus->[0], $right, 'right container focused');
 
-
-#
-# TODO: extend this test-case (as soon as splitting is implemented):
-# - wrapping (no horizontal switch possible, goes level-up)
-# - going level-up "manually"
-
 diag( "Testing i3, Perl $], $^X" );
diff --git a/testcases/t/22-split.t b/testcases/t/22-split.t
new file mode 100644 (file)
index 0000000..95e387d
--- /dev/null
@@ -0,0 +1,58 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Tests splitting
+#
+use i3test tests => 11;
+use X11::XCB qw(:all);
+use v5.10;
+
+my $i3 = i3("/tmp/nestedcons");
+
+my $tmp = get_unused_workspace();
+$i3->command("workspace $tmp")->recv;
+
+my $ws = get_ws($tmp);
+is($ws->{orientation}, 0, 'orientation horizontal by default');
+$i3->command('split v')->recv;
+$ws = get_ws($tmp);
+is($ws->{orientation}, 1, 'split v changes workspace orientation');
+
+######################################################################
+# Open two containers, split, open another container. Then verify
+# the layout is like we expect it to be
+######################################################################
+$i3->command('open')->recv;
+$i3->command('open')->recv;
+my $content = get_ws_content($tmp);
+
+is(@{$content}, 2, 'two containers on workspace level');
+my $first = $content->[0];
+my $second = $content->[1];
+
+is(@{$first->{nodes}}, 0, 'first container has no children');
+is(@{$second->{nodes}}, 0, 'second container has no children (yet)');
+my $old_name = $second->{name};
+
+
+$i3->command('split h')->recv;
+$i3->command('open')->recv;
+
+$content = get_ws_content($tmp);
+
+is(@{$content}, 2, 'two containers on workspace level');
+$first = $content->[0];
+$second = $content->[1];
+
+is(@{$first->{nodes}}, 0, 'first container has no children');
+isnt($second->{name}, $old_name, 'second container was replaced');
+is($second->{orientation}, 0, 'orientation is horizontal');
+is(@{$second->{nodes}}, 2, 'second container has 2 children');
+is($second->{nodes}->[0]->{name}, $old_name, 'found old second container');
+
+# TODO: extend this test-case (test next/prev)
+# - wrapping (no horizontal switch possible, goes level-up)
+# - going level-up "manually"
+
+
+diag( "Testing i3, Perl $], $^X" );
index 5ca84231fa488353574ddd67e4dc8a319d11a5ff..4b76b7f472710189616c15b773060346b0a6717b 100644 (file)
@@ -19,7 +19,7 @@ use AnyEvent::I3;
 #use Exporter qw(import);
 use base 'Exporter';
 
-our @EXPORT = qw(get_workspace_names get_unused_workspace get_ws_content);
+our @EXPORT = qw(get_workspace_names get_unused_workspace get_ws_content get_ws);
 
 BEGIN {
     my $window_count = 0;
@@ -76,4 +76,14 @@ sub get_ws_content {
     return wantarray ? ($cons[0]->{nodes}, $cons[0]->{focus}) : $cons[0]->{nodes};
 }
 
+sub get_ws {
+    my ($name) = @_;
+    my $i3 = i3("/tmp/nestedcons");
+    my $tree = $i3->get_workspaces->recv;
+    my @ws = map { @{$_->{nodes}} } @{$tree->{nodes}};
+    my @cons = grep { $_->{name} eq $name } @ws;
+    return $cons[0];
+}
+
+
 1