]> Dogcows Code - chaz/openbox/blobdiff - openbox/stacking.c
1) translate all of openbox's output
[chaz/openbox] / openbox / stacking.c
index cb8eaf31a996fd72c29dce49d01dd275be80d908..32d5a0fcf589812f1b6d7adf58a928b805058ea5 100644 (file)
@@ -2,7 +2,7 @@
 
    stacking.c for the Openbox window manager
    Copyright (c) 2006        Mikael Magnusson
-   Copyright (c) 2003        Ben Jansens
+   Copyright (c) 2003-2007   Dana Jansens
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -176,19 +176,22 @@ static void restack_windows(ObClient *selected, gboolean raise)
            this window, or it won't move */
         top = client_search_all_top_parents(selected);
 
-        /* go thru stacking list backwards so we can use g_slist_prepend */
-        for (it = g_list_last(stacking_list); it && top;
-             it = g_list_previous(it))
-            if ((top_it = g_slist_find(top, it->data))) {
-                top_reorder = g_slist_prepend(top_reorder, top_it->data);
-                top = g_slist_delete_link(top, top_it);
-            }
-        g_assert(top == NULL);
+        /* that is, if it has any parents */
+        if (!(top->data == selected && top->next == NULL)) {
+            /* go thru stacking list backwards so we can use g_slist_prepend */
+            for (it = g_list_last(stacking_list); it && top;
+                 it = g_list_previous(it))
+                if ((top_it = g_slist_find(top, it->data))) {
+                    top_reorder = g_slist_prepend(top_reorder, top_it->data);
+                    top = g_slist_delete_link(top, top_it);
+                }
+            g_assert(top == NULL);
 
-        /* call restack for each of these to lower them */
-        for (top_it = top_reorder; top_it; top_it = g_slist_next(top_it))
-            restack_windows(top_it->data, raise);
-        return;
+            /* call restack for each of these to lower them */
+            for (top_it = top_reorder; top_it; top_it = g_slist_next(top_it))
+                restack_windows(top_it->data, raise);
+            return;
+        }
     }
 
     /* remove first so we can't run into ourself */
@@ -387,15 +390,16 @@ void stacking_add_nonintrusive(ObWindow *win)
             if (client->group)
                 for (it = stacking_list; !parent && it; it = g_list_next(it)) {
                     if ((sit = g_slist_find(client->group->members, it->data)))
-                for (sit = client->group->members; !parent && sit;
-                     sit = g_slist_next(sit))
-                {
-                    ObClient *c = sit->data;
-                    /* checking transient_for prevents infinate loops! */
-                    if (sit->data == it->data && !c->transient_for)
-                        parent = it->data;
+                        for (sit = client->group->members; !parent && sit;
+                             sit = g_slist_next(sit))
+                        {
+                            ObClient *c = sit->data;
+                            /* checking transient_for prevents infinate loops!
+                             */
+                            if (sit->data == it->data && !c->transient_for)
+                                parent = it->data;
+                        }
                 }
-            }
         }
     }
 
@@ -408,8 +412,10 @@ void stacking_add_nonintrusive(ObWindow *win)
         }
     }
     if (!it_below) {
-        /* out of ideas, just add it normally... */
-        stacking_add(win);
+        /* there is no window to put this directly above, so put it at the
+           bottom */
+        stacking_list = g_list_prepend(stacking_list, win);
+        stacking_lower(win);
     } else {
         /* make sure it's not in the wrong layer though ! */
         for (; it_below; it_below = g_list_next(it_below))
This page took 0.023856 seconds and 4 git commands to generate.