+ } else if (con->type == CT_ROOT) {
+ Con *output;
+ 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);
+ 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 (fullscreen != NULL) {
+ Con *floating_child = con_descend_focused(child);
+ /* Exception to the above rule: smart
+ * popup_during_fullscreen handling (popups belonging to
+ * the fullscreen app will be rendered). */
+ if (floating_child->window == NULL ||
+ fullscreen->window == NULL ||
+ floating_child->window->transient_for != fullscreen->window->id)
+ 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);
+ }
+ }
+