aboutsummaryrefslogtreecommitdiffstats
path: root/sway/layout.c
diff options
context:
space:
mode:
authorLibravatar S. Christoffer Eliesen <christoffer@eliesen.no>2015-11-16 00:35:25 +0100
committerLibravatar S. Christoffer Eliesen <christoffer@eliesen.no>2015-11-16 21:32:18 +0100
commit236f26f62e56cef8278d88f6111720b738d4a85f (patch)
treebdac5630c32099785a6eade4dfa8ceb04a3c11dd /sway/layout.c
parentMerge pull request #232 from sce/replace_output_config (diff)
downloadsway-236f26f62e56cef8278d88f6111720b738d4a85f.tar.gz
sway-236f26f62e56cef8278d88f6111720b738d4a85f.tar.zst
sway-236f26f62e56cef8278d88f6111720b738d4a85f.zip
output: Support multiple adjacent outputs.
When querying for an adjacent output we now need an absolute position in order to know which adjacent output that matches. (The position is either the current mouse position or the center of the currently focused container, depending on context.) If two outputs have one edge each that at least partially align with each other they now count as adjacent. Seamless mouse is affected by this and now properly moves and positions itself between outputs with "uneven" placement (as long as they have at least some part of the edge adjacent to each other). When focusing or moving a container in a specified direction the center of the current focused container decides where to look for an adjacent output. So if e.g. an output has two adjacent outputs to the right and a "focus right" command is issued then it's the placement of the currently focused container that decides which output actually gets focused. Also, if an output has at least one output adjacent in some direction but the entire edge is not covered (ie. it has "holes" with no outputs), then the algorithm will choose the output that is closest to the currently focused container (this does not apply to seamless mouse, the pointer will just stop at the edge in that case).
Diffstat (limited to 'sway/layout.c')
-rw-r--r--sway/layout.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/sway/layout.c b/sway/layout.c
index fe7d820a..741addf1 100644
--- a/sway/layout.c
+++ b/sway/layout.c
@@ -533,13 +533,17 @@ swayc_t *get_swayc_in_direction_under(swayc_t *container, enum movement_directio
533 return parent; 533 return parent;
534 } 534 }
535 } 535 }
536 // If moving to an adjacent output we need a starting position (since this
537 // output might border to multiple outputs).
538 struct wlc_point abs_pos;
539 get_absolute_center_position(container, &abs_pos);
536 while (true) { 540 while (true) {
537 // Test if we can even make a difference here 541 // Test if we can even make a difference here
538 bool can_move = false; 542 bool can_move = false;
539 int diff = 0; 543 int diff = 0;
540 if (parent->type == C_ROOT) { 544 if (parent->type == C_ROOT) {
541 sway_log(L_DEBUG, "Moving between outputs"); 545 sway_log(L_DEBUG, "Moving between outputs");
542 return swayc_adjacent_output(container, dir); 546 return swayc_adjacent_output(container, dir, &abs_pos, true);
543 } else { 547 } else {
544 if (dir == MOVE_LEFT || dir == MOVE_RIGHT) { 548 if (dir == MOVE_LEFT || dir == MOVE_RIGHT) {
545 if (parent->layout == L_HORIZ) { 549 if (parent->layout == L_HORIZ) {