From ad95038c5e1d99bd32e32d6f52be0272a15c6b05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ingo=20B=C3=BCrk?= Date: Sun, 7 Feb 2016 12:08:50 +0100 Subject: [PATCH] Remove _NET_WM_STATE on withdrawn windows. According to the spec, _NET_WM_STATE must be removed when the window is withdrawn, much like _NET_WM_DESKTOP. fixes #2165 --- src/handlers.c | 4 +++- testcases/t/253-multiple-net-wm-state-atoms.t | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/handlers.c b/src/handlers.c index 7e116ce7..2991d7c3 100644 --- a/src/handlers.c +++ b/src/handlers.c @@ -503,8 +503,10 @@ static void handle_unmap_notify_event(xcb_unmap_notify_event_t *event) { goto ignore_end; } - /* Since we close the container, we need to unset _NET_WM_DESKTOP according to the spec. */ + /* Since we close the container, we need to unset _NET_WM_DESKTOP and + * _NET_WM_STATE according to the spec. */ xcb_delete_property(conn, event->window, A__NET_WM_DESKTOP); + xcb_delete_property(conn, event->window, A__NET_WM_STATE); tree_close_internal(con, DONT_KILL_WINDOW, false, false); tree_render(); diff --git a/testcases/t/253-multiple-net-wm-state-atoms.t b/testcases/t/253-multiple-net-wm-state-atoms.t index bbd6c521..bfa8b46c 100644 --- a/testcases/t/253-multiple-net-wm-state-atoms.t +++ b/testcases/t/253-multiple-net-wm-state-atoms.t @@ -33,7 +33,7 @@ sub get_wm_state { my $reply = $x->get_property_reply($cookie->{sequence}); my $len = $reply->{length}; - return 0 if $len == 0; + return undef if $len == 0; my @atoms = unpack("L$len", $reply->{value}); return \@atoms; @@ -64,6 +64,20 @@ cmd 'sticky enable'; cmd 'fullscreen disable'; is_deeply(get_wm_state($window), [ $wm_state_sticky ], 'only _NET_WM_STATE_STICKY is set'); +############################################################################### +# _NET_WM_STATE is removed when the window is withdrawn. +############################################################################### + +fresh_workspace; +$window = open_window; +cmd 'sticky enable'; +is_deeply(get_wm_state($window), [ $wm_state_sticky ], 'sanity check: _NET_WM_STATE_STICKY is set'); + +$window->unmap; +wait_for_unmap($window); + +is(get_wm_state($window), undef, '_NET_WM_STATE is removed'); + ########################################################################## done_testing;