diff options
| author | Dana Jansens <danakj@orodu.net> | 2003-04-07 08:43:33 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2003-04-07 08:43:33 +0000 |
| commit | e6cc69ca04f6b275f56e1e0feef731518e0709a3 (patch) | |
| tree | f2ad6c2ec06b1f28410fb2e6e19397b70f7de562 /openbox/stacking.c | |
| parent | 3cbf5bfa7c42c8dace6ca3f31fe48078eeb66382 (diff) | |
support for transients of groups
Diffstat (limited to 'openbox/stacking.c')
| -rw-r--r-- | openbox/stacking.c | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/openbox/stacking.c b/openbox/stacking.c index 72b7c03b..b8194a78 100644 --- a/openbox/stacking.c +++ b/openbox/stacking.c @@ -2,6 +2,7 @@ #include "prop.h" #include "focus.h" #include "client.h" +#include "group.h" #include "frame.h" #include <glib.h> @@ -85,12 +86,25 @@ void stacking_lower(Client *client) g_assert(stacking_list != NULL); /* this would be bad */ - it = g_list_last(stacking_list); - if (client->modal && client->transient_for) { - /* don't let a modal window lower below its transient_for */ - it = g_list_find(stacking_list, client->transient_for); - g_assert(it != NULL); + if (client->transient_for == TRAN_GROUP) { + /* don't let a modal of the group lower below any other windows + in the group */ + for (it = stacking_list; it; it = it->next) { + GSList *sit; + Client *c = it->data; + + for (sit = c->group->members; sit; sit = sit->next) + if (sit->data == it->data) break; + if (sit) break; /* got it */ + } + if (it == NULL) + goto lower_no_parent; + } else { + /* don't let a modal window lower below its transient_for */ + it = g_list_find(stacking_list, client->transient_for); + } + g_assert(it != NULL); wins[0] = (it == stacking_list ? focus_backup : ((Client*)it->prev->data)->frame->window); @@ -100,6 +114,10 @@ void stacking_lower(Client *client) stacking_list = g_list_remove(stacking_list, client); stacking_list = g_list_insert_before(stacking_list, it, client); } else { + lower_no_parent: + + it = g_list_last(stacking_list); + while (it != stacking_list) { Client *c = it->data; if (client->layer <= c->layer) |
