]> git.sur5r.net Git - i3/i3/blobdiff - testcases/t/506-focus-right.t
Make get_output_next() work with non-aligned RandR setups (+test) (Thanks Feh, swh...
[i3/i3] / testcases / t / 506-focus-right.t
diff --git a/testcases/t/506-focus-right.t b/testcases/t/506-focus-right.t
new file mode 100644 (file)
index 0000000..1b8be06
--- /dev/null
@@ -0,0 +1,174 @@
+#!perl
+# vim:ts=4:sw=4:expandtab
+#
+# Please read the following documents before working on tests:
+# • http://build.i3wm.org/docs/testsuite.html
+#   (or docs/testsuite)
+#
+# • http://build.i3wm.org/docs/lib-i3test.html
+#   (alternatively: perldoc ./testcases/lib/i3test.pm)
+#
+# • http://build.i3wm.org/docs/ipc.html
+#   (or docs/ipc)
+#
+# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
+#   (unless you are already familiar with Perl)
+#
+# Verifies that focus output right works with monitor setups that don’t line up
+# on their x/y coordinates.
+#
+# ticket #771, bug still present in commit dd743f3b55b2f86d9f1f69ef7952ae8ece4de504
+#
+use i3test i3_autostart => 0;
+
+sub test_focus_left_right {
+    my ($config) = @_;
+
+    my $pid = launch_with_config($config);
+
+    my $i3 = i3(get_socket_path(0));
+
+    $x->root->warp_pointer(0, 0);
+    sync_with_i3;
+
+    ############################################################################
+    # Ensure that moving left and right works.
+    ############################################################################
+
+    # First ensure both workspaces have something to focus
+    cmd "workspace 1";
+    my $left_win = open_window;
+
+    cmd "workspace 2";
+    my $right_win = open_window;
+
+    is($x->input_focus, $right_win->id, 'right window focused');
+
+    cmd "focus output left";
+    is($x->input_focus, $left_win->id, 'left window focused');
+
+    cmd "focus output right";
+    is($x->input_focus, $right_win->id, 'right window focused');
+
+    cmd "focus output right";
+    is($x->input_focus, $left_win->id, 'left window focused (wrapping)');
+
+    cmd "focus output left";
+    is($x->input_focus, $right_win->id, 'right window focused (wrapping)');
+
+    ############################################################################
+    # Ensure that moving down from S0 doesn’t crash i3.
+    ############################################################################
+
+    my $second = fresh_workspace(output => 1);
+
+    cmd "focus output down";
+
+    does_i3_live;
+
+    exit_gracefully($pid);
+}
+
+# Screen setup looks like this:
+# +----+
+# |    |--------+
+# | S1 |   S2   |
+# |    |--------+
+# +----+
+#
+my $config = <<EOT;
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+fake-outputs 1080x1920+0+0,1920x1080+1080+500
+EOT
+
+test_focus_left_right($config);
+
+# Screen setup looks like this:
+# +----+--------+
+# |    |   S2   |
+# | S1 |--------+
+# |    |
+# +----+
+#
+$config = <<EOT;
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+fake-outputs 1080x1920+0+0,1920x200+1080+0
+EOT
+
+test_focus_left_right($config);
+
+# Screen setup looks like this:
+# +----+
+# |    |
+# | S1 |--------+
+# |    |   S2   |
+# +----+--------+
+#
+$config = <<EOT;
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+fake-outputs 1080x1920+0+0,1920x200+1080+1720
+EOT
+
+test_focus_left_right($config);
+
+# Screen setup looks like this:
+# +----+        +----+
+# |    |        |    |
+# | S1 |--------+ S3 |
+# |    |   S2   |    |
+# +----+--------+----+
+#
+$config = <<EOT;
+# i3 config file (v4)
+font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
+
+fake-outputs 1080x1920+0+0,1920x200+1080+1720,1080x1920+1280+0
+EOT
+
+my $pid = launch_with_config($config);
+
+my $i3 = i3(get_socket_path(0));
+
+$x->root->warp_pointer(0, 0);
+sync_with_i3;
+
+############################################################################
+# Ensure that focusing right/left works in the expected order.
+############################################################################
+
+sub get_focused_output {
+    my $tree = i3(get_socket_path())->get_tree->recv;
+    my ($focused_id) = @{$tree->{focus}};
+    my ($output) = grep { $_->{id} == $focused_id } @{$tree->{nodes}};
+    return $output->{name};
+}
+
+is(get_focused_output(), 'fake-0', 'focus on fake-0');
+
+cmd 'focus output right';
+is(get_focused_output(), 'fake-1', 'focus on fake-1');
+
+cmd 'focus output right';
+is(get_focused_output(), 'fake-2', 'focus on fake-2');
+
+cmd 'focus output left';
+is(get_focused_output(), 'fake-1', 'focus on fake-1');
+
+cmd 'focus output left';
+is(get_focused_output(), 'fake-0', 'focus on fake-0');
+
+cmd 'focus output left';
+is(get_focused_output(), 'fake-2', 'focus on fake-2 (wrapping)');
+
+cmd 'focus output right';
+is(get_focused_output(), 'fake-0', 'focus on fake-0 (wrapping)');
+
+exit_gracefully($pid);
+
+done_testing;