From: Ingo Bürk Date: Fri, 17 Apr 2015 18:09:53 +0000 (+0200) Subject: Added testcases for setting _NET_WM_STATE_HIDDEN on unfocused containers in tabbed... X-Git-Tag: 4.11~122^2 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=refs%2Fpull%2F1664%2Fhead;p=i3%2Fi3 Added testcases for setting _NET_WM_STATE_HIDDEN on unfocused containers in tabbed/stacked containers. --- diff --git a/testcases/t/243-net-wm-state-hidden.t b/testcases/t/243-net-wm-state-hidden.t new file mode 100644 index 00000000..3f2301c6 --- /dev/null +++ b/testcases/t/243-net-wm-state-hidden.t @@ -0,0 +1,201 @@ +#!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) +# +# Tests for setting and removing the _NET_WM_STATE_HIDDEN atom properly. +# Ticket: #1648 +use i3test; +use X11::XCB qw(:all); + +sub is_hidden { + sync_with_i3; + my $atom = $x->atom(name => '_NET_WM_STATE_HIDDEN'); + + my ($con) = @_; + my $cookie = $x->get_property( + 0, + $con->{id}, + $x->atom(name => '_NET_WM_STATE')->id, + GET_PROPERTY_TYPE_ANY, + 0, + 4096 + ); + + my $reply = $x->get_property_reply($cookie->{sequence}); + my $len = $reply->{length}; + return 0 if $len == 0; + + my @atoms = unpack("L$len", $reply->{value}); + for (my $i = 0; $i < $len; $i++) { + return 1 if $atoms[$i] == $atom->id; + } + + return 0; +} + +my ($tabA, $tabB, $tabC, $subtabA, $subtabB, $windowA, $windowB); + +############################################################################### +# Given two containers next to each other, when focusing one, then the other +# one does not have _NET_WM_STATE_HIDDEN set. +############################################################################### + +fresh_workspace; +$windowA = open_window; +$windowB = open_window; + +ok(!is_hidden($windowA), 'left window does not have _NET_WM_STATE_HIDDEN set'); +ok(!is_hidden($windowB), 'right window does not have _NET_WM_STATE_HIDDEN set'); + +############################################################################### +# Given two containers on different workspaces, when one is focused, then +# the other one does not have _NET_WM_STATE_HIDDEN set. +############################################################################### + +fresh_workspace; +$windowA = open_window; +fresh_workspace; +$windowB = open_window; + +ok(!is_hidden($windowA), 'left window does not have _NET_WM_STATE_HIDDEN set'); +ok(!is_hidden($windowB), 'right window does not have _NET_WM_STATE_HIDDEN set'); + +############################################################################### +# Given two containers in the same tabbed container, when one is focused, then +# (only) the other one has _NET_WM_STATE_HIDDEN set. +# Given the other tab is focused, then the atom is transferred. +############################################################################### + +fresh_workspace; +$tabA = open_window; +cmd 'layout tabbed'; +$tabB = open_window; + +ok(is_hidden($tabA), 'unfocused tab has _NET_WM_STATE_HIDDEN set'); +ok(!is_hidden($tabB), 'focused tab does not have _NET_WM_STATE_HIDDEN set'); + +cmd 'focus left'; + +ok(!is_hidden($tabA), 'focused tab does not have _NET_WM_STATE_HIDDEN set'); +ok(is_hidden($tabB), 'unfocused tab has _NET_WM_STATE_HIDDEN set'); + +############################################################################### +# Given three containers in the same stacked container, when the focused tab +# is moved to another workspace, then the now focused tab does not have +# _NET_WM_STATE_HIDDEN set anymore. +############################################################################### + +fresh_workspace; +$tabA = open_window; +cmd 'layout stacked'; +$tabB = open_window; +$tabC = open_window; +cmd 'move window to workspace unused'; + +ok(is_hidden($tabA), 'unfocused tab has _NET_WM_STATE_HIDDEN set'); +ok(!is_hidden($tabB), 'focused tab does not have _NET_WM_STATE_HIDDEN set'); +ok(!is_hidden($tabC), 'moved window does not have _NET_WM_STATE_HIDDEN set'); + +############################################################################### +# Given three containers in the same stacked container, when a not focused +# tab is moved to another workspace, then it does not have _NET_WM_STATE_HIDDEN +# set anymore. +############################################################################### + +fresh_workspace; +$tabA = open_window; +cmd 'layout stacked'; +$tabB = open_window; +cmd 'mark moveme'; +$tabC = open_window; +cmd '[con_mark="moveme"] move window to workspace unused'; + +ok(is_hidden($tabA), 'unfocused tab has _NET_WM_STATE_HIDDEN set'); +ok(!is_hidden($tabB), 'moved window does not have _NET_WM_STATE_HIDDEN set'); +ok(!is_hidden($tabC), 'focused tab does not have _NET_WM_STATE_HIDDEN set'); + +############################################################################### +# Given a tabbed container and some other container, when the latter is moved +# into the tabbed container, then all other tabs have _NET_WM_STATE_HIDDEN +# set. +############################################################################### + +fresh_workspace; +$tabA = open_window; +cmd 'layout tabbed'; +$tabB = open_window; +cmd 'focus parent'; +cmd 'split h'; +$tabC = open_window; +cmd 'move left'; + +ok(is_hidden($tabA), 'unfocused tab has _NET_WM_STATE_HIDDEN set'); +ok(is_hidden($tabB), 'unfocused tab has _NET_WM_STATE_HIDDEN set'); +ok(!is_hidden($tabC), 'focused tab does not have _NET_WM_STATE_HIDDEN set'); + +############################################################################### +# Given a stacked container nested inside another tabbed container with the +# inner one being in the currently focused tab, then the focused tab of the +# inner container does not have _NET_WM_STATE_HIDDEN set. +############################################################################### + +fresh_workspace; +$tabA = open_window; +cmd 'layout tabbed'; +$tabB = open_window; +cmd 'split h'; +open_window; +cmd 'split v'; +cmd 'layout stacked'; +$subtabA = open_window; +$subtabB = open_window; + +ok(is_hidden($tabA), 'unfocused outer tab has _NET_WM_STATE_HIDDEN set'); +ok(!is_hidden($tabB), 'focused outer tab does not have _NET_WM_STATE_HIDDEN set'); +ok(is_hidden($subtabA), 'unfocused inner tab has _NET_WM_STATE_HIDDEN set'); +ok(!is_hidden($subtabB), 'focused inner tab does not have _NET_WM_STATE_HIDDEN set'); + +cmd 'focus left'; + +ok(!is_hidden($subtabB), 'focused inner tab does not have _NET_WM_STATE_HIDDEN set'); + +############################################################################### +# Given a stacked container nested inside another tabbed container with the +# inner one being in a currently not focused tab, then all tabs of the inner +# container have _NET_WM_STATE_HIDDEN set. +############################################################################### + +fresh_workspace; +$tabA = open_window; +cmd 'layout tabbed'; +$tabB = open_window; +cmd 'split h'; +open_window; +cmd 'split v'; +cmd 'layout stacked'; +$subtabA = open_window; +$subtabB = open_window; +cmd 'focus parent'; +cmd 'focus parent'; +cmd 'focus left'; + +ok(!is_hidden($tabA), 'focused outer tab does not have _NET_WM_STATE_HIDDEN set'); +ok(is_hidden($tabB), 'unfocused outer tab has _NET_WM_STATE_HIDDEN set'); +ok(is_hidden($subtabA), 'unfocused inner tab has _NET_WM_STATE_HIDDEN set'); +ok(is_hidden($subtabB), 'unfocused inner tab has _NET_WM_STATE_HIDDEN set'); + +############################################################################### + +done_testing;