Update transient_for when a new window appears

When we manage the transient before the main window, the client object's
.transient_for property would stay nil. This happens because the property points
to a window which we don't know (yet) and thus is ignored.

Fix this by remembering the value of WM_TRANSIENT_FOR and checking in
client_manage() if the new client is the "missing window we did not find
before".

Fixes: https://github.com/awesomeWM/awesome/issues/181
Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
Uli Schlachter 2016-02-22 21:09:25 +01:00
parent 9907f804b2
commit d598a4115a
3 changed files with 13 additions and 4 deletions

View File

@ -212,12 +212,12 @@ DO_CLIENT_SET_STRING_PROPERTY(machine)
#undef DO_CLIENT_SET_STRING_PROPERTY #undef DO_CLIENT_SET_STRING_PROPERTY
void void
client_find_transient_for(client_t *c, xcb_window_t trans) client_find_transient_for(client_t *c)
{ {
int counter; int counter;
client_t *tc, *tmp; client_t *tc, *tmp;
tmp = tc = client_getbywin(trans); tmp = tc = client_getbywin(c->transient_for_window);
/* Verify that there are no loops in the transient_for relation after we are done */ /* Verify that there are no loops in the transient_for relation after we are done */
for(counter = 0; tmp != NULL && counter <= globalconf.stack.len; counter++) for(counter = 0; tmp != NULL && counter <= globalconf.stack.len; counter++)
@ -660,6 +660,11 @@ HANDLE_GEOM(height)
/* update all properties */ /* update all properties */
client_update_properties(L, -1, c); client_update_properties(L, -1, c);
/* check if this is a TRANSIENT_FOR of another client */
foreach(oc, globalconf.clients)
if ((*oc)->transient_for_window == w)
client_find_transient_for(*oc);
/* Then check clients hints */ /* Then check clients hints */
ewmh_client_check_hints(c); ewmh_client_check_hints(c);

View File

@ -121,6 +121,8 @@ struct client_t
uint32_t pid; uint32_t pid;
/** Window it is transient for */ /** Window it is transient for */
client_t *transient_for; client_t *transient_for;
/** Value of WM_TRANSIENT_FOR */
xcb_window_t transient_for_window;
/** Titelbar information */ /** Titelbar information */
struct { struct {
/** The size of this bar. */ /** The size of this bar. */
@ -181,7 +183,7 @@ void client_restore_enterleave_events(void);
void client_refresh_partial(client_t *, int16_t, int16_t, uint16_t, uint16_t); void client_refresh_partial(client_t *, int16_t, int16_t, uint16_t, uint16_t);
void client_class_setup(lua_State *); void client_class_setup(lua_State *);
void client_send_configure(client_t *); void client_send_configure(client_t *);
void client_find_transient_for(client_t *, xcb_window_t); void client_find_transient_for(client_t *);
drawable_t *client_get_drawable(client_t *, int, int); drawable_t *client_get_drawable(client_t *, int, int);
drawable_t *client_get_drawable_offset(client_t *, int *, int *); drawable_t *client_get_drawable_offset(client_t *, int *, int *);

View File

@ -111,12 +111,14 @@ property_update_wm_transient_for(client_t *c, xcb_get_property_cookie_t cookie)
&trans, NULL)) &trans, NULL))
return; return;
c->transient_for_window = trans;
luaA_object_push(L, c); luaA_object_push(L, c);
client_set_type(L, -1, WINDOW_TYPE_DIALOG); client_set_type(L, -1, WINDOW_TYPE_DIALOG);
client_set_above(L, -1, false); client_set_above(L, -1, false);
lua_pop(L, 1); lua_pop(L, 1);
client_find_transient_for(c, trans); client_find_transient_for(c);
} }
xcb_get_property_cookie_t xcb_get_property_cookie_t