]> Dogcows Code - chaz/openbox/commitdiff
some more checks for transients looping on eachother when they are transients of...
authorDana Jansens <danakj@orodu.net>
Thu, 24 Apr 2003 03:41:30 +0000 (03:41 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 24 Apr 2003 03:41:30 +0000 (03:41 +0000)
openbox/client.c

index 996c6b88a4a579c399ef43db1a9b4d7db5ecf4da..2fcbd003b481f72e48628557247a33ea67051e34 100644 (file)
@@ -665,22 +665,24 @@ 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;
-       c = g_hash_table_lookup(client_map, &t);
-       g_assert(c != self);/* if this happens then we need to check for it*/
-
-       if (!c && self->group) {
-           /* not transient to a client, see if it is transient for a
-              group */
-           if (t == self->group->leader ||
-               t == None ||
-               t == ob_root) {
-               /* window is a transient for its group! */
-                c = TRAN_GROUP;
-           }
-       }
+        if (t != self->window) { /* cant be transient to itself! */
+            c = g_hash_table_lookup(client_map, &t);
+            /* 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
+                   group */
+                if (t == self->group->leader ||
+                    t == None ||
+                    t == ob_root) {
+                    /* window is a transient for its group! */
+                    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 =
This page took 0.027581 seconds and 4 git commands to generate.