#!perl # vim:ts=4:sw=4:expandtab # # Please read the following documents before working on tests: # • https://build.i3wm.org/docs/testsuite.html # (or docs/testsuite) # # • https://build.i3wm.org/docs/lib-i3test.html # (alternatively: perldoc ./testcases/lib/i3test.pm) # # • https://build.i3wm.org/docs/ipc.html # (or docs/ipc) # # • https://i3wm.org/downloads/modern_perl_a4.pdf # (unless you are already familiar with Perl) # # Basic gaps functionality test # Ticket: #3724 use i3test i3_autostart => 0; use i3test::Util qw(slurp); my $config = <rect; my $right_rect = $right->rect; # Gaps toward one screen edge, each window covers half of the screen, # each gets half of the inner gaps. my $expected_width = ($screen_width / 2) - $total_gaps - ($inner_gaps / 2); # Gaps toward the screen edges at top and bottom. my $expected_height = $screen_height - 2 * $total_gaps; is_deeply($left_rect, { x => $total_gaps, y => $total_gaps, width => $expected_width, height => $expected_height, }, 'left window position and size matches gaps expectations'); is_deeply($right_rect, { x => $left_rect->x + $left_rect->width + $inner_gaps, y => $total_gaps, width => $expected_width, height => $expected_height, }, 'right window position and size matches gaps expectations'); } is_gaps(); ################################################################################ # gaps command ################################################################################ # Verify gaps on a different workspace do not influence the existing workspace fresh_workspace; cmd 'gaps outer current set 30px'; cmd "workspace $tmp"; is_gaps(); # Verify global gaps do influence all workspaces cmd 'gaps outer all set 30px'; $outer_gaps = 30; $total_gaps = $outer_gaps + $inner_gaps; is_gaps(); # Verify negative outer gaps compensate inner gaps, resulting only in gaps # in between adjacent windows or split containers, not towards the screen edges. cmd 'gaps outer all set -10px'; sub is_gaps_in_between_only { local $Test::Builder::Level = $Test::Builder::Level + 1; sync_with_i3; my $left_rect = $left->rect; my $right_rect = $right->rect; # No gaps towards the screen edges, each window covers half of the screen, # each gets half of the inner gaps. my $expected_width = ($screen_width / 2) - ($inner_gaps / 2); # No gaps towards the screen edges at top and bottom. my $expected_height = $screen_height; is_deeply($left_rect, { x => 0, y => 0, width => $expected_width, height => $expected_height, }, 'left window position and size matches gaps expectations'); is_deeply($right_rect, { x => $left_rect->x + $left_rect->width + $inner_gaps, y => 0, width => $expected_width, height => $expected_height, }, 'right window position and size matches gaps expectations'); } is_gaps_in_between_only(); # Reduce the inner gaps and verify the outer gaps are adjusted to not # over-compensate. cmd 'gaps inner all set 6px'; $inner_gaps = 6; $total_gaps = $outer_gaps + $inner_gaps; is_gaps_in_between_only(); exit_gracefully($pid); ################################################################################ # Ensure gaps configuration does not need to be ordered from least to most specific ################################################################################ $config = <destroy; $inner_gaps = 10; $outer_gaps = 0; $total_gaps = $outer_gaps + $inner_gaps; is_gaps(); exit_gracefully($pid); ################################################################################ # Ensure floating split containers don’t get gaps (issue #5272). ################################################################################ $config = <rect; cmd 'border pixel 0'; sync_with_i3; is_deeply(scalar $floating->rect, $orig_rect, 'floating window position unchanged after border pixel 0'); cmd 'layout stacking'; sync_with_i3; is_deeply(scalar $floating->rect, $orig_rect, 'floating window position unchanged after border pixel 0'); exit_gracefully($pid); ################################################################################ # Ensure existing workspaces pick up changes in gap assignments (issue #5257). ################################################################################ $config = <get_version()->recv; open(my $configfh, '>', $version->{'loaded_config_file_name'}); say $configfh <rect; my $right_rect = $right->rect; is_deeply($left_rect, { x => 10, y => 20, width => $screen_width/2 - 10/2, height => $screen_height - 20, }, 'left window position and size matches gaps expectations'); is_deeply($right_rect, { x => $left_rect->x + $left_rect->width, y => 20, width => $screen_width/2 - 10/2, height => $left_rect->height, }, 'right window position and size matches gaps expectations'); exit_gracefully($pid); done_testing;