From 98304406432cda3a94c2a57f0812714a229ec77a Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 10 May 2007 00:57:35 +0000 Subject: 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. ! --- openbox/stacking.c | 49 ++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) (limited to 'openbox/stacking.c') 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; +} -- cgit v1.2.3