]> git.sur5r.net Git - i3/i3/blobdiff - testcases/t/156-fullscreen-focus.t
Merge branch 'next' into master
[i3/i3] / testcases / t / 156-fullscreen-focus.t
index 9c396f40fadfc0a438e5a9c13f3978bb77d0bb8f..62711915433ef76185a90d5560d864e392c36c9a 100644 (file)
@@ -29,70 +29,55 @@ EOT
 # | S1 | S2 |
 # +----+----+
 
-my $tmp = fresh_workspace;
-
-################################################################################
-# Open the left window.
-################################################################################
+sub verify_focus {
+    # Report original line
+    local $Test::Builder::Level = $Test::Builder::Level + 1;
 
-my $left = open_window({ background_color => '#ff0000' });
+    my ($expected, $msg) = @_;
+    $expected = $expected->id;
 
-is($x->input_focus, $left->id, 'left window focused');
-
-diag("left = " . $left->id);
+    # Ensure the expected focus if the test fails.
+    cmd "[id=$expected] focus" unless is($x->input_focus, $expected, $msg);
+}
 
 ################################################################################
-# Open the right window.
+# Verify that window opened behind fullscreen window will get focus after the
+# fullscreen window gets moved to a different workspace.
 ################################################################################
 
-my $right = open_window({ background_color => '#00ff00' });
-
-diag("right = " . $right->id);
-
-################################################################################
-# Set the right window to fullscreen.
-################################################################################
+fresh_workspace;
+my $left = open_window;
+verify_focus($left, 'left window focused');
+diag("left = " . $left->id);
 
-cmd 'nop setting fullscreen';
+my $right = open_window;
 cmd 'fullscreen';
+diag("right = " . $right->id);
 
-################################################################################
-# Open a third window. Since we're fullscreen, the window won't be # mapped, so
+# Open a third window. Since we're fullscreen, the window won't be mapped, so
 # don't wait for it to be mapped. Instead, just send the map request and sync
 # with i3 to make sure i3 recognizes it.
-################################################################################
-
-my $third = open_window({
-        background_color => '#0000ff',
-        name => 'Third window',
-        dont_map => 1,
-    });
-
+my $third = open_window({dont_map => 1});
 $third->map;
-
 sync_with_i3;
-
 diag("third = " . $third->id);
 
-################################################################################
 # Move the window to a different workspace, and verify that the third window now
 # gets focused in the current workspace.
-################################################################################
-
 my $tmp2 = get_unused_workspace;
-
 cmd "move workspace $tmp2";
+verify_focus($third, 'third window focused');
 
-is($x->input_focus, $third->id, 'third window focused');
+kill_all_windows;
 
 ################################################################################
 # Ensure that moving a window to a workspace which has a fullscreen window does
 # not focus it (otherwise the user cannot get out of fullscreen mode anymore).
 ################################################################################
 
-$tmp = fresh_workspace;
+my $tmp = fresh_workspace;
 
-my $fullscreen_window = open_window;
+open_window;
 cmd 'fullscreen';
 
 my $nodes = get_ws_content($tmp);
@@ -111,32 +96,18 @@ is(scalar @$nodes, 2, 'precisely two windows');
 is($nodes->[0]->{id}, $old_id, 'id unchanged');
 is($nodes->[0]->{focused}, 1, 'fullscreen window focused');
 
+kill_all_windows;
+
 ################################################################################
 # Ensure it's possible to change focus if it doesn't escape the fullscreen
 # container with fullscreen global. We can't even focus a container in a
 # different workspace.
 ################################################################################
 
-cmd 'fullscreen';
-
-# Focus screen 1
-sync_with_i3;
-$x->root->warp_pointer(1025, 0);
-sync_with_i3;
-
-$tmp = fresh_workspace;
-cmd "workspace $tmp";
+$tmp = fresh_workspace(output => 1);
 my $diff_ws = open_window;
 
-# Focus screen 0
-sync_with_i3;
-$x->root->warp_pointer(0, 0);
-sync_with_i3;
-
-$tmp2 = fresh_workspace;
-cmd "workspace $tmp2";
-cmd 'split h';
-
+$tmp2 = fresh_workspace(output => 0);
 $left = open_window;
 my $right1 = open_window;
 cmd 'split v';
@@ -146,97 +117,99 @@ cmd 'focus parent';
 cmd 'fullscreen global';
 
 cmd '[id="' . $right1->id . '"] focus';
-is($x->input_focus, $right1->id, 'upper right window focused');
+verify_focus($right1, 'upper right window focused');
 
 cmd '[id="' . $right2->id . '"] focus';
-is($x->input_focus, $right2->id, 'bottom right window focused');
+verify_focus($right2, 'bottom right window focused');
 
 cmd 'focus parent';
 isnt($x->input_focus, $right2->id, 'bottom right window no longer focused');
 
 cmd 'focus child';
-is($x->input_focus, $right2->id, 'bottom right window focused again');
+verify_focus($right2, 'bottom right window focused again');
 
 cmd 'focus up';
-is($x->input_focus, $right1->id, 'allowed focus up');
+verify_focus($right1, 'allowed focus up');
 
 cmd 'focus down';
-is($x->input_focus, $right2->id, 'allowed focus down');
+verify_focus($right2, 'allowed focus down');
 
 cmd 'focus left';
-is($x->input_focus, $right2->id, 'prevented focus left');
+verify_focus($right2, 'prevented focus left');
 
 cmd 'focus right';
-is($x->input_focus, $right2->id, 'prevented focus right');
+verify_focus($right2, 'prevented focus right');
 
 cmd 'focus down';
-is($x->input_focus, $right1->id, 'allowed focus wrap (down)');
+verify_focus($right1, 'allowed focus wrap (down)');
 
 cmd 'focus up';
-is($x->input_focus, $right2->id, 'allowed focus wrap (up)');
+verify_focus($right2, 'allowed focus wrap (up)');
 
 ################################################################################
+# (depends on previous layout)
 # Same tests when we're in non-global fullscreen mode. It should now be possible
 # to focus a container in a different workspace.
 ################################################################################
 
 cmd 'focus parent';
-cmd 'fullscreen global';
+cmd 'fullscreen disable';
 cmd 'fullscreen';
 
 cmd '[id="' . $right1->id . '"] focus';
-is($x->input_focus, $right1->id, 'upper right window focused');
+verify_focus($right1, 'upper right window focused');
 
 cmd '[id="' . $right2->id . '"] focus';
-is($x->input_focus, $right2->id, 'bottom right window focused');
+verify_focus($right2, 'bottom right window focused');
 
 cmd 'focus parent';
 isnt($x->input_focus, $right2->id, 'bottom right window no longer focused');
 
 cmd 'focus child';
-is($x->input_focus, $right2->id, 'bottom right window focused again');
+verify_focus($right2, 'bottom right window focused again');
 
 cmd 'focus up';
-is($x->input_focus, $right1->id, 'allowed focus up');
+verify_focus($right1, 'allowed focus up');
 
 cmd 'focus down';
-is($x->input_focus, $right2->id, 'allowed focus down');
+verify_focus($right2, 'allowed focus down');
 
 cmd 'focus down';
-is($x->input_focus, $right1->id, 'allowed focus wrap (down)');
+verify_focus($right1, 'allowed focus wrap (down)');
 
 cmd 'focus up';
-is($x->input_focus, $right2->id, 'allowed focus wrap (up)');
+verify_focus($right2, 'allowed focus wrap (up)');
 
 cmd 'focus left';
-is($x->input_focus, $right2->id, 'focus left wrapped (no-op)');
+verify_focus($right2, 'focus left wrapped (no-op)');
 
 cmd 'focus right';
-is($x->input_focus, $diff_ws->id, 'allowed focus change to different ws');
+verify_focus($diff_ws, 'allowed focus change to different ws');
 
 cmd 'focus left';
-is($x->input_focus, $right2->id, 'focused back into fullscreen container');
+verify_focus($right2, 'focused back into fullscreen container');
 
 cmd '[id="' . $diff_ws->id . '"] focus';
-is($x->input_focus, $diff_ws->id, 'allowed focus change to different ws by id');
+verify_focus($diff_ws, 'allowed focus change to different ws by id');
 
 ################################################################################
+# (depends on previous layout)
 # More testing of the interaction between wrapping and the fullscreen focus
 # restrictions.
 ################################################################################
 
 cmd '[id="' . $right1->id . '"] focus';
-is($x->input_focus, $right1->id, 'upper right window focused');
+verify_focus($right1, 'upper right window focused');
 
 cmd 'focus parent';
-cmd 'fullscreen';
+cmd 'fullscreen disable';
 cmd 'focus child';
 
 cmd 'split v';
 my $right12 = open_window;
 
 cmd 'focus down';
-is($x->input_focus, $right2->id, 'bottom right window focused');
+verify_focus($right2, 'bottom right window focused');
 
 cmd 'split v';
 my $right22 = open_window;
@@ -246,18 +219,19 @@ cmd 'fullscreen';
 cmd 'focus child';
 
 cmd 'focus down';
-is($x->input_focus, $right2->id, 'focus did not leave parent container (1)');
+verify_focus($right2, 'focus did not leave parent container (1)');
 
 cmd 'focus down';
-is($x->input_focus, $right22->id, 'focus did not leave parent container (2)');
+verify_focus($right22, 'focus did not leave parent container (2)');
 
 cmd 'focus up';
-is($x->input_focus, $right2->id, 'focus did not leave parent container (3)');
+verify_focus($right2, 'focus did not leave parent container (3)');
 
 cmd 'focus up';
-is($x->input_focus, $right22->id, 'focus did not leave parent container (4)');
+verify_focus($right22, 'focus did not leave parent container (4)');
 
 ################################################################################
+# (depends on previous layout)
 # Ensure that moving in a direction doesn't violate the focus restrictions.
 ################################################################################
 
@@ -281,6 +255,7 @@ cmd 'move up';
 verify_move(2, 'prevented move up');
 
 ################################################################################
+# (depends on previous layout)
 # Moving to a different workspace is allowed with per-output fullscreen
 # containers.
 ################################################################################
@@ -296,6 +271,7 @@ cmd "move to workspace prev";
 verify_move(1, 'did not prevent move to workspace by position');
 
 ################################################################################
+# (depends on previous layout)
 # Ensure that is not allowed with global fullscreen containers.
 ################################################################################
 
@@ -304,7 +280,7 @@ cmd "move to workspace $tmp2";
 cmd "workspace $tmp2";
 
 cmd 'focus parent';
-cmd 'fullscreen';
+cmd 'fullscreen disable';
 cmd 'fullscreen global';
 cmd 'focus child';
 
@@ -314,6 +290,8 @@ verify_move(2, 'prevented move to workspace by name');
 cmd "move to workspace prev";
 verify_move(2, 'prevented move to workspace by position');
 
+kill_all_windows;
+
 ################################################################################
 # Ensure it's possible to focus a window using the focus command despite
 # fullscreen window blocking it. Fullscreen window should lose its fullscreen
@@ -321,96 +299,94 @@ verify_move(2, 'prevented move to workspace by position');
 ################################################################################
 
 # first & second tiling, focus using id
-kill_all_windows;
-
 $tmp = fresh_workspace;
 my $first = open_window;
 my $second = open_window;
 cmd 'fullscreen';
-is($x->input_focus, $second->id, 'fullscreen window focused');
+verify_focus($second, 'fullscreen window focused');
 is_num_fullscreen($tmp, 1, '1 fullscreen window');
 
-cmd '[id="'. $first->id .'"] focus';
+cmd '[id="' . $first->id . '"] focus';
 sync_with_i3;
 
-is($x->input_focus, $first->id, 'correctly focused using id');
+verify_focus($first, 'correctly focused using id');
 is_num_fullscreen($tmp, 0, 'no fullscreen windows');
 
-# first floating, second tiling, focus using 'focus floating'
 kill_all_windows;
 
+# first floating, second tiling, focus using 'focus floating'
 $tmp = fresh_workspace;
 $first = open_floating_window;
 $second = open_window;
 cmd 'fullscreen';
-is($x->input_focus, $second->id, 'fullscreen window focused');
+verify_focus($second, 'fullscreen window focused');
 is_num_fullscreen($tmp, 1, '1 fullscreen window');
 
 cmd 'focus floating';
 sync_with_i3;
 
-is($x->input_focus, $first->id, 'correctly focused using focus floating');
+verify_focus($first, 'correctly focused using focus floating');
 is_num_fullscreen($tmp, 0, 'no fullscreen windows');
 
-# first tiling, second floating, focus using 'focus tiling'
 kill_all_windows;
 
+# first tiling, second floating, focus using 'focus tiling'
 $tmp = fresh_workspace;
 $first = open_window;
 $second = open_floating_window;
 cmd 'fullscreen';
-is($x->input_focus, $second->id, 'fullscreen window focused');
+verify_focus($second, 'fullscreen window focused');
 is_num_fullscreen($tmp, 1, '1 fullscreen window');
 
 cmd 'focus tiling';
 sync_with_i3;
 
-is($x->input_focus, $first->id, 'correctly focused using focus tiling');
+verify_focus($first, 'correctly focused using focus tiling');
 is_num_fullscreen($tmp, 0, 'no fullscreen windows');
 
+kill_all_windows;
+
 ################################################################################
 # When the fullscreen window is in an other workspace it should maintain its
 # fullscreen mode since it's not blocking the window to be focused.
 ################################################################################
 
-kill_all_windows;
-
 $tmp = fresh_workspace;
 $first = open_window;
 
 $tmp2 = fresh_workspace;
 $second = open_window;
 cmd 'fullscreen';
-is($x->input_focus, $second->id, 'fullscreen window focused');
+verify_focus($second, 'fullscreen window focused');
 is_num_fullscreen($tmp2, 1, '1 fullscreen window');
 
-cmd '[id="'. $first->id .'"] focus';
+cmd '[id="' . $first->id . '"] focus';
 sync_with_i3;
 
-is($x->input_focus, $first->id, 'correctly focused using focus id');
+verify_focus($first, 'correctly focused using focus id');
 is_num_fullscreen($tmp, 0, 'no fullscreen windows on first workspace');
 is_num_fullscreen($tmp2, 1, 'still one fullscreen window on second workspace');
 
+kill_all_windows;
+
 ################################################################################
 # But a global window in another workspace is blocking the window to be focused.
 # Ensure that it loses its fullscreen mode.
 ################################################################################
 
-kill_all_windows;
-
 $tmp = fresh_workspace;
 $first = open_window;
 
 $tmp2 = fresh_workspace;
 $second = open_window;
 cmd 'fullscreen global';
-is($x->input_focus, $second->id, 'global window focused');
+verify_focus($second, 'global window focused');
 is_num_fullscreen($tmp2, 1, '1 fullscreen window');
 
-cmd '[id="'. $first->id .'"] focus';
+cmd '[id="' . $first->id . '"] focus';
 sync_with_i3;
 
-is($x->input_focus, $first->id, 'correctly focused using focus id');
+verify_focus($first, 'correctly focused using focus id');
 is_num_fullscreen($tmp2, 0, 'no fullscreen windows');