*
*/
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;
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)
}
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