i3/testcases/t/221-floating-type-hints.t
Ingo Bürk a301396997 Respect minimum size hints for floating windows. (#2508)
This commit introduces proper support for the minimum size on floating
windows by ensuring that it is respected during mapping, later changes as
well as resizes.

Furthermore, this commit fixes minor issues with how the hints are handled
during calculations.

fixes #2436
2016-11-28 22:09:39 +01:00

122 lines
3.7 KiB
Perl

#!perl
# vim:ts=4:sw=4:expandtab
#
# Please read the following documents before working on tests:
# • http://build.i3wm.org/docs/testsuite.html
# (or docs/testsuite)
#
# • http://build.i3wm.org/docs/lib-i3test.html
# (alternatively: perldoc ./testcases/lib/i3test.pm)
#
# • http://build.i3wm.org/docs/ipc.html
# (or docs/ipc)
#
# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
# (unless you are already familiar with Perl)
#
# Verifies that windows with properties that indicate they should be floating
# are indeed opened floating.
# Ticket: #1182
# Bug still in: 4.7.2-97-g84fc808
use i3test;
use X11::XCB qw(PROP_MODE_REPLACE);
sub open_with_type {
my $window_type = shift;
my $window = open_window(
window_type => $x->atom(name => $window_type),
);
return $window;
}
sub open_with_state {
my $window_state = shift;
my $window = open_window(
before_map => sub {
my ($window) = @_;
my $atomname = $x->atom(name => '_NET_WM_STATE');
my $atomtype = $x->atom(name => 'ATOM');
$x->change_property(
PROP_MODE_REPLACE,
$window->id,
$atomname->id,
$atomtype->id,
32,
1,
pack('L1', $x->atom(name => $window_state)->id),
);
},
);
return $window;
}
sub open_with_fixed_size {
# The type of the WM_NORMAL_HINTS property is WM_SIZE_HINTS
# http://tronche.com/gui/x/icccm/sec-4.html#s-4.1.2.3
my $XCB_ICCCM_SIZE_HINT_P_MIN_SIZE = 0x32;
my $XCB_ICCCM_SIZE_HINT_P_MAX_SIZE = 0x16;
my $flags = $XCB_ICCCM_SIZE_HINT_P_MIN_SIZE | $XCB_ICCCM_SIZE_HINT_P_MAX_SIZE;
my $min_width = 150;
my $max_width = 150;
my $min_height = 100;
my $max_height = 100;
my $pad = 0x00;
my $window = open_window(
before_map => sub {
my ($window) = @_;
my $atomname = $x->atom(name => 'WM_NORMAL_HINTS');
my $atomtype = $x->atom(name => 'WM_SIZE_HINTS');
$x->change_property(
PROP_MODE_REPLACE,
$window->id,
$atomname->id,
$atomtype->id,
32,
12,
pack('C5N7', $flags, $pad, $pad, $pad, $pad, 0, 0, 0, $min_width, $min_height, $max_width, $max_height),
);
},
);
return $window;
}
my $ws = fresh_workspace;
my $window = open_with_type '_NET_WM_WINDOW_TYPE_DIALOG';
is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Dialog window opened floating');
$window->unmap;
$window = open_with_type '_NET_WM_WINDOW_TYPE_UTILITY';
is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Utility window opened floating');
$window->unmap;
$window = open_with_type '_NET_WM_WINDOW_TYPE_TOOLBAR';
is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Toolbar window opened floating');
$window->unmap;
$window = open_with_type '_NET_WM_WINDOW_TYPE_SPLASH';
is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Splash window opened floating');
$window->unmap;
$window = open_with_state '_NET_WM_STATE_MODAL';
is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Modal window opened floating');
$window->unmap;
$window = open_with_fixed_size;
is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window}, $window->id, 'Fixed size window opened floating');
is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window_rect}->{width}, 150, 'Fixed size window opened with minimum width');
is(get_ws($ws)->{floating_nodes}[0]->{nodes}[0]->{window_rect}->{height}, 100, 'Fixed size window opened with minimum height');
$window->unmap;
done_testing;