gboolean stacking_restack_request(struct wm_client *client, struct wm_client *sibling, gint detail) { gboolean ret = FALSE; if(sibling && (client->desktop != sibling->desktop && client->desktop != DESKTOP_ALL && sibling->desktop != DESKTOP_ALL)) { wm_debug("Setting restack sibling to NULL, they are not on the same desktop"); sibling = NULL; } switch (detail) { case Below: wm_debug("Restack request Below for client %s sibling %s", client->title, sibling ? sibling->title : "(all)"); stacking_lower(CLIENT_AS_WINDOW(client)); ret = TRUE; break; case BottomIf: wm_debug("Restack request BottomIf for client %s sibling %s", client->title, sibling ? sibling->title : "(all)"); if(stacking_occludes(client, sibling)) { stacking_lower(CLIENT_AS_WINDOW(client)); ret = TRUE; } break; case Above: wm_debug("Restack request Above for client %s sibling %s", client->title, sibling ? sibling->title : "(all)"); stacking_raise(CLIENT_AS_WINDOW(client)); ret = TRUE; break; case TopIf: wm_debug("Restack request TopIf for client %s sibling %s", client->title, sibling ? sibling->title : "(all)"); if(stacking_occluded(client, sibling)) { stacking_raise(CLIENT_AS_WINDOW(client)); ret = TRUE; } break; case Opposite: wm_debug("Restack request Opposite for client %s sibling %s", client->title, sibling ? sibling->title : "(all)"); if(stacking_occluded(client, sibling)) { 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; }
/* Always return FALSE because its not interactive */ static gboolean run_func(ObActionsData *data, gpointer options) { if (data->client) { actions_client_move(data, TRUE); stacking_lower(CLIENT_AS_WINDOW(data->client)); actions_client_move(data, FALSE); } return FALSE; }