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
122 lines
3.7 KiB
Perl
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;
|