]> git.sur5r.net Git - i3/i3/commitdiff
optimization: when moving floating windows, render/push only the floatingcon
authorMichael Stapelberg <michael@stapelberg.de>
Fri, 1 Apr 2011 20:40:12 +0000 (22:40 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Fri, 1 Apr 2011 20:40:12 +0000 (22:40 +0200)
include/x.h
src/floating.c
src/x.c

index 15d37420adfb7b1cdcde8822ad201f3432d310d7..827f6f855e8eeb94966e44d2dfabe99498470c0f 100644 (file)
@@ -60,6 +60,14 @@ void x_window_kill(xcb_window_t window);
  */
 void x_draw_decoration(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, …).
+ * It recursively traverses all children of the given node.
+ *
+ */
+void x_push_node(Con *con, bool skip_decoration);
+
 /**
  * Pushes all changes (state of each node, see x_push_node() and the window
  * stack) to X11.
index 9d4e1cf8e438ff379bf9e9f2fbbd899dc8821936..6cc9a16817adbac4574f5b7538cf18fc5fc44e93 100644 (file)
@@ -231,10 +231,10 @@ DRAGGING_CB(drag_window_callback) {
     /* Reposition the client correctly while moving */
     con->rect.x = old_rect->x + (new_x - event->root_x);
     con->rect.y = old_rect->y + (new_y - event->root_y);
-    /* TODO: don’t re-render the whole tree just because we change
-     * coordinates of a floating window */
-    tree_render();
-    x_push_changes(croot);
+
+    render_con(con, false);
+    x_push_node(con, true);
+    xcb_flush(conn);
 }
 
 /*
diff --git a/src/x.c b/src/x.c
index ee9e0a43868eb84e5eb30e0beb8657a05c7e52b5..9ea876444d3734f287eb0112f9dbffd2ab68deaa 100644 (file)
--- a/src/x.c
+++ b/src/x.c
@@ -442,7 +442,7 @@ copy_pixmaps:
  * It recursively traverses all children of the given node.
  *
  */
-static void x_push_node(Con *con) {
+void x_push_node(Con *con, bool skip_decoration) {
     Con *current;
     con_state *state;
     Rect rect = con->rect;
@@ -582,9 +582,11 @@ static void x_push_node(Con *con) {
      * 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);
+        x_push_node(current, skip_decoration);
 
-    if (con->type != CT_ROOT && con->type != CT_OUTPUT && con->mapped)
+    if (!skip_decoration &&
+        (con->type != CT_ROOT && con->type != CT_OUTPUT) &&
+        con->mapped)
         x_draw_decoration(con);
 }
 
@@ -687,7 +689,7 @@ void x_push_changes(Con *con) {
     DLOG("Done, EnterNotify re-enabled\n");
 
     DLOG("\n\n PUSHING CHANGES\n\n");
-    x_push_node(con);
+    x_push_node(con, false);
 
     xcb_window_t to_focus = focused->frame;
     if (focused->window != NULL)