]> git.sur5r.net Git - i3/i3/blobdiff - src/render.c
Merge branch 'next'
[i3/i3] / src / render.c
index 9ac4b78ef2c81de4145170fe8b8e7f4d205deb81..16bfc55bb1f17c876b2a9582f181059b8a6cd9c7 100644 (file)
  * container (for debugging purposes) */
 static bool show_debug_borders = false;
 
+/*
+ * Returns the height for the decorations
+ */
+int render_deco_height(void) {
+    int deco_height = config.font.height + 4;
+    if (config.font.height & 0x01)
+        ++deco_height;
+    return deco_height;
+}
+
 /*
  * Renders a container with layout L_OUTPUT. In this layout, all CT_DOCKAREAs
  * get the height of their content and the remaining CT_CON gets the rest.
@@ -203,9 +213,7 @@ void render_con(Con *con, bool render_fullscreen) {
     }
 
     /* find the height for the decorations */
-    int deco_height = config.font.height + 4;
-    if (config.font.height & 0x01)
-        ++deco_height;
+    int deco_height = render_deco_height();
 
     /* precalculate the sizes to be able to correct rounding errors */
     int sizes[children];
@@ -263,18 +271,28 @@ void render_con(Con *con, bool render_fullscreen) {
                 /* 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) {
+                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). */
-                    if (floating_child->window == NULL ||
-                        fullscreen->window == NULL ||
-                        floating_child->window->transient_for != fullscreen->window->id)
+                    while (transient_con != NULL &&
+                           transient_con->window != NULL &&
+                           transient_con->window->transient_for != XCB_NONE) {
+                        if (transient_con->window->transient_for == fullscreen->window->id) {
+                            is_transient_for = true;
+                            break;
+                        }
+                        transient_con = con_by_window_id(transient_con->window->transient_for);
+                    }
+
+                    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->transient_for (0x%08x) --> fullscreen->id (0x%08x)\n",
                              floating_child->window->transient_for, fullscreen->window->id);
                     }
                 }