]> git.sur5r.net Git - i3/i3/commitdiff
Bugfix: Correctly render decorations in tabbed containers (don’t overlap)
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 1 May 2011 16:48:30 +0000 (18:48 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 1 May 2011 16:48:30 +0000 (18:48 +0200)
This fixes a regression introduced in b644fb5f26c1768b70c5b49d8cd917a63a2d1d91.

include/x.h
src/floating.c
src/x.c

index 827f6f855e8eeb94966e44d2dfabe99498470c0f..d110d92cd67995fedf1da1913c4ab14f1c7cc0c7 100644 (file)
@@ -66,7 +66,7 @@ void x_draw_decoration(Con *con);
  * It recursively traverses all children of the given node.
  *
  */
-void x_push_node(Con *con, bool skip_decoration);
+void x_push_node(Con *con);
 
 /**
  * Pushes all changes (state of each node, see x_push_node() and the window
index 1d08ec9e4102fc2e36680ee55c1d43d1d9f83a27..23f8a60a682a0efb2763957483b08f17c30a0b4b 100644 (file)
@@ -277,7 +277,7 @@ DRAGGING_CB(drag_window_callback) {
     con->rect.y = old_rect->y + (new_y - event->root_y);
 
     render_con(con, false);
-    x_push_node(con, true);
+    x_push_node(con);
     xcb_flush(conn);
 
     /* Check if we cross workspace boundaries while moving */
diff --git a/src/x.c b/src/x.c
index ab60c51d555e835aec7a7664c64ee5bb407d2dc0..2e77b14325ad12d9075426e2faa392ee7d9bf239 100644 (file)
--- a/src/x.c
+++ b/src/x.c
@@ -442,7 +442,7 @@ update_pixmaps:
  * It recursively traverses all children of the given node.
  *
  */
-void x_push_node(Con *con, bool skip_decoration) {
+void x_push_node(Con *con) {
     Con *current;
     con_state *state;
     Rect rect = con->rect;
@@ -584,10 +584,25 @@ void x_push_node(Con *con, bool skip_decoration) {
      * in focus order to display the focused client in a stack first when
      * switching workspaces (reduces flickering). */
     TAILQ_FOREACH(current, &(con->focus_head), focused)
-        x_push_node(current, skip_decoration);
+        x_push_node(current);
+}
+
+/*
+ * Recursively calls x_draw_decoration. This cannot be done in x_push_node
+ * because x_push_node uses focus order to recurse (see the comment above)
+ * while drawing the decoration needs to happen in the actual order.
+ *
+ */
+static void x_deco_recurse(Con *con) {
+    Con *current;
+
+    TAILQ_FOREACH(current, &(con->nodes_head), nodes)
+        x_deco_recurse(current);
+
+    TAILQ_FOREACH(current, &(con->floating_head), floating_windows)
+        x_deco_recurse(current);
 
-    if (!skip_decoration &&
-        (con->type != CT_ROOT && con->type != CT_OUTPUT) &&
+    if ((con->type != CT_ROOT && con->type != CT_OUTPUT) &&
         con->mapped)
         x_draw_decoration(con);
 }
@@ -691,7 +706,8 @@ void x_push_changes(Con *con) {
     DLOG("Done, EnterNotify re-enabled\n");
 
     DLOG("\n\n PUSHING CHANGES\n\n");
-    x_push_node(con, false);
+    x_push_node(con);
+    x_deco_recurse(con);
 
     xcb_window_t to_focus = focused->frame;
     if (focused->window != NULL)