- 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);
- } else {
- /* make sure it's not in the wrong layer though ! */
- for (; it_below; it_below = g_list_next(it_below))
- {
- /* stop when the window is not in a higher layer than the window
- it is going above (it_below) */
- if (client->layer >= window_layer(it_below->data))
- break;
+
+ /* make sure it's not in the wrong layer though ! */
+ for (; it_below; it_below = g_list_next(it_below)) {
+ /* stop when the window is not in a higher layer than the window
+ it is going above (it_below) */
+ if (client->layer >= window_layer(it_below->data))
+ break;
+ }
+ for (; it_below != stacking_list; it_below = it_above) {
+ /* stop when the window is not in a lower layer than the
+ window it is going under (it_above) */
+ it_above = it_below ?
+ g_list_previous(it_below) : g_list_last(stacking_list);
+ if (client->layer <= window_layer(it_above->data))
+ break;
+ }
+
+ wins = g_list_append(NULL, win);
+ do_restack(wins, it_below);
+ g_list_free(wins);
+}
+
+/*! Returns TRUE if client is occluded by the sibling. If sibling is NULL it
+ tries against all other clients.
+*/
+static gboolean stacking_occluded(ObClient *client, ObClient *sibling)
+{
+ GList *it;
+ gboolean occluded = FALSE;
+ gboolean found = FALSE;
+
+ /* no need for any looping in this case */
+ if (sibling && client->layer != sibling->layer)
+ return occluded;
+
+ for (it = stacking_list; it;
+ it = (found ? g_list_previous(it) :g_list_next(it)))
+ if (WINDOW_IS_CLIENT(it->data)) {
+ ObClient *c = it->data;
+ if (found && !c->iconic &&
+ (c->desktop == DESKTOP_ALL || client->desktop == DESKTOP_ALL ||
+ c->desktop == client->desktop) &&
+ !client_search_transient(client, c))
+ {
+ if (RECT_INTERSECTS_RECT(c->frame->area, client->frame->area))
+ {
+ if (sibling != NULL) {
+ if (c == sibling) {
+ occluded = TRUE;
+ break;
+ }
+ }
+ else if (c->layer == client->layer) {
+ occluded = TRUE;
+ break;
+ }
+ else if (c->layer > client->layer)
+ break; /* we past its layer */
+ }
+ }
+ else if (c == client)
+ found = TRUE;