some more checks for transients looping on eachother when they are transients of a group

This commit is contained in:
Dana Jansens 2003-04-24 03:41:30 +00:00
parent 957ffe9c03
commit 019c779f7d

View file

@ -665,11 +665,12 @@ void client_update_transient_for(Client *self)
Window t = None;
Client *c = NULL;
if (XGetTransientForHint(ob_display, self->window, &t) &&
t != self->window) { /* cant be transient to itself! */
if (XGetTransientForHint(ob_display, self->window, &t)) {
self->transient = TRUE;
if (t != self->window) { /* cant be transient to itself! */
c = g_hash_table_lookup(client_map, &t);
g_assert(c != self);/* if this happens then we need to check for it*/
/* if this happens then we need to check for it*/
g_assert(c != self);
if (!c && self->group) {
/* not transient to a client, see if it is transient for a
@ -681,6 +682,7 @@ void client_update_transient_for(Client *self)
c = TRAN_GROUP;
}
}
}
} else
self->transient = FALSE;
@ -691,7 +693,8 @@ void client_update_transient_for(Client *self)
/* remove from old parents */
for (it = self->group->members; it; it = it->next)
if (it->data != self)
if (it->data != self &&
(((Client*)it->data)->transient_for != TRAN_GROUP))
((Client*)it->data)->transients =
g_slist_remove(((Client*)it->data)->transients, self);
} else if (self->transient_for != NULL) { /* transient of window */
@ -705,9 +708,22 @@ void client_update_transient_for(Client *self)
/* add to new parents */
for (it = self->group->members; it; it = it->next)
if (it->data != self)
if (it->data != self &&
(((Client*)it->data)->transient_for != TRAN_GROUP))
((Client*)it->data)->transients =
g_slist_append(((Client*)it->data)->transients, self);
/* remove all transients which are in the group, that causes
circlular pointer hell of doom */
for (it = self->group->members; it; it = it->next) {
GSList *sit, *next;
for (sit = self->transients; sit; sit = next) {
next = sit->next;
if (sit->data == it->data)
self->transients = g_slist_remove(self->transients,
sit->data);
}
}
} else if (self->transient_for != NULL) { /* transient of window */
/* add to new parent */
self->transient_for->transients =