aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sway/input/cursor.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/sway/input/cursor.c b/sway/input/cursor.c
index 9259c475..3a73954c 100644
--- a/sway/input/cursor.c
+++ b/sway/input/cursor.c
@@ -146,7 +146,23 @@ void cursor_send_pointer_motion(struct sway_cursor *cursor, uint32_t time_msec)
struct sway_container *c = container_at_coords(cursor->seat,
cursor->cursor->x, cursor->cursor->y, &surface, &sx, &sy);
if (c && config->focus_follows_mouse) {
- seat_set_focus_warp(cursor->seat, c, false);
+ if (c->type == C_WORKSPACE) {
+ // Only follow the mouse if it would move to a new output
+ // Otherwise we'll focus the workspace, which is probably wrong
+ struct sway_container *focus = seat_get_focus(cursor->seat);
+ if (focus->type != C_OUTPUT) {
+ focus = container_parent(focus, C_OUTPUT);
+ }
+ struct sway_container *output = c;
+ if (output->type != C_OUTPUT) {
+ output = container_parent(c, C_OUTPUT);
+ }
+ if (output != focus) {
+ seat_set_focus_warp(cursor->seat, c, false);
+ }
+ } else {
+ seat_set_focus_warp(cursor->seat, c, false);
+ }
}
// reset cursor if switching between clients