]> git.sur5r.net Git - i3/i3/commitdiff
expose event handler: use x_deco_recurse
authorMichael Stapelberg <michael@stapelberg.de>
Sun, 10 Jul 2011 20:06:16 +0000 (22:06 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Sun, 10 Jul 2011 20:06:16 +0000 (22:06 +0200)
include/x.h
src/handlers.c
src/x.c

index b8ead5eec7210a5155012c19188905fb55234046..df4ee276723de7dae194efbee9134505d34c3756 100644 (file)
@@ -60,6 +60,14 @@ void x_window_kill(xcb_window_t window, kill_window_t kill_window);
  */
 void x_draw_decoration(Con *con);
 
+/**
+ * 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.
+ *
+ */
+void x_deco_recurse(Con *con);
+
 /**
  * This function pushes the properties of each node of the layout tree to
  * X11 if they have changed (like the map state, position of the window, …).
index 583b0c5a46443ab45c0be6be14c94a7f64eb0ebc..8e9bbb0448cddb7c598dd7232b8599f02adef02d 100644 (file)
@@ -586,7 +586,7 @@ static int handle_windowclass_change(void *data, xcb_connection_t *conn, uint8_t
  *
  */
 static int handle_expose_event(xcb_expose_event_t *event) {
-    Con *parent, *con;
+    Con *parent;
 
     /* event->count is the number of minimum remaining expose events for this
      * window, so we skip all events but the last one */
@@ -600,22 +600,8 @@ static int handle_expose_event(xcb_expose_event_t *event) {
         return 1;
     }
 
-    if (parent->window)
-        x_draw_decoration(parent);
-
-    TAILQ_FOREACH(con, &(parent->nodes_head), nodes) {
-        DLOG("expose for con %p / %s\n", con, con->name);
-        if (con->window)
-            x_draw_decoration(con);
-    }
-
-    /* We also need to render the decorations of other Cons nearby the Con
-     * itself to not get overlapping decorations */
-    TAILQ_FOREACH(con, &(parent->parent->nodes_head), nodes) {
-        DLOG("expose for con %p / %s\n", con, con->name);
-        if (con->window)
-            x_draw_decoration(con);
-    }
+    /* re-render the parent (recursively, if it’s a split con) */
+    x_deco_recurse(parent);
     xcb_flush(conn);
 
     return 1;
diff --git a/src/x.c b/src/x.c
index 85e9f41ab0ff48d2a935d9faa7b5b508c66acf44..96c9d806e3a184ef8831ade657158e23d86c7479 100644 (file)
--- a/src/x.c
+++ b/src/x.c
@@ -460,7 +460,7 @@ copy_pixmaps:
  * while drawing the decoration needs to happen in the actual order.
  *
  */
-static void x_deco_recurse(Con *con) {
+void x_deco_recurse(Con *con) {
     Con *current;
     bool leaf = TAILQ_EMPTY(&(con->nodes_head)) &&
                 TAILQ_EMPTY(&(con->floating_head));