Make focus_follows_mouse work when hovering a layer-shell surface on another output

Fixes #5668
This commit is contained in:
David96 2020-09-13 19:11:08 +02:00 committed by Tudor Brindus
parent 4537c8b3d4
commit c150177a94

View file

@ -7,7 +7,9 @@
#include "sway/input/cursor.h" #include "sway/input/cursor.h"
#include "sway/input/seat.h" #include "sway/input/seat.h"
#include "sway/input/tablet.h" #include "sway/input/tablet.h"
#include "sway/output.h"
#include "sway/tree/view.h" #include "sway/tree/view.h"
#include "sway/tree/workspace.h"
#include "log.h" #include "log.h"
#if HAVE_XWAYLAND #if HAVE_XWAYLAND
#include "sway/xwayland.h" #include "sway/xwayland.h"
@ -513,6 +515,22 @@ static void check_focus_follows_mouse(struct sway_seat *seat,
struct seatop_default_event *e, struct sway_node *hovered_node) { struct seatop_default_event *e, struct sway_node *hovered_node) {
struct sway_node *focus = seat_get_focus(seat); struct sway_node *focus = seat_get_focus(seat);
// This is the case if a layer-shell surface is hovered.
// If it's on another output, focus the active workspace there.
if (!hovered_node) {
struct wlr_output *wlr_output = wlr_output_layout_output_at(
root->output_layout, seat->cursor->cursor->x, seat->cursor->cursor->y);
if (wlr_output == NULL) {
return;
}
struct sway_output *hovered_output = wlr_output->data;
if (focus && hovered_output != node_get_output(focus)) {
struct sway_workspace *ws = output_get_active_workspace(hovered_output);
seat_set_focus(seat, &ws->node);
}
return;
}
// If a workspace node is hovered (eg. in the gap area), only set focus if // If a workspace node is hovered (eg. in the gap area), only set focus if
// the workspace is on a different output to the previous focus. // the workspace is on a different output to the previous focus.
if (focus && hovered_node->type == N_WORKSPACE) { if (focus && hovered_node->type == N_WORKSPACE) {
@ -549,7 +567,7 @@ static void handle_pointer_motion(struct sway_seat *seat, uint32_t time_msec,
struct sway_node *node = node_at_coords(seat, struct sway_node *node = node_at_coords(seat,
cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy); cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy);
if (node && config->focus_follows_mouse != FOLLOWS_NO) { if (config->focus_follows_mouse != FOLLOWS_NO) {
check_focus_follows_mouse(seat, e, node); check_focus_follows_mouse(seat, e, node);
} }
@ -583,7 +601,7 @@ static void handle_tablet_tool_motion(struct sway_seat *seat,
struct sway_node *node = node_at_coords(seat, struct sway_node *node = node_at_coords(seat,
cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy); cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy);
if (node && config->focus_follows_mouse != FOLLOWS_NO) { if (config->focus_follows_mouse != FOLLOWS_NO) {
check_focus_follows_mouse(seat, e, node); check_focus_follows_mouse(seat, e, node);
} }