diff options
author | D.B <thejan.2009@gmail.com> | 2016-10-07 07:10:06 +0200 |
---|---|---|
committer | D.B <thejan.2009@gmail.com> | 2016-10-07 08:12:14 +0200 |
commit | 7f558ce894934bd347140f5edd6419bf7d115c26 (patch) | |
tree | 8a52490b767be9b5ecb808ff5fa3c4486c5c30f5 /sway/layout.c | |
parent | fa119661e9efeeb82d2efc1d962fbaddb9f49a3c (diff) |
wrap container in direction (if possible)
Introduces container wrapping - if there is no other viable move, the
selection wraps on the first container where such action is possible.
Diffstat (limited to 'sway/layout.c')
-rw-r--r-- | sway/layout.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/sway/layout.c b/sway/layout.c index 6012af66..f10e21bd 100644 --- a/sway/layout.c +++ b/sway/layout.c @@ -1084,13 +1084,17 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio return container->fullscreen; } + swayc_t *wrap_candidate = NULL; while (true) { // Test if we can even make a difference here bool can_move = false; int diff = 0; if (parent->type == C_ROOT) { - sway_log(L_DEBUG, "Moving between outputs"); swayc_t *output = swayc_adjacent_output(container, dir, &abs_pos, true); + if (!output || output == container) { + return wrap_candidate; + } + sway_log(L_DEBUG, "Moving between outputs"); return get_swayc_in_output_direction(output, dir); } else { if (dir == MOVE_LEFT || dir == MOVE_RIGHT) { @@ -1108,8 +1112,18 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio if (can_move) { int desired = index_child(container) + diff; - if (container->is_floating || desired < 0 || desired >= parent->children->length) { + if (container->is_floating) { can_move = false; + } else if (desired < 0 || desired >= parent->children->length) { + can_move = false; + int len = parent->children->length; + if (!wrap_candidate && len > 1) { + if (desired < 0) { + wrap_candidate = parent->children->items[len-1]; + } else { + wrap_candidate = parent->children->items[0]; + } + } } else { return parent->children->items[desired]; } @@ -1118,8 +1132,8 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio container = parent; parent = parent->parent; if (!parent || container == limit) { - // Nothing we can do - return NULL; + // wrapping is the last chance + return wrap_candidate; } } } |