From d8307f4b4a0e8731df13a95279efbe951111370f Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 10 May 2010 00:06:24 +0200 Subject: [PATCH] implement 'next' in the new command parser (testcase unfinished) --- src/cmdparse.l | 1 + src/cmdparse.y | 18 +++++++++++++ testcases/Makefile | 2 +- testcases/t/21-next-prev.t | 52 ++++++++++++++++++++++++++++++++++++++ testcases/t/lib/i3test.pm | 7 ++--- 5 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 testcases/t/21-next-prev.t diff --git a/src/cmdparse.l b/src/cmdparse.l index 079aa8f9..318da934 100644 --- a/src/cmdparse.l +++ b/src/cmdparse.l @@ -99,6 +99,7 @@ workspace { BEGIN(WANT_WS_STRING); return TOK_WORKSPACE; } focus { return TOK_FOCUS; } move { return TOK_MOVE; } open { return TOK_OPEN; } +next { return TOK_NEXT; } class { BEGIN(WANT_QSTRING); return TOK_CLASS; } id { BEGIN(WANT_QSTRING); return TOK_ID; } diff --git a/src/cmdparse.y b/src/cmdparse.y index e9b2538c..c3b19686 100644 --- a/src/cmdparse.y +++ b/src/cmdparse.y @@ -86,6 +86,7 @@ void parse_cmd(const char *new) { %union { char *string; + char chr; } %token TOK_ATTACH "attach" @@ -110,6 +111,7 @@ void parse_cmd(const char *new) { %token TOK_FOCUS "focus" %token TOK_MOVE "move" %token TOK_OPEN "open" +%token TOK_NEXT "next" %token TOK_CLASS "class" %token TOK_ID "id" @@ -249,6 +251,7 @@ operation: | kill | open | fullscreen + | next ; exec: @@ -333,3 +336,18 @@ fullscreen: } ; + +next: + TOK_NEXT WHITESPACE direction + { + printf("should select next window in direction %c\n", $3); + tree_next('n', ($3 == 'v' ? VERT : HORIZ)); + } + ; + +direction: + 'h' { $$ = 'h'; } + | 'horizontal' { $$ = 'h'; } + | 'v' { $$ = 'v'; } + | 'vertical' { $$ = 'v'; } + ; diff --git a/testcases/Makefile b/testcases/Makefile index 0e78f6b2..f433546f 100644 --- a/testcases/Makefile +++ b/testcases/Makefile @@ -1,5 +1,5 @@ test: - PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(1)" -It/lib t/03* t/05* + PERL_DL_NONLAZY=1 /usr/bin/perl "-MExtUtils::Command::MM" "-e" "test_harness(1)" -It/lib t/21* all: test diff --git a/testcases/t/21-next-prev.t b/testcases/t/21-next-prev.t new file mode 100644 index 00000000..3759e256 --- /dev/null +++ b/testcases/t/21-next-prev.t @@ -0,0 +1,52 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# +# Tests focus switching (next/prev) +# +use i3test tests => 4; +use X11::XCB qw(:all); +use v5.10; + +my $i3 = i3("/tmp/nestedcons"); + +my $tmp = get_unused_workspace(); +$i3->command("workspace $tmp")->recv; + +###################################################################### +# Open one container, verify that 'next v' and 'next h' do nothing +###################################################################### +$i3->command('open')->recv; + +my ($nodes, $focus) = get_ws_content($tmp); +my $old_focused = $focus->[0]; + +$i3->command('next v')->recv; +($nodes, $focus) = get_ws_content($tmp); +is($focus->[0], $old_focused, 'focus did not change with only one con'); + +$i3->command('next h')->recv; +($nodes, $focus) = get_ws_content($tmp); +is($focus->[0], $old_focused, 'focus did not change with only one con'); + +###################################################################### +# Open another container, verify that 'next h' switches +###################################################################### +$i3->command('open')->recv; + +($nodes, $focus) = get_ws_content($tmp); +isnt($old_focused, $focus->[0], 'new container is focused'); +$old_focused = $focus->[0]; + +$i3->command('next h')->recv; + +($nodes, $focus) = get_ws_content($tmp); +isnt($focus->[0], $old_focused, 'focus did change'); + +# +# TODO: extend this test-case: +# - implement prev +# - wrapping (no horizontal switch possible, goes level-up) +# - going level-up "manually" +# - different synonyms (horizontal/vertical) + +diag( "Testing i3, Perl $], $^X" ); diff --git a/testcases/t/lib/i3test.pm b/testcases/t/lib/i3test.pm index 68455bd2..5ca84231 100644 --- a/testcases/t/lib/i3test.pm +++ b/testcases/t/lib/i3test.pm @@ -62,17 +62,18 @@ sub get_unused_workspace { # # returns the content (== tree, starting from the node of a workspace) -# of a workspace +# of a workspace. If called in array context, also includes the focus +# stack of the workspace # sub get_ws_content { my ($name) = @_; my $i3 = i3("/tmp/nestedcons"); my $tree = $i3->get_workspaces->recv; my @ws = map { @{$_->{nodes}} } @{$tree->{nodes}}; - my @cons = map { $_->{nodes} } grep { $_->{name} eq $name } @ws; + my @cons = grep { $_->{name} eq $name } @ws; # as there can only be one workspace with this name, we can safely # return the first entry - return $cons[0]; + return wantarray ? ($cons[0]->{nodes}, $cons[0]->{focus}) : $cons[0]->{nodes}; } 1