i3/testcases/t/505-scratchpad-resolution.t
Michael Stapelberg 6ba0944430 scratchpad: fix moving scratchpad window
From the source:

    When starting i3 initially (and after each change to the connected
    outputs), this function fixes the resolution of the __i3
    pseudo-output. When that resolution is not set to a function which
    shares a common divisor with every active output’s resolution,
    floating point calculation errors will lead to the scratchpad window
    moving when shown repeatedly.

fixes #632
2012-08-08 18:45:40 +02:00

77 lines
2.1 KiB
Perl
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!perl
# vim:ts=4:sw=4:expandtab
#
# Verifies that scratchpad windows dont move due to floating point caulcation
# errors when repeatedly hiding/showing, no matter what display resolution.
#
use i3test i3_autostart => 0;
my $config = <<EOT;
# i3 config file (v4)
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
fake-outputs 683x768+0+0,1024x768+683+0
EOT
my $pid = launch_with_config($config);
my $i3 = i3(get_socket_path());
$x->root->warp_pointer(0, 0);
sync_with_i3;
sub verify_scratchpad_doesnt_move {
my ($ws) = @_;
is(scalar @{get_ws($ws)->{nodes}}, 0, 'no nodes on this ws');
my $window = open_window;
is(scalar @{get_ws($ws)->{nodes}}, 1, 'one nodes on this ws');
cmd 'move scratchpad';
is(scalar @{get_ws($ws)->{nodes}}, 0, 'no nodes on this ws');
my $last_x = -1;
for (1 .. 20) {
cmd 'scratchpad show';
is(scalar @{get_ws($ws)->{floating_nodes}}, 1, 'one floating node on this ws');
# Verify that the coordinates are within bounds.
my $content = get_ws($ws);
my $srect = $content->{floating_nodes}->[0]->{rect};
if ($last_x > -1) {
is($srect->{x}, $last_x, 'scratchpad window did not move');
}
$last_x = $srect->{x};
cmd 'scratchpad show';
}
# We need to kill the scratchpad window, otherwise scratchpad show in
# subsequent calls of verify_scratchpad_doesnt_move will cycle between all
# the windows.
cmd 'scratchpad show';
cmd 'kill';
}
################################################################################
# test it on the left output first (1366x768)
################################################################################
my $second = fresh_workspace(output => 0);
verify_scratchpad_doesnt_move($second);
################################################################################
# now on the right output (1024x768)
################################################################################
$x->root->warp_pointer(683 + 10, 0);
sync_with_i3;
my $third = fresh_workspace(output => 1);
verify_scratchpad_doesnt_move($third);
exit_gracefully($pid);
done_testing;