X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=blobdiff_plain;f=testcases%2Ft%2F156-fullscreen-focus.t;fp=testcases%2Ft%2F156-fullscreen-focus.t;h=62711915433ef76185a90d5560d864e392c36c9a;hp=9c396f40fadfc0a438e5a9c13f3978bb77d0bb8f;hb=1847938d4eeba98260cc79ca45a11a134274c2ea;hpb=c54f5008395b10c046f380cc3069ff779e5d2877 diff --git a/testcases/t/156-fullscreen-focus.t b/testcases/t/156-fullscreen-focus.t index 9c396f40..62711915 100644 --- a/testcases/t/156-fullscreen-focus.t +++ b/testcases/t/156-fullscreen-focus.t @@ -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');