- Con *output;
- if (!fullscreen) {
- TAILQ_FOREACH(output, &(con->nodes_head), nodes) {
- render_con(output, false);
- }
- }
-
- /* We need to render floating windows after rendering all outputs’
- * tiling windows because they need to be on top of *every* output at
- * all times. This is important when the user places floating
- * windows/containers so that they overlap on another output. */
- DLOG("Rendering floating windows:\n");
- TAILQ_FOREACH(output, &(con->nodes_head), nodes) {
- if (con_is_internal(output))
- continue;
- /* Get the active workspace of that output */
- Con *content = output_get_content(output);
- if (!content || TAILQ_EMPTY(&(content->focus_head))) {
- DLOG("Skipping this output because it is currently being destroyed.\n");
- continue;
- }
- Con *workspace = TAILQ_FIRST(&(content->focus_head));
- Con *fullscreen = con_get_fullscreen_con(workspace, CF_OUTPUT);
- Con *child;
- TAILQ_FOREACH(child, &(workspace->floating_head), floating_windows) {
- /* Don’t render floating windows when there is a fullscreen window
- * on that workspace. Necessary to make floating fullscreen work
- * correctly (ticket #564). */
- /* If there is no fullscreen->window, this cannot be a
- * transient window, so we _know_ we need to skip it. This
- * happens during restarts where the container already exists,
- * but the window was not yet associated. */
- if (fullscreen != NULL && fullscreen->window == NULL)
- continue;
- if (fullscreen != NULL && fullscreen->window != NULL) {
- Con *floating_child = con_descend_focused(child);
- Con *transient_con = floating_child;
- bool is_transient_for = false;
- /* Exception to the above rule: smart
- * popup_during_fullscreen handling (popups belonging to
- * the fullscreen app will be rendered). */
- while (transient_con != NULL &&
- transient_con->window != NULL &&
- transient_con->window->transient_for != XCB_NONE) {
- DLOG("transient_con = 0x%08x, transient_con->window->transient_for = 0x%08x, fullscreen_id = 0x%08x\n",
- transient_con->window->id, transient_con->window->transient_for, fullscreen->window->id);
- if (transient_con->window->transient_for == fullscreen->window->id) {
- is_transient_for = true;
- break;
- }
- Con *next_transient = con_by_window_id(transient_con->window->transient_for);
- if (next_transient == NULL)
- break;
- /* Some clients (e.g. x11-ssh-askpass) actually set
- * WM_TRANSIENT_FOR to their own window id, so break instead of
- * looping endlessly. */
- if (transient_con == next_transient)
- break;
- transient_con = next_transient;
- }
-
- if (!is_transient_for)
- continue;
- else {
- DLOG("Rendering floating child even though in fullscreen mode: "
- "floating->transient_for (0x%08x) --> fullscreen->id (0x%08x)\n",
- floating_child->window->transient_for, fullscreen->window->id);
- }
- }
- DLOG("floating child at (%d,%d) with %d x %d\n",
- child->rect.x, child->rect.y, child->rect.width, child->rect.height);
- x_raise_con(child);
- render_con(child, false);
- }
- }
-