From 297003126d44d8a31bb6c3899817f8f2dff29b80 Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Fri, 10 Aug 2018 16:39:46 +0200 Subject: [PATCH] Handle unsetting of .transient_for When a window has a WM_TRANSIENT_FOR property that is later unset, awesome would still keep c.transient_for pointing to the previous "parent client". This commit fixes that. First, property_update_wm_transient_for() is fixed so that it unsets c->transient_for_window if the WM_TRANSIENT_FOR property is deleted. Additionally, this then calls client_find_transient_for() to update the c->transient_for pointer. Secondly (and a bit unrelated), this changes client_find_transient_for() so that it always sets c->transient_for. Previously, if updating this property would introduce a cycle in the transient_for relation, it would just leave c->transient_for with its old value. After this change, it gets explicitly set to NULL instead. Signed-off-by: Uli Schlachter --- objects/client.c | 16 ++++++++++------ property.c | 10 +++++++--- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/objects/client.c b/objects/client.c index 817205638..197054878 100644 --- a/objects/client.c +++ b/objects/client.c @@ -983,7 +983,9 @@ client_find_transient_for(client_t *c) { int counter; client_t *tc, *tmp; + lua_State *L = globalconf_get_lua_State(); + /* This might return NULL, in which case we unset transient_for */ tmp = tc = client_getbywin(c->transient_for_window); /* Verify that there are no loops in the transient_for relation after we are done */ @@ -994,14 +996,16 @@ client_find_transient_for(client_t *c) counter = globalconf.stack.len+1; tmp = tmp->transient_for; } - if (counter <= globalconf.stack.len) - { - lua_State *L = globalconf_get_lua_State(); - luaA_object_push(L, c); - client_set_transient_for(L, -1, tc); - lua_pop(L, 1); + if (counter > globalconf.stack.len) + { + /* There was a loop, so unset .transient_for */ + tc = NULL; } + + luaA_object_push(L, c); + client_set_transient_for(L, -1, tc); + lua_pop(L, 1); } void diff --git a/property.c b/property.c index b5c5de145..8ee102a3a 100644 --- a/property.c +++ b/property.c @@ -107,9 +107,13 @@ property_update_wm_transient_for(client_t *c, xcb_get_property_cookie_t cookie) xcb_window_t trans; if(!xcb_icccm_get_wm_transient_for_reply(globalconf.connection, - cookie, - &trans, NULL)) - return; + cookie, + &trans, NULL)) + { + c->transient_for_window = XCB_NONE; + client_find_transient_for(c); + return; + } c->transient_for_window = trans;