+ /* 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;
+ }
+
+ GList *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;
+ }
+ return occluded;
+}
+
+/*! 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)
+{
+ GList *it;
+ gboolean occludes = FALSE;
+ gboolean found = FALSE;
+
+ /* no need for any looping in this case */
+ if (sibling && client->layer != sibling->layer)
+ return occludes;
+
+ for (it = stacking_list; it; 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(c, client))
+ {
+ if (RECT_INTERSECTS_RECT(c->frame->area, client->frame->area))
+ {
+ if (sibling != NULL) {
+ if (c == sibling) {
+ occludes = TRUE;
+ break;
+ }
+ }
+ else if (c->layer == client->layer) {
+ occludes = TRUE;
+ break;
+ }
+ else if (c->layer < client->layer)
+ break; /* we past its layer */
+ }
+ }
+ else if (c == client)
+ found = TRUE;
+ }
+ return occludes;