gri3-wm/testcases/t/310-client-message-sticky.t

71 lines
2.0 KiB
Raku
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!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)
#
# • http://onyxneon.com/books/modern_perl/modern_perl_a4.pdf
# (unless you are already familiar with Perl)
#
# Verify that _NET_WM_DESKTOP sticky requests do not conflict with dock
# clients, resulting in a crash
# Ticket: #4039
# Bug still in: 4.18-238-g4d55bba7f
use i3test;
sub send_sticky_request {
my ($win) = @_;
my $msg = pack "CCSLLLLLL",
X11::XCB::CLIENT_MESSAGE, # response_type
32, # format
0, # sequence
$win->id, # window
$x->atom(name => '_NET_WM_DESKTOP')->id, # message type
hex '0xFFFFFFFF', # data32[0] = NET_WM_DESKTOP_ALL
0, # data32[1]
0, # data32[2]
0, # data32[3]
0; # data32[4]
$x->send_event(0, $x->get_root_window(), X11::XCB::EVENT_MASK_SUBSTRUCTURE_REDIRECT, $msg);
}
# Test the normal functionality first
my $ws = fresh_workspace;
my $win = open_window;
is(@{get_ws($ws)->{floating_nodes}}, 0, 'No floating windows yet');
send_sticky_request($win);
sync_with_i3;
is(@{get_ws($ws)->{floating_nodes}}, 1, 'One floating (sticky) window');
$ws = fresh_workspace;
is(@{get_ws($ws)->{floating_nodes}}, 1, 'Sticky window in new workspace');
# See #4039
kill_all_windows;
$win = open_window({
window_type => $x->atom(name => '_NET_WM_WINDOW_TYPE_DOCK')
});
send_sticky_request($win);
sync_with_i3;
is(@{get_ws($ws)->{floating_nodes}}, 0, 'Dock client did not get sticky/floating');
# Cause a ConfigureRequest by setting the windows position/size.
my ($a, $t) = $win->rect;
$win->rect(X11::XCB::Rect->new(x => 0, y => 0, width => $a->width, height => $a->height));
does_i3_live;
is(@{get_ws($ws)->{floating_nodes}}, 0, 'Dock client still not sticky/floating');
done_testing;