X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fstacking.c;h=481c14bdb3731b9bf910afe67cd785ba510802ee;hb=0f677834e253dfd18a246c8811bf4a4e364d5e0e;hp=c4fb06a2b3d81bc4cb67d8b9244803acd7b1c893;hpb=176e6cea6e1a52c951bac73c17fe49e77cf197a1;p=chaz%2Fopenbox diff --git a/openbox/stacking.c b/openbox/stacking.c index c4fb06a2..481c14bd 100644 --- a/openbox/stacking.c +++ b/openbox/stacking.c @@ -426,16 +426,21 @@ void stacking_add_nonintrusive(ObWindow *win) } } if (!it_below) { - 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); - } + /* There is no window to put this directly above, so put it at the + top, so you know it is there. + + It used to do this only if the window was focused and lower + it otherwise. + + We also put it at the top not the bottom to fix a bug with + fullscreen windows. When focusLast is off and followsMouse is + on, when you switch desktops, the fullscreen window loses + focus and goes into its lower layer. If this puts it at the + bottom then when you come back to the desktop, the window is + at the bottom and won't get focus back. + */ + stacking_list = g_list_append(stacking_list, win); + stacking_raise(win); } else { /* make sure it's not in the wrong layer though ! */ for (; it_below; it_below = g_list_next(it_below)) @@ -501,7 +506,7 @@ static gboolean stacking_occluded(ObClient *client, ObClient *sibling) return occluded; } -/*! Returns TRUE if client is occludes the sibling. If sibling is NULL it tries +/*! Returns TRUE if client occludes the sibling. If sibling is NULL it tries against all other clients. */ static gboolean stacking_occludes(ObClient *client, ObClient *sibling) @@ -540,8 +545,8 @@ static gboolean stacking_occludes(ObClient *client, ObClient *sibling) return occludes; } -void stacking_restack_request(ObClient *client, ObClient *sibling, - gint detail, gboolean activate) +gboolean stacking_restack_request(ObClient *client, ObClient *sibling, + gint detail, gboolean activate) { switch (detail) { case Below: @@ -558,11 +563,13 @@ void stacking_restack_request(ObClient *client, ObClient *sibling, lower it to the bottom */ if (stacking_occludes(client, sibling)) stacking_lower(CLIENT_AS_WINDOW(client)); + else + return FALSE; break; case Above: ob_debug("Restack request Above for client %s sibling %s\n", client->title, sibling ? sibling->title : "(all)"); - if (activate) + if (activate && !client->iconic && client_normal(client)) /* use user=TRUE because it is impossible to get a timestamp for this */ client_activate(client, FALSE, TRUE); @@ -573,20 +580,21 @@ void stacking_restack_request(ObClient *client, ObClient *sibling, ob_debug("Restack request TopIf for client %s sibling %s\n", client->title, sibling ? sibling->title : "(all)"); if (stacking_occluded(client, sibling)) { - if (activate) + if (activate && !client->iconic && client_normal(client)) /* use user=TRUE because it is impossible to get a timestamp for this */ client_activate(client, FALSE, TRUE); else stacking_raise(CLIENT_AS_WINDOW(client)); - } + } else + return FALSE; break; case Opposite: ob_debug("Restack request Opposite for client %s sibling " "%s\n", client->title, sibling ? sibling->title : "(all)"); if (stacking_occluded(client, sibling)) { - if (activate) + if (activate && !client->iconic && client_normal(client)) /* use user=TRUE because it is impossible to get a timestamp for this */ client_activate(client, FALSE, TRUE); @@ -597,4 +605,5 @@ void stacking_restack_request(ObClient *client, ObClient *sibling, stacking_lower(CLIENT_AS_WINDOW(client)); break; } + return TRUE; }