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:
parent
9907f804b2
commit
d598a4115a
|
@ -212,12 +212,12 @@ DO_CLIENT_SET_STRING_PROPERTY(machine)
|
|||
#undef DO_CLIENT_SET_STRING_PROPERTY
|
||||
|
||||
void
|
||||
client_find_transient_for(client_t *c, xcb_window_t trans)
|
||||
client_find_transient_for(client_t *c)
|
||||
{
|
||||
int counter;
|
||||
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 */
|
||||
for(counter = 0; tmp != NULL && counter <= globalconf.stack.len; counter++)
|
||||
|
@ -660,6 +660,11 @@ HANDLE_GEOM(height)
|
|||
/* update all properties */
|
||||
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 */
|
||||
ewmh_client_check_hints(c);
|
||||
|
||||
|
|
|
@ -121,6 +121,8 @@ struct client_t
|
|||
uint32_t pid;
|
||||
/** Window it is transient for */
|
||||
client_t *transient_for;
|
||||
/** Value of WM_TRANSIENT_FOR */
|
||||
xcb_window_t transient_for_window;
|
||||
/** Titelbar information */
|
||||
struct {
|
||||
/** 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_class_setup(lua_State *);
|
||||
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_offset(client_t *, int *, int *);
|
||||
|
||||
|
|
|
@ -111,12 +111,14 @@ property_update_wm_transient_for(client_t *c, xcb_get_property_cookie_t cookie)
|
|||
&trans, NULL))
|
||||
return;
|
||||
|
||||
c->transient_for_window = trans;
|
||||
|
||||
luaA_object_push(L, c);
|
||||
client_set_type(L, -1, WINDOW_TYPE_DIALOG);
|
||||
client_set_above(L, -1, false);
|
||||
lua_pop(L, 1);
|
||||
|
||||
client_find_transient_for(c, trans);
|
||||
client_find_transient_for(c);
|
||||
}
|
||||
|
||||
xcb_get_property_cookie_t
|
||||
|
|
Loading…
Reference in New Issue