X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=testcases%2Ft%2F185-scratchpad.t;h=fd3827f740c16de5b6526b237d74466c9c944f32;hb=HEAD;hp=87bda5295242c077de5941d5065237b8a09488a7;hpb=338199913bf251540ae4d1c300f250af1c68c7f7;p=i3%2Fi3 diff --git a/testcases/t/185-scratchpad.t b/testcases/t/185-scratchpad.t index 87bda529..fd3827f7 100644 --- a/testcases/t/185-scratchpad.t +++ b/testcases/t/185-scratchpad.t @@ -2,13 +2,13 @@ # vim:ts=4:sw=4:expandtab # # Please read the following documents before working on tests: -# • http://build.i3wm.org/docs/testsuite.html +# • https://build.i3wm.org/docs/testsuite.html # (or docs/testsuite) # -# • http://build.i3wm.org/docs/lib-i3test.html +# • https://build.i3wm.org/docs/lib-i3test.html # (alternatively: perldoc ./testcases/lib/i3test.pm) # -# • http://build.i3wm.org/docs/ipc.html +# • https://build.i3wm.org/docs/ipc.html # (or docs/ipc) # # • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf @@ -35,7 +35,7 @@ is($tree->{name}, 'root', 'root node is the first thing we get'); my @__i3 = grep { $_->{name} eq '__i3' } @{$tree->{nodes}}; is(scalar @__i3, 1, 'output __i3 found'); -my $content = first { $_->{type} == 2 } @{$__i3[0]->{nodes}}; +my $content = first { $_->{type} eq 'con' } @{$__i3[0]->{nodes}}; my @workspaces = @{$content->{nodes}}; my @workspace_names = map { $_->{name} } @workspaces; ok('__i3_scratch' ~~ @workspace_names, '__i3_scratch workspace found'); @@ -93,8 +93,7 @@ is(scalar @{$__i3_scratch->{floating_nodes}}, 0, '__i3_scratch ws empty'); ################################################################################ # 3: Verify that 'scratchpad toggle' sends a window to the __i3_scratch # workspace and sets the scratchpad flag to SCRATCHPAD_FRESH. The window’s size -# and position will be changed (once!) on the next 'scratchpad show' and the -# flag will be changed to SCRATCHPAD_CHANGED. +# and position will be changed on the next 'scratchpad show'. ################################################################################ my ($nodes, $focus) = get_ws_content($tmp); @@ -165,10 +164,33 @@ $__i3_scratch = get_ws('__i3_scratch'); @scratch_nodes = @{$__i3_scratch->{floating_nodes}}; is(scalar @scratch_nodes, 1, '__i3_scratch contains our window'); -is($scratch_nodes[0]->{scratchpad_state}, 'changed', 'scratchpad_state changed'); +################################################################################ +# 6: Resizing the window should disable auto centering on scratchpad show +################################################################################ + +cmd 'scratchpad show'; + +$ws = get_ws($tmp); +is($ws->{floating_nodes}->[0]->{scratchpad_state}, 'fresh', + 'scratchpad_state fresh'); + +cmd 'resize grow width 10 px'; +cmd 'scratchpad show'; +cmd 'scratchpad show'; + +$ws = get_ws($tmp); +$scratchrect = $ws->{floating_nodes}->[0]->{rect}; +$outputrect = $output->{rect}; + +is($ws->{floating_nodes}->[0]->{scratchpad_state}, 'changed', + 'scratchpad_state changed'); +is($scratchrect->{width}, $outputrect->{width} * 0.5 + 10, 'scratch width is 50% + 10px'); + +cmd 'resize shrink width 10 px'; +cmd 'scratchpad show'; ################################################################################ -# 6: Verify that repeated 'scratchpad show' cycle through the stack, that is, +# 7: Verify that repeated 'scratchpad show' cycle through the stack, that is, # toggling a visible window should insert it at the bottom of the stack of the # __i3_scratch workspace. ################################################################################ @@ -216,39 +238,6 @@ cmd 'scratchpad show'; isnt(get_focused($tmp), $fresh_id, 'focus changed'); -################################################################################ -# 7: Verify that using scratchpad show with criteria works as expected: -# When matching a scratchpad window which is visible, it should hide it. -# When matching a scratchpad window which is on __i3_scratch, it should show it. -# When matching a non-scratchpad window, it should be a no-op. -################################################################################ - -# Verify that using 'scratchpad show' without any matching windows is a no-op. -$old_focus = get_focused($tmp); - -cmd '[title="nomatch"] scratchpad show'; - -is(get_focused($tmp), $old_focus, 'non-matching criteria have no effect'); - -# Verify that we can use criteria to show a scratchpad window. -cmd '[title="scratch-match"] scratchpad show'; - -my $scratch_focus = get_focused($tmp); -isnt($scratch_focus, $old_focus, 'matching criteria works'); - -cmd '[title="scratch-match"] scratchpad show'; - -isnt(get_focused($tmp), $scratch_focus, 'matching criteria works'); -is(get_focused($tmp), $old_focus, 'focus restored'); - -# Verify that we cannot use criteria to show a non-scratchpad window. -my $tmp2 = fresh_workspace; -my $non_scratch_window = open_window(name => 'non-scratch'); -cmd "workspace $tmp"; -is(get_focused($tmp), $old_focus, 'focus still ok'); -cmd '[title="non-match"] scratchpad show'; -is(get_focused($tmp), $old_focus, 'focus unchanged'); - ################################################################################ # 8: Show it, move it around, hide it. Verify that the position is retained # when showing it again. @@ -323,40 +312,225 @@ does_i3_live; # 11: focus a workspace and move all of its children to the scratchpad area ################################################################################ +sub verify_scratchpad_move_multiple_win { + my $floating = shift; + + my $first = open_window; + my $second = open_window; + + if ($floating) { + cmd 'floating toggle'; + cmd 'focus tiling'; + } + + cmd 'focus parent'; + cmd 'move scratchpad'; + + does_i3_live; + + $ws = get_ws($tmp); + is(scalar @{$ws->{nodes}}, 0, 'no windows on ws'); + is(scalar @{$ws->{floating_nodes}}, 0, 'no floating windows on ws'); + + # show the first window. + cmd 'scratchpad show'; + + $ws = get_ws($tmp); + is(scalar @{$ws->{nodes}}, 0, 'no windows on ws'); + is(scalar @{$ws->{floating_nodes}}, 1, 'one floating windows on ws'); + + $old_focus = get_focused($tmp); + + cmd 'scratchpad show'; + + # show the second window. + cmd 'scratchpad show'; + + $ws = get_ws($tmp); + is(scalar @{$ws->{nodes}}, 0, 'no windows on ws'); + is(scalar @{$ws->{floating_nodes}}, 1, 'one floating windows on ws'); + + isnt(get_focused($tmp), $old_focus, 'focus changed'); +} + $tmp = fresh_workspace; +verify_scratchpad_move_multiple_win(0); +$tmp = fresh_workspace; +verify_scratchpad_move_multiple_win(1); -my $first = open_window; -my $second = open_window; +################################################################################ +# 12: open a scratchpad window on a workspace, switch to another workspace and +# call 'scratchpad show' again +################################################################################ -cmd 'focus parent'; -cmd 'move scratchpad'; +sub verify_scratchpad_move_with_visible_scratch_con { + my ($first, $second, $cross_output) = @_; -does_i3_live; + cmd "workspace $first"; -$ws = get_ws($tmp); -is(scalar @{$ws->{nodes}}, 0, 'no windows on ws'); -is(scalar @{$ws->{floating_nodes}}, 0, 'no floating windows on ws'); + my $window1 = open_window; + cmd 'move scratchpad'; -# show the first window. -cmd 'scratchpad show'; + my $window2 = open_window; + cmd 'move scratchpad'; -$ws = get_ws($tmp); -is(scalar @{$ws->{nodes}}, 0, 'no windows on ws'); -is(scalar @{$ws->{floating_nodes}}, 1, 'one floating windows on ws'); + # this should bring up window 1 + cmd 'scratchpad show'; -$old_focus = get_focused($tmp); + $ws = get_ws($first); + is(scalar @{$ws->{floating_nodes}}, 1, 'one floating node on ws1'); + is($x->input_focus, $window1->id, "showed the correct scratchpad window1"); -cmd 'scratchpad show'; + # this should bring up window 1 + cmd "workspace $second"; + cmd 'scratchpad show'; + is($x->input_focus, $window1->id, "showed the correct scratchpad window1"); + + my $ws2 = get_ws($second); + is(scalar @{$ws2->{floating_nodes}}, 1, 'one floating node on ws2'); + unless ($cross_output) { + ok(!workspace_exists($first), 'ws1 was empty and therefore closed'); + } else { + $ws = get_ws($first); + is(scalar @{$ws->{floating_nodes}}, 0, 'ws1 has no floating nodes'); + } + + # hide window 1 again + cmd 'move scratchpad'; + + # this should bring up window 2 + cmd "workspace $first"; + cmd 'scratchpad show'; + is($x->input_focus, $window2->id, "showed the correct scratchpad window"); +} + +# let's clear the scratchpad first +sub clear_scratchpad { + while (scalar @{get_ws('__i3_scratch')->{floating_nodes}}) { + cmd 'scratchpad show'; + cmd 'kill'; + } +} + +clear_scratchpad; +is (scalar @{get_ws('__i3_scratch')->{floating_nodes}}, 0, "scratchpad is empty"); + +my ($first, $second); +$first = fresh_workspace; +$second = fresh_workspace; + +verify_scratchpad_move_with_visible_scratch_con($first, $second, 0); +does_i3_live; -# show the second window. + +################################################################################ +# 13: Test whether scratchpad show moves focus to the scratchpad window +# when another window on the same workspace has focus +################################################################################ + +clear_scratchpad; +$ws = fresh_workspace; + +open_window; +my $scratch = get_focused($ws); +cmd 'move scratchpad'; cmd 'scratchpad show'; -$ws = get_ws($tmp); -is(scalar @{$ws->{nodes}}, 0, 'no windows on ws'); -is(scalar @{$ws->{floating_nodes}}, 1, 'one floating windows on ws'); +open_window; +my $not_scratch = get_focused($ws); +is(get_focused($ws), $not_scratch, 'not scratch window has focus'); -isnt(get_focused($tmp), $old_focus, 'focus changed'); +cmd 'scratchpad show'; + +is(get_focused($ws), $scratch, 'scratchpad is focused'); # TODO: make i3bar display *something* when a window on the scratchpad has the urgency hint +################################################################################ +# 14: Verify that 'move scratchpad' sends floating containers to scratchpad but +# does not resize/resposition the container on the next 'scratchpad show', i.e., +# i3 sets the scratchpad flag to SCRATCHPAD_CHANGED +################################################################################ + +clear_scratchpad; +$tmp = fresh_workspace; +open_window; + +($nodes, $focus) = get_ws_content($tmp); +is(scalar @$nodes, 1, 'precisely one window on current ws'); +is($nodes->[0]->{scratchpad_state}, 'none', 'scratchpad_state none'); + +cmd 'floating toggle'; +cmd 'move scratchpad'; + +$__i3_scratch = get_ws('__i3_scratch'); +@scratch_nodes = @{$__i3_scratch->{floating_nodes}}; +is(scalar @scratch_nodes, 1, '__i3_scratch contains our window'); +($nodes, $focus) = get_ws_content($tmp); +is(scalar @$nodes, 0, 'no window on current ws anymore'); + +is($scratch_nodes[0]->{scratchpad_state}, 'changed', 'scratchpad_state changed'); + +################################################################################ +# 15: Verify that 'scratchpad show' returns correct info. +################################################################################ + +kill_all_windows; + +my $result = cmd 'scratchpad show'; +is($result->[0]->{success}, 0, 'no scratchpad window and call to scratchpad failed'); + +open_window; +cmd 'move scratchpad'; +$result = cmd 'scratchpad show'; +is($result->[0]->{success}, 1, 'call to scratchpad succeeded'); +$result = cmd 'scratchpad show'; +is($result->[0]->{success}, 1, 'call to scratchpad succeeded'); + +kill_all_windows; +$result = cmd 'scratchpad show'; +is($result->[0]->{success}, 0, 'call to scratchpad failed'); + +################################################################################ +# 16: Verify that 'scratchpad show' with the criteria returns correct info. +################################################################################ + +open_window(name => "scratch-match"); +cmd 'move scratchpad'; + +$result = cmd '[title="scratch-match"] scratchpad show'; +is($result->[0]->{success}, 1, 'call to scratchpad with the criteria succeeded'); + +$result = cmd '[title="nomatch"] scratchpad show'; +is($result->[0]->{success}, 0, 'call to scratchpad with non-matching criteria failed'); + +################################################################################ +# 17: Open a scratchpad window on a workspace, switch to another workspace and +# call 'scratchpad show' again. Verify that it returns correct info. +################################################################################ + +fresh_workspace; +open_window; +cmd 'move scratchpad'; + +fresh_workspace; +$result = cmd 'scratchpad show'; +is($result->[0]->{success}, 1, 'call to scratchpad in another workspace succeeded'); + +################################################################################ +# 18: Disabling floating for a scratchpad window should not work. +################################################################################ + +kill_all_windows; + +$ws = fresh_workspace; +$window = open_window; +cmd 'move scratchpad'; +cmd '[id=' . $window->id . '] floating disable'; + +is(scalar @{get_ws_content($ws)}, 0, 'no window in workspace'); +cmd 'scratchpad show'; +is($x->input_focus, $window->id, 'scratchpad window shown'); + + done_testing;