]> git.sur5r.net Git - i3/i3/blobdiff - src/move.c
Movement into a branch considers movement direction
[i3/i3] / src / move.c
index 0b3ab66011d4d9d189badcebcf1ea11ae81e180e..284c4f38726314415884c3369ad90058ac789f3b 100644 (file)
@@ -125,7 +125,11 @@ static void move_to_output_directed(Con *con, direction_t direction) {
  *
  */
 void tree_move(int direction) {
+    position_t position;
+    Con *target;
+
     DLOG("Moving in direction %d\n", direction);
+
     /* 1: get the first parent with the same orientation */
     Con *con = focused;
 
@@ -173,7 +177,13 @@ void tree_move(int direction) {
                           TAILQ_PREV(con, nodes_head, nodes) :
                           TAILQ_NEXT(con, nodes)))) {
                 if (!con_is_leaf(swap)) {
-                    insert_con_into(con, con_descend_focused(swap), AFTER);
+                    DLOG("Moving into our bordering branch\n");
+                    target = con_descend_direction(swap, direction);
+                    position = (con_orientation(target->parent) != o ||
+                            direction == D_UP ||
+                            direction == D_LEFT ?
+                            AFTER : BEFORE);
+                    insert_con_into(con, target, position);
                     goto end;
                 }
                 if (direction == D_LEFT || direction == D_UP)
@@ -214,22 +224,24 @@ void tree_move(int direction) {
     }
 
     DLOG("above = %p\n", above);
-    Con *next;
-    position_t position;
-    if (direction == D_UP || direction == D_LEFT) {
-        position = BEFORE;
-        next = TAILQ_PREV(above, nodes_head, nodes);
-    } else {
-        position = AFTER;
-        next = TAILQ_NEXT(above, nodes);
-    }
 
-    /* special case: there is a split container in the direction we are moving
-     * to, so descend and append */
-    if (next && !con_is_leaf(next))
-        insert_con_into(con, con_descend_focused(next), AFTER);
-    else
+    Con *next = (direction == D_UP || direction == D_LEFT ?
+            TAILQ_PREV(above, nodes_head, nodes) :
+            TAILQ_NEXT(above, nodes));
+
+    if (next && !con_is_leaf(next)) {
+        DLOG("Moving into the bordering branch of our adjacent container\n");
+        target = con_descend_direction(next, direction);
+        position = (con_orientation(target->parent) != o ||
+                direction == D_UP ||
+                direction == D_LEFT ?
+                AFTER : BEFORE);
+        insert_con_into(con, target, position);
+    } else {
+        DLOG("Moving into container above\n");
+        position = (direction == D_UP || direction == D_LEFT ? BEFORE : AFTER);
         insert_con_into(con, above, position);
+    }
 
 end:
     /* We need to call con_focus() to fix the focus stack "above" the container