fix stacking_add_nonintrusive for when only 2 windows, and one is moving below the focused window (fullscreen losing focus)

This commit is contained in:
Dana Jansens 2007-06-04 17:43:07 +00:00
parent ee36c0d379
commit 83d6c3a8c7

View file

@ -405,7 +405,8 @@ static GList *find_highest_relative(ObClient *client)
void stacking_add_nonintrusive(ObWindow *win) void stacking_add_nonintrusive(ObWindow *win)
{ {
ObClient *client; ObClient *client;
GList *it_below = NULL; GList *it_below = NULL; /* this client will be below us */
GList *it_above;
if (!WINDOW_IS_CLIENT(win)) { if (!WINDOW_IS_CLIENT(win)) {
stacking_add(win); /* no special rules for others */ stacking_add(win); /* no special rules for others */
@ -417,15 +418,19 @@ void stacking_add_nonintrusive(ObWindow *win)
/* insert above its highest parent (or its highest child !) */ /* insert above its highest parent (or its highest child !) */
it_below = find_highest_relative(client); it_below = find_highest_relative(client);
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) {
if ((it_below = g_list_find(stacking_list, focus_client)))
it_below = it_below->next;
}
}
if (!it_below) { if (!it_below) {
/* nothing to put it directly above, so try find the focused client
to put it underneath it */
if (focus_client && client != focus_client &&
focus_client->layer == client->layer)
{
it_below = g_list_find(stacking_list, focus_client);
/* this can give NULL, but it means the focused window is on the
bottom of the stacking order, so go to the bottom in that case,
below it */
it_below = g_list_next(it_below);
}
else {
/* There is no window to put this directly above, so put it at the /* There is no window to put this directly above, so put it at the
top, so you know it is there. top, so you know it is there.
@ -439,23 +444,22 @@ void stacking_add_nonintrusive(ObWindow *win)
bottom then when you come back to the desktop, the window is bottom then when you come back to the desktop, the window is
at the bottom and won't get focus back. at the bottom and won't get focus back.
*/ */
stacking_list = g_list_append(stacking_list, win); it_below = stacking_list;
stacking_raise(win); }
} else { }
/* make sure it's not in the wrong layer though ! */ /* make sure it's not in the wrong layer though ! */
for (; it_below; it_below = g_list_next(it_below)) for (; it_below; it_below = g_list_next(it_below)) {
{
/* stop when the window is not in a higher layer than the window /* stop when the window is not in a higher layer than the window
it is going above (it_below) */ it is going above (it_below) */
if (client->layer >= window_layer(it_below->data)) if (client->layer >= window_layer(it_below->data))
break; break;
} }
for (; it_below != stacking_list; for (; it_below != stacking_list; it_below = it_above) {
it_below = g_list_previous(it_below))
{
/* stop when the window is not in a lower layer than the /* stop when the window is not in a lower layer than the
window it is going under (it_above) */ window it is going under (it_above) */
GList *it_above = g_list_previous(it_below); it_above = it_below ?
g_list_previous(it_below) : g_list_last(stacking_list);
if (client->layer <= window_layer(it_above->data)) if (client->layer <= window_layer(it_above->data))
break; break;
} }
@ -464,7 +468,6 @@ void stacking_add_nonintrusive(ObWindow *win)
do_restack(wins, it_below); do_restack(wins, it_below);
g_list_free(wins); g_list_free(wins);
} }
}
/*! Returns TRUE if client is occluded by the sibling. If sibling is NULL it /*! Returns TRUE if client is occluded by the sibling. If sibling is NULL it
tries against all other clients. tries against all other clients.