]> git.sur5r.net Git - i3/i3/commitdiff
resize/unmap container x11 windows on demand (makes background images visible again)
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 14 Nov 2010 17:52:40 +0000 (18:52 +0100)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 14 Nov 2010 17:52:40 +0000 (18:52 +0100)
src/x.c

diff --git a/src/x.c b/src/x.c
index fe7ce8e0d85158ae2584962b21e369293e889df5..41707bf7cea3d362f8153d45471033b23c692bd0 100644 (file)
--- a/src/x.c
+++ b/src/x.c
@@ -372,6 +372,7 @@ void x_draw_decoration(Con *con) {
 static void x_push_node(Con *con) {
     Con *current;
     con_state *state;
+    Rect rect = con->rect;
 
     LOG("Pushing changes for node %p / %s\n", con, con->name);
     state = state_for_frame(con->frame);
@@ -384,6 +385,28 @@ static void x_push_node(Con *con) {
         FREE(state->name);
     }
 
+    if (con->window == NULL) {
+        /* Calculate the height of all window decorations which will be drawn on to
+         * this frame. */
+        uint32_t max_y = 0, max_height = 0;
+        TAILQ_FOREACH(current, &(con->nodes_head), nodes) {
+            DLOG("Child's decoration is %d x %d, from (%d, %d)\n",
+                    current->deco_rect.width, current->deco_rect.height,
+                    current->deco_rect.x, current->deco_rect.y);
+            Rect *dr = &(current->deco_rect);
+            if (dr->y >= max_y && dr->height >= max_height) {
+                max_y = dr->y;
+                max_height = dr->height;
+            }
+        }
+        DLOG("bottom of decorations is %d\n", max_y + max_height);
+        rect.height = max_y + max_height;
+        if (rect.height == 0) {
+            DLOG("Unmapping container because it does not contain anything atm.\n");
+            con->mapped = false;
+        }
+    }
+
     /* reparent the child window (when the window was moved due to a sticky
      * container) */
     if (state->need_reparent && con->window != NULL) {
@@ -452,10 +475,10 @@ static void x_push_node(Con *con) {
 
     bool fake_notify = false;
     /* set new position if rect changed */
-    if (memcmp(&(state->rect), &(con->rect), sizeof(Rect)) != 0) {
-        LOG("setting rect (%d, %d, %d, %d)\n", con->rect.x, con->rect.y, con->rect.width, con->rect.height);
-        xcb_set_window_rect(conn, con->frame, con->rect);
-        memcpy(&(state->rect), &(con->rect), sizeof(Rect));
+    if (memcmp(&(state->rect), &rect, sizeof(Rect)) != 0) {
+        LOG("setting rect (%d, %d, %d, %d)\n", rect.x, rect.y, rect.width, rect.height);
+        xcb_set_window_rect(conn, con->frame, rect);
+        memcpy(&(state->rect), &rect, sizeof(Rect));
         fake_notify = true;
     }