diff options
| author | Dana Jansens <danakj@orodu.net> | 2007-05-10 00:57:35 +0000 |
|---|---|---|
| committer | Dana Jansens <danakj@orodu.net> | 2007-05-10 00:57:35 +0000 |
| commit | 98304406432cda3a94c2a57f0812714a229ec77a (patch) | |
| tree | 96fdf5a1b20e79a3c1598e0cc670688aa514707e /openbox/stacking.c | |
| parent | 6412fba7fd1a30465cb01b0e3ebcdf47680e9f02 (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.c | 49 |
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; +} |
