diff --git a/testcases/t/221-floating-type-hints.t b/testcases/t/221-floating-type-hints.t new file mode 100644 index 00000000..01c73a75 --- /dev/null +++ b/testcases/t/221-floating-type-hints.t @@ -0,0 +1,119 @@ +#!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 = 55; + my $max_width = 55; + my $min_height = 77; + my $max_height = 77; + + 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('C5N8', $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'); +$window->unmap; + +done_testing;