+
+ switch (detail) {
+ case Below:
+ ob_debug("Restack request Below for client %s sibling %s\n",
+ client->title, sibling ? sibling->title : "(all)");
+ /* just lower it */
+ stacking_lower(CLIENT_AS_WINDOW(client));
+ ret = TRUE;
+ break;
+ case BottomIf:
+ ob_debug("Restack request BottomIf for client %s sibling "
+ "%s\n",
+ client->title, sibling ? sibling->title : "(all)");
+ /* if this client occludes sibling (or anything if NULL), then
+ lower it to the bottom */
+ if (stacking_occludes(client, sibling)) {
+ stacking_lower(CLIENT_AS_WINDOW(client));
+ ret = TRUE;
+ }
+ break;
+ case Above:
+ ob_debug("Restack request Above for client %s sibling %s\n",
+ client->title, sibling ? sibling->title : "(all)");
+ 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));
+ ret = TRUE;
+ break;
+ case TopIf:
+ ob_debug("Restack request TopIf for client %s sibling %s\n",
+ client->title, sibling ? sibling->title : "(all)");
+ if (stacking_occluded(client, sibling)) {
+ 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));
+ ret = TRUE;
+ }
+ 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 && !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));
+ ret = TRUE;
+ }
+ else if (stacking_occludes(client, sibling)) {
+ stacking_lower(CLIENT_AS_WINDOW(client));
+ ret = TRUE;
+ }
+ break;
+ }
+ return ret;