]> git.sur5r.net Git - i3/i3/blobdiff - src/tree.c
Fix the percentages when moving containers.
[i3/i3] / src / tree.c
index bff101df74e0a891f4538a9d5ae216069e80e084..0a18e88d5b49fd1069748b03bf165ac9c3dc80d0 100644 (file)
@@ -411,10 +411,14 @@ void tree_move(char way, orientation_t orientation) {
             /* 4: switch workspace orientation */
             parent->orientation = orientation;
 
-            /* 4: attach the new split container to the workspace */
+            /* 5: attach the new split container to the workspace */
             DLOG("Attaching new split to ws\n");
             con_attach(new, parent, false);
 
+            /* 6: fix the percentages */
+            con_fix_percent(new);
+            con_fix_percent(parent);
+
             if (old_focused)
                 con_focus(old_focused);
 
@@ -452,6 +456,7 @@ void tree_move(char way, orientation_t orientation) {
         }
 
         con_detach(focused);
+        con_fix_percent(focused->parent);
         focused->parent = next->parent;
 
         TAILQ_INSERT_AFTER(&(next->parent->nodes_head), next, focused, nodes);
@@ -478,6 +483,7 @@ void tree_move(char way, orientation_t orientation) {
         }
 
         con_detach(focused);
+        con_fix_percent(focused);
         focused->parent = next->parent;
 
         /* After going down in the tree, we insert the container *after*
@@ -491,6 +497,14 @@ void tree_move(char way, orientation_t orientation) {
         /* TODO: don’t influence focus handling? */
     }
 
+    /* fix the percentages in the container we moved to */
+    int children = con_num_children(next->parent);
+    if (children == 1)
+        focused->percent = 1.0;
+    else
+        focused->percent = 1.0 / (children - 1);
+    con_fix_percent(next->parent);
+
     /* We need to call con_focus() to fix the focus stack "above" the container
      * we just inserted the focused container into (otherwise, the parent
      * container(s) would still point to the old container(s)). */
@@ -500,6 +514,10 @@ void tree_move(char way, orientation_t orientation) {
         DLOG("Old container empty after moving. Let's close it\n");
         tree_close(old_parent, false, false);
     }
+    else {
+        /* fix the percentages in the container we moved from */
+        con_fix_percent(old_parent);
+    }
 
     tree_flatten(croot);
 }