view: fix view_get_adjacent_output() bug

...when using more than two outputs.

Use the centre of the view's output as the reference coordinate when
seeking adjacent outputs.

Fixes: #1582
This commit is contained in:
Johan Malm 2024-03-02 15:34:52 +00:00 committed by Johan Malm
parent 1ea7e8b494
commit 7e338fc365

View file

@ -1530,6 +1530,10 @@ view_get_adjacent_output(struct view *view, enum view_edge edge)
return NULL; return NULL;
} }
struct wlr_box box = output_usable_area_in_layout_coords(view->output);
int lx = box.x + box.width / 2;
int ly = box.y + box.height / 2;
/* Determine any adjacent output in the appropriate direction */ /* Determine any adjacent output in the appropriate direction */
struct wlr_output *new_output = NULL; struct wlr_output *new_output = NULL;
struct wlr_output *current_output = output->wlr_output; struct wlr_output *current_output = output->wlr_output;
@ -1537,19 +1541,19 @@ view_get_adjacent_output(struct view *view, enum view_edge edge)
switch (edge) { switch (edge) {
case VIEW_EDGE_LEFT: case VIEW_EDGE_LEFT:
new_output = wlr_output_layout_adjacent_output( new_output = wlr_output_layout_adjacent_output(
layout, WLR_DIRECTION_LEFT, current_output, 1, 0); layout, WLR_DIRECTION_LEFT, current_output, lx, ly);
break; break;
case VIEW_EDGE_RIGHT: case VIEW_EDGE_RIGHT:
new_output = wlr_output_layout_adjacent_output( new_output = wlr_output_layout_adjacent_output(
layout, WLR_DIRECTION_RIGHT, current_output, 1, 0); layout, WLR_DIRECTION_RIGHT, current_output, lx, ly);
break; break;
case VIEW_EDGE_UP: case VIEW_EDGE_UP:
new_output = wlr_output_layout_adjacent_output( new_output = wlr_output_layout_adjacent_output(
layout, WLR_DIRECTION_UP, current_output, 0, 1); layout, WLR_DIRECTION_UP, current_output, lx, ly);
break; break;
case VIEW_EDGE_DOWN: case VIEW_EDGE_DOWN:
new_output = wlr_output_layout_adjacent_output( new_output = wlr_output_layout_adjacent_output(
layout, WLR_DIRECTION_DOWN, current_output, 0, 1); layout, WLR_DIRECTION_DOWN, current_output, lx, ly);
break; break;
default: default:
break; break;