summaryrefslogtreecommitdiff
path: root/openbox/stacking.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-05-10 00:57:35 +0000
committerDana Jansens <danakj@orodu.net>2007-05-10 00:57:35 +0000
commit98304406432cda3a94c2a57f0812714a229ec77a (patch)
tree96fdf5a1b20e79a3c1598e0cc670688aa514707e /openbox/stacking.c
parent6412fba7fd1a30465cb01b0e3ebcdf47680e9f02 (diff)
make restacking much better, yay
no more cludge using actions to raise windows. when a window changes layer it uses add_nonintrusive now so it won't cover the focused window. this way fullscreen windows when they drop down, don't cover up the new focus target. fix add_nonintrusive so that if the window is focused it gets added to the top add back support for ConfigureRequest restacking, this time properly though, using all the detail and sibling modes. but when windows use this to raise they are using some old business and we're going to assume they actually want to activate instead. this means firefox works nicely. yay. ubuntu's firefox has been made to just stop raising entirely though. !
Diffstat (limited to 'openbox/stacking.c')
-rw-r--r--openbox/stacking.c49
1 files changed, 44 insertions, 5 deletions
diff --git a/openbox/stacking.c b/openbox/stacking.c
index 18747b9c..afad8ad0 100644
--- a/openbox/stacking.c
+++ b/openbox/stacking.c
@@ -416,7 +416,7 @@ void stacking_add_nonintrusive(ObWindow *win)
/* insert above its highest parent (or its highest child !) */
it_below = find_highest_relative(client);
- if (!it_below) {
+ if (!it_below && client != focus_client) {
/* nothing to put it directly above, so try find the focused client to
put it underneath it */
if (focus_client && focus_client->layer == client->layer) {
@@ -425,10 +425,16 @@ void stacking_add_nonintrusive(ObWindow *win)
}
}
if (!it_below) {
- /* 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);
+ if (client == focus_client) {
+ /* it's focused so put it at the top */
+ stacking_list = g_list_append(stacking_list, win);
+ stacking_raise(win);
+ } else {
+ /* 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))
@@ -453,3 +459,36 @@ void stacking_add_nonintrusive(ObWindow *win)
g_list_free(wins);
}
}
+
+gboolean stacking_occluded(ObClient *client, ObClient *sibling)
+{
+ GList *it;
+ gboolean obscured = FALSE;
+ gboolean found = FALSE;
+
+ /* no need for any looping in this case */
+ if (sibling && client->layer != sibling->layer)
+ return obscured;
+
+ for (it = stacking_list; it; it = g_list_next(it))
+ if (WINDOW_IS_CLIENT(it->data)) {
+ ObClient *c = it->data;
+ if (found) {
+ if (sibling != NULL) {
+ if (c == sibling) {
+ obscured = TRUE;
+ break;
+ }
+ }
+ else if (c->layer == client->layer) {
+ obscured = TRUE;
+ break;
+ }
+ else if (c->layer > client->layer)
+ break; /* we past its layer */
+ }
+ else if (c == client)
+ found = TRUE;
+ }
+ return obscured;
+}