2012-01-05 22:39:34 +01:00
|
|
|
|
#!perl
|
|
|
|
|
# vim:ts=4:sw=4:expandtab
|
|
|
|
|
#
|
2012-09-10 14:09:01 +02:00
|
|
|
|
# Please read the following documents before working on tests:
|
2017-09-24 10:19:50 +02:00
|
|
|
|
# • https://build.i3wm.org/docs/testsuite.html
|
2012-09-10 14:09:01 +02:00
|
|
|
|
# (or docs/testsuite)
|
|
|
|
|
#
|
2017-09-24 10:19:50 +02:00
|
|
|
|
# • https://build.i3wm.org/docs/lib-i3test.html
|
2012-09-10 14:09:01 +02:00
|
|
|
|
# (alternatively: perldoc ./testcases/lib/i3test.pm)
|
|
|
|
|
#
|
2017-09-24 10:19:50 +02:00
|
|
|
|
# • https://build.i3wm.org/docs/ipc.html
|
2012-09-10 14:09:01 +02:00
|
|
|
|
# (or docs/ipc)
|
|
|
|
|
#
|
|
|
|
|
# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
|
|
|
|
|
# (unless you are already familiar with Perl)
|
|
|
|
|
#
|
2012-01-05 22:39:34 +01:00
|
|
|
|
# Tests for the scratchpad functionality.
|
|
|
|
|
#
|
|
|
|
|
use i3test;
|
|
|
|
|
use List::Util qw(first);
|
|
|
|
|
|
|
|
|
|
my $i3 = i3(get_socket_path());
|
|
|
|
|
my $tmp = fresh_workspace;
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 1: Verify that the __i3 output contains the __i3_scratch workspace and that
|
|
|
|
|
# it’s empty initially. Also, __i3 should not show up in GET_OUTPUTS so that
|
|
|
|
|
# tools like i3bar will not handle it. Similarly, __i3_scratch should not show
|
|
|
|
|
# up in GET_WORKSPACES. After all, you should not be able to switch to it.
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
my $tree = $i3->get_tree->recv;
|
|
|
|
|
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');
|
|
|
|
|
|
2013-12-14 14:50:44 +01:00
|
|
|
|
my $content = first { $_->{type} eq 'con' } @{$__i3[0]->{nodes}};
|
2012-01-05 22:39:34 +01:00
|
|
|
|
my @workspaces = @{$content->{nodes}};
|
|
|
|
|
my @workspace_names = map { $_->{name} } @workspaces;
|
|
|
|
|
ok('__i3_scratch' ~~ @workspace_names, '__i3_scratch workspace found');
|
|
|
|
|
|
|
|
|
|
my $get_outputs = $i3->get_outputs->recv;
|
|
|
|
|
my $get_ws = $i3->get_workspaces->recv;
|
|
|
|
|
my @output_names = map { $_->{name} } @$get_outputs;
|
|
|
|
|
my @ws_names = map { $_->{name} } @$get_ws;
|
|
|
|
|
|
|
|
|
|
ok(!('__i3' ~~ @output_names), '__i3 not in GET_OUTPUTS');
|
|
|
|
|
ok(!('__i3_scratch' ~~ @ws_names), '__i3_scratch ws not in GET_WORKSPACES');
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 2: Verify that you cannot switch to the __i3_scratch workspace and moving
|
|
|
|
|
# windows to __i3_scratch does not work (users should be aware of the different
|
|
|
|
|
# behavior and acknowledge that by using the scratchpad commands).
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
# Try focusing the workspace.
|
|
|
|
|
my $__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
is($__i3_scratch->{focused}, 0, '__i3_scratch ws not focused');
|
|
|
|
|
|
|
|
|
|
cmd 'workspace __i3_scratch';
|
|
|
|
|
|
|
|
|
|
$__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
is($__i3_scratch->{focused}, 0, '__i3_scratch ws still not focused');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Try moving a window to it.
|
|
|
|
|
is(scalar @{$__i3_scratch->{floating_nodes}}, 0, '__i3_scratch ws empty');
|
|
|
|
|
|
|
|
|
|
my $window = open_window;
|
|
|
|
|
cmd 'move workspace __i3_scratch';
|
|
|
|
|
|
|
|
|
|
$__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
is(scalar @{$__i3_scratch->{floating_nodes}}, 0, '__i3_scratch ws empty');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Try moving the window with the 'output <direction>' command.
|
|
|
|
|
# We hardcode output left since the pseudo-output will be initialized before
|
|
|
|
|
# every other output, so it will always be the first one.
|
|
|
|
|
cmd 'move output left';
|
|
|
|
|
|
|
|
|
|
$__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
is(scalar @{$__i3_scratch->{floating_nodes}}, 0, '__i3_scratch ws empty');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Try moving the window with the 'output <name>' command.
|
|
|
|
|
cmd 'move output __i3';
|
|
|
|
|
|
|
|
|
|
$__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
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
|
2012-09-24 21:14:40 +02:00
|
|
|
|
# and position will be changed on the next 'scratchpad show'.
|
2012-01-05 22:39:34 +01:00
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
my ($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 'move scratchpad';
|
|
|
|
|
|
|
|
|
|
$__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
my @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}, 'fresh', 'scratchpad_state fresh');
|
|
|
|
|
|
|
|
|
|
$tree = $i3->get_tree->recv;
|
|
|
|
|
my $__i3 = first { $_->{name} eq '__i3' } @{$tree->{nodes}};
|
|
|
|
|
isnt($tree->{focus}->[0], $__i3->{id}, '__i3 output not focused');
|
|
|
|
|
|
|
|
|
|
$get_outputs = $i3->get_outputs->recv;
|
|
|
|
|
$get_ws = $i3->get_workspaces->recv;
|
|
|
|
|
@output_names = map { $_->{name} } @$get_outputs;
|
|
|
|
|
@ws_names = map { $_->{name} } @$get_ws;
|
|
|
|
|
|
|
|
|
|
ok(!('__i3' ~~ @output_names), '__i3 not in GET_OUTPUTS');
|
|
|
|
|
ok(!('__i3_scratch' ~~ @ws_names), '__i3_scratch ws not in GET_WORKSPACES');
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 4: Verify that 'scratchpad show' makes the window visible.
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
# Open another window so that we can check if focus is on the scratchpad window
|
|
|
|
|
# after showing it.
|
|
|
|
|
my $second_window = open_window;
|
|
|
|
|
my $old_focus = get_focused($tmp);
|
|
|
|
|
|
|
|
|
|
cmd 'scratchpad show';
|
|
|
|
|
|
|
|
|
|
isnt(get_focused($tmp), $old_focus, 'focus changed');
|
|
|
|
|
|
|
|
|
|
$__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
@scratch_nodes = @{$__i3_scratch->{floating_nodes}};
|
|
|
|
|
is(scalar @scratch_nodes, 0, '__i3_scratch is now empty');
|
|
|
|
|
|
|
|
|
|
my $ws = get_ws($tmp);
|
|
|
|
|
my $output = $tree->{nodes}->[1];
|
|
|
|
|
my $scratchrect = $ws->{floating_nodes}->[0]->{rect};
|
|
|
|
|
my $outputrect = $output->{rect};
|
|
|
|
|
|
|
|
|
|
is($scratchrect->{width}, $outputrect->{width} * 0.5, 'scratch width is 50%');
|
|
|
|
|
is($scratchrect->{height}, $outputrect->{height} * 0.75, 'scratch height is 75%');
|
|
|
|
|
is($scratchrect->{x},
|
|
|
|
|
($outputrect->{width} / 2) - ($scratchrect->{width} / 2),
|
|
|
|
|
'scratch window centered horizontally');
|
|
|
|
|
is($scratchrect->{y},
|
|
|
|
|
($outputrect->{height} / 2 ) - ($scratchrect->{height} / 2),
|
|
|
|
|
'scratch window centered vertically');
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 5: Another 'scratchpad show' should make that window go to the scratchpad
|
|
|
|
|
# again.
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
cmd 'scratchpad show';
|
|
|
|
|
|
|
|
|
|
$__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
@scratch_nodes = @{$__i3_scratch->{floating_nodes}};
|
|
|
|
|
is(scalar @scratch_nodes, 1, '__i3_scratch contains our window');
|
|
|
|
|
|
2012-09-24 21:14:40 +02:00
|
|
|
|
################################################################################
|
|
|
|
|
# 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';
|
2012-01-05 22:39:34 +01:00
|
|
|
|
|
|
|
|
|
################################################################################
|
2012-09-24 21:14:40 +02:00
|
|
|
|
# 7: Verify that repeated 'scratchpad show' cycle through the stack, that is,
|
2012-01-05 22:39:34 +01:00
|
|
|
|
# toggling a visible window should insert it at the bottom of the stack of the
|
|
|
|
|
# __i3_scratch workspace.
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
my $third_window = open_window(name => 'scratch-match');
|
|
|
|
|
cmd 'move scratchpad';
|
|
|
|
|
|
|
|
|
|
$__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
@scratch_nodes = @{$__i3_scratch->{floating_nodes}};
|
|
|
|
|
is(scalar @scratch_nodes, 2, '__i3_scratch contains both windows');
|
|
|
|
|
|
|
|
|
|
is($scratch_nodes[0]->{scratchpad_state}, 'changed', 'changed window first');
|
|
|
|
|
is($scratch_nodes[1]->{scratchpad_state}, 'fresh', 'fresh window is second');
|
|
|
|
|
|
|
|
|
|
my $changed_id = $scratch_nodes[0]->{nodes}->[0]->{id};
|
|
|
|
|
my $fresh_id = $scratch_nodes[1]->{nodes}->[0]->{id};
|
|
|
|
|
is($scratch_nodes[0]->{id}, $__i3_scratch->{focus}->[0], 'changed window first');
|
|
|
|
|
is($scratch_nodes[1]->{id}, $__i3_scratch->{focus}->[1], 'fresh window second');
|
|
|
|
|
|
|
|
|
|
# Repeatedly use 'scratchpad show' and check that the windows are different.
|
|
|
|
|
cmd 'scratchpad show';
|
|
|
|
|
|
|
|
|
|
is(get_focused($tmp), $changed_id, 'focus changed');
|
|
|
|
|
|
|
|
|
|
$ws = get_ws($tmp);
|
|
|
|
|
$scratchrect = $ws->{floating_nodes}->[0]->{rect};
|
|
|
|
|
is($scratchrect->{width}, $outputrect->{width} * 0.5, 'scratch width is 50%');
|
|
|
|
|
is($scratchrect->{height}, $outputrect->{height} * 0.75, 'scratch height is 75%');
|
|
|
|
|
is($scratchrect->{x},
|
|
|
|
|
($outputrect->{width} / 2) - ($scratchrect->{width} / 2),
|
|
|
|
|
'scratch window centered horizontally');
|
|
|
|
|
is($scratchrect->{y},
|
|
|
|
|
($outputrect->{height} / 2 ) - ($scratchrect->{height} / 2),
|
|
|
|
|
'scratch window centered vertically');
|
|
|
|
|
|
|
|
|
|
cmd 'scratchpad show';
|
|
|
|
|
|
|
|
|
|
isnt(get_focused($tmp), $changed_id, 'focus changed');
|
|
|
|
|
|
|
|
|
|
cmd 'scratchpad show';
|
|
|
|
|
|
|
|
|
|
is(get_focused($tmp), $fresh_id, 'focus changed');
|
|
|
|
|
|
|
|
|
|
cmd 'scratchpad show';
|
|
|
|
|
|
|
|
|
|
isnt(get_focused($tmp), $fresh_id, 'focus changed');
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 8: Show it, move it around, hide it. Verify that the position is retained
|
|
|
|
|
# when showing it again.
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
cmd '[title="scratch-match"] scratchpad show';
|
|
|
|
|
|
|
|
|
|
isnt(get_focused($tmp), $old_focus, 'scratchpad window shown');
|
|
|
|
|
|
|
|
|
|
my $oldrect = get_ws($tmp)->{floating_nodes}->[0]->{rect};
|
|
|
|
|
|
|
|
|
|
cmd 'move left';
|
|
|
|
|
|
|
|
|
|
$scratchrect = get_ws($tmp)->{floating_nodes}->[0]->{rect};
|
|
|
|
|
isnt($scratchrect->{x}, $oldrect->{x}, 'x position changed');
|
|
|
|
|
$oldrect = $scratchrect;
|
|
|
|
|
|
|
|
|
|
# hide it, then show it again
|
|
|
|
|
cmd '[title="scratch-match"] scratchpad show';
|
|
|
|
|
cmd '[title="scratch-match"] scratchpad show';
|
|
|
|
|
|
|
|
|
|
# verify the position is still the same
|
|
|
|
|
$scratchrect = get_ws($tmp)->{floating_nodes}->[0]->{rect};
|
|
|
|
|
|
|
|
|
|
is_deeply($scratchrect, $oldrect, 'position/size the same');
|
|
|
|
|
|
|
|
|
|
# hide it again for the next test
|
|
|
|
|
cmd '[title="scratch-match"] scratchpad show';
|
|
|
|
|
|
|
|
|
|
is(get_focused($tmp), $old_focus, 'scratchpad window hidden');
|
|
|
|
|
|
|
|
|
|
is(scalar @{get_ws($tmp)->{nodes}}, 1, 'precisely one window on current ws');
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 9: restart i3 and verify that the scratchpad show still works
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
$__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
my $old_nodes = scalar @{$__i3_scratch->{nodes}};
|
|
|
|
|
my $old_floating_nodes = scalar @{$__i3_scratch->{floating_nodes}};
|
|
|
|
|
|
|
|
|
|
cmd 'restart';
|
|
|
|
|
|
|
|
|
|
does_i3_live;
|
|
|
|
|
|
|
|
|
|
$__i3_scratch = get_ws('__i3_scratch');
|
|
|
|
|
is(scalar @{$__i3_scratch->{nodes}}, $old_nodes, "number of nodes matches ($old_nodes)");
|
|
|
|
|
is(scalar @{$__i3_scratch->{floating_nodes}}, $old_floating_nodes, "number of floating nodes matches ($old_floating_nodes)");
|
|
|
|
|
|
|
|
|
|
is(scalar @{get_ws($tmp)->{nodes}}, 1, 'still precisely one window on current ws');
|
|
|
|
|
is(scalar @{get_ws($tmp)->{floating_nodes}}, 0, 'still no floating windows on current ws');
|
|
|
|
|
|
|
|
|
|
# verify that we can display the scratchpad window
|
|
|
|
|
cmd '[title="scratch-match"] scratchpad show';
|
|
|
|
|
|
|
|
|
|
$ws = get_ws($tmp);
|
|
|
|
|
is(scalar @{$ws->{nodes}}, 1, 'still precisely one window on current ws');
|
|
|
|
|
is(scalar @{$ws->{floating_nodes}}, 1, 'precisely one floating windows on current ws');
|
|
|
|
|
is($ws->{floating_nodes}->[0]->{scratchpad_state}, 'changed', 'scratchpad_state is "changed"');
|
|
|
|
|
|
2012-01-07 18:36:30 +01:00
|
|
|
|
################################################################################
|
|
|
|
|
# 10: on an empty workspace, ensure the 'move scratchpad' command does nothing
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
$tmp = fresh_workspace;
|
|
|
|
|
|
|
|
|
|
cmd 'move scratchpad';
|
|
|
|
|
|
|
|
|
|
does_i3_live;
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 11: focus a workspace and move all of its children to the scratchpad area
|
|
|
|
|
################################################################################
|
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
sub verify_scratchpad_move_multiple_win {
|
|
|
|
|
my $floating = shift;
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
my $first = open_window;
|
|
|
|
|
my $second = open_window;
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
if ($floating) {
|
|
|
|
|
cmd 'floating toggle';
|
|
|
|
|
cmd 'focus tiling';
|
|
|
|
|
}
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
cmd 'focus parent';
|
|
|
|
|
cmd 'move scratchpad';
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
does_i3_live;
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
$ws = get_ws($tmp);
|
|
|
|
|
is(scalar @{$ws->{nodes}}, 0, 'no windows on ws');
|
|
|
|
|
is(scalar @{$ws->{floating_nodes}}, 0, 'no floating windows on ws');
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
# show the first window.
|
|
|
|
|
cmd 'scratchpad show';
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
$ws = get_ws($tmp);
|
|
|
|
|
is(scalar @{$ws->{nodes}}, 0, 'no windows on ws');
|
|
|
|
|
is(scalar @{$ws->{floating_nodes}}, 1, 'one floating windows on ws');
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
$old_focus = get_focused($tmp);
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
cmd 'scratchpad show';
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
# show the second window.
|
|
|
|
|
cmd 'scratchpad show';
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-09-28 00:38:02 +02:00
|
|
|
|
$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);
|
2012-01-07 18:36:30 +01:00
|
|
|
|
|
2012-12-21 22:13:31 +01:00
|
|
|
|
################################################################################
|
|
|
|
|
# 12: open a scratchpad window on a workspace, switch to another workspace and
|
|
|
|
|
# call 'scratchpad show' again
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
sub verify_scratchpad_move_with_visible_scratch_con {
|
|
|
|
|
my ($first, $second, $cross_output) = @_;
|
|
|
|
|
|
|
|
|
|
cmd "workspace $first";
|
|
|
|
|
|
|
|
|
|
my $window1 = open_window;
|
|
|
|
|
cmd 'move scratchpad';
|
|
|
|
|
|
|
|
|
|
my $window2 = open_window;
|
|
|
|
|
cmd 'move scratchpad';
|
|
|
|
|
|
|
|
|
|
# this should bring up window 1
|
|
|
|
|
cmd 'scratchpad show';
|
|
|
|
|
|
2015-06-12 18:19:43 +02:00
|
|
|
|
$ws = get_ws($first);
|
2012-12-21 22:13:31 +01:00
|
|
|
|
is(scalar @{$ws->{floating_nodes}}, 1, 'one floating node on ws1');
|
|
|
|
|
is($x->input_focus, $window1->id, "showed the correct scratchpad window1");
|
|
|
|
|
|
|
|
|
|
# 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;
|
|
|
|
|
|
2013-01-28 10:11:53 +01:00
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
|
# 13: Test whether scratchpad show moves focus to the scratchpad window
|
|
|
|
|
# when another window on the same workspace has focus
|
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
|
|
clear_scratchpad;
|
2017-12-26 13:16:15 +01:00
|
|
|
|
$ws = fresh_workspace;
|
2013-01-28 10:11:53 +01:00
|
|
|
|
|
|
|
|
|
open_window;
|
|
|
|
|
my $scratch = get_focused($ws);
|
|
|
|
|
cmd 'move scratchpad';
|
|
|
|
|
cmd 'scratchpad show';
|
|
|
|
|
|
|
|
|
|
open_window;
|
|
|
|
|
my $not_scratch = get_focused($ws);
|
|
|
|
|
is(get_focused($ws), $not_scratch, 'not scratch window has focus');
|
|
|
|
|
|
|
|
|
|
cmd 'scratchpad show';
|
|
|
|
|
|
|
|
|
|
is(get_focused($ws), $scratch, 'scratchpad is focused');
|
|
|
|
|
|
2012-01-05 22:39:34 +01:00
|
|
|
|
# TODO: make i3bar display *something* when a window on the scratchpad has the urgency hint
|
|
|
|
|
|
2013-09-27 11:03:52 +02:00
|
|
|
|
################################################################################
|
|
|
|
|
# 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');
|
|
|
|
|
|
2018-04-06 18:00:38 +02:00
|
|
|
|
################################################################################
|
|
|
|
|
# 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');
|
|
|
|
|
|
2018-08-28 09:26:07 +02:00
|
|
|
|
################################################################################
|
|
|
|
|
# 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');
|
|
|
|
|
|
|
|
|
|
|
2012-01-05 22:39:34 +01:00
|
|
|
|
done_testing;
|