*/
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, …).
*
*/
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 */
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;
* 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));