Movement into a branch considers movement direction
Change the behavior of movement into a branch with respect to the position the moving con will be placed within the branch when the movement is complete. The correct position is determined by the direction of movement or the position of the focused-inactive container within the branch. If the direction of movement is the same as the orientation of the branch container, append or prepend the container to the branch in the obvious way. If the movement is to the right or downward, insert the moving container in the first position (i.e., the leftmost or top position resp.) If the movement is to the left or upward, insert the moving container in the last position (i.e., the rightmost or bottom position resp.) If the direction of movement is different from the orientation of the branch container, insert the container into the branch after the focused-inactive container. fixes #1060
This commit is contained in:
committed by
Michael Stapelberg
parent
de3901bb29
commit
aa11c03d4c
42
src/move.c
42
src/move.c
@ -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
|
||||
|
Reference in New Issue
Block a user