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
}
}
-static void restack_windows(ObClient *selected, gboolean raise, gboolean group)
+static void restack_windows(ObClient *selected, gboolean raise)
{
GList *it, *last, *below, *above, *next;
GList *wins = NULL;
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, group);
- 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 */
stacking_list = g_list_delete_link(stacking_list, it);
/* go from the bottom of the stacking list up */
- for (it = g_list_last(stacking_list); it; it = g_list_previous(it)) {
+ for (it = g_list_last(stacking_list); it; it = next) {
+ next = g_list_previous(it);
+
if (WINDOW_IS_CLIENT(it->data)) {
ObClient *ch = it->data;
last = NULL;
for (it = g_list_last(stacking_list); it; it = g_list_previous(it))
{
- if (window_layer(it->data) < selected->layer)
+ if (window_layer(it->data) < selected->layer) {
+ last = it;
continue;
+ }
/* if lowering, stop at the beginning of the layer */
if (!raise)
break;
g_list_free(wins);
}
-void stacking_raise(ObWindow *window, gboolean group)
+void stacking_raise(ObWindow *window)
{
if (WINDOW_IS_CLIENT(window)) {
ObClient *selected;
selected = WINDOW_AS_CLIENT(window);
- restack_windows(selected, TRUE, group);
+ restack_windows(selected, TRUE);
} else {
GList *wins;
wins = g_list_append(NULL, window);
}
}
-void stacking_lower(ObWindow *window, gboolean group)
+void stacking_lower(ObWindow *window)
{
if (WINDOW_IS_CLIENT(window)) {
ObClient *selected;
selected = WINDOW_AS_CLIENT(window);
- restack_windows(selected, FALSE, group);
+ restack_windows(selected, FALSE);
} else {
GList *wins;
wins = g_list_append(NULL, window);
future */
stacking_list = g_list_append(stacking_list, win);
- stacking_raise(win, FALSE);
+ stacking_raise(win);
}
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;
+ }
}
- }
}
}
}
}
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))