From 8c292f415ebc6b1cd47ad621114beb971add1f6b Mon Sep 17 00:00:00 2001 From: Tudor Brindus Date: Wed, 20 May 2020 23:45:43 -0400 Subject: [PATCH] input/pointer: send pointer enter event on confine warp The spec has this to say about sending events on confine creation: Whenever the confinement is activated, it is guaranteed that the surface the pointer is confined to will already have received pointer focus and that the pointer will be within the region passed to the request creating this object. ...and on region update: If warped, a wl_pointer.motion event will be emitted, but no wp_relative_pointer.relative_motion event. Prior to this patch, sway did neither, and updated the hardware cursor position without notifying the underlying surface until the next motion event. This led to inconsistent results, especially in applications that draw their own software cursor. --- sway/input/cursor.c | 2 ++ sway/input/seatop_default.c | 1 + 2 files changed, 3 insertions(+) diff --git a/sway/input/cursor.c b/sway/input/cursor.c index 646c61b31..a4542c212 100644 --- a/sway/input/cursor.c +++ b/sway/input/cursor.c @@ -791,6 +791,8 @@ static void check_constraint_region(struct sway_cursor *cursor) { wlr_cursor_warp_closest(cursor->cursor, NULL, sx + con->content_x - view->geometry.x, sy + con->content_y - view->geometry.y); + + cursor_rebase(cursor); } } } diff --git a/sway/input/seatop_default.c b/sway/input/seatop_default.c index 64a171576..209ab25b1 100644 --- a/sway/input/seatop_default.c +++ b/sway/input/seatop_default.c @@ -637,6 +637,7 @@ static void handle_rebase(struct sway_seat *seat, uint32_t time_msec) { if (surface) { if (seat_is_input_allowed(seat, surface)) { wlr_seat_pointer_notify_enter(seat->wlr_seat, surface, sx, sy); + wlr_seat_pointer_notify_motion(seat->wlr_seat, time_msec, sx, sy); } } else { cursor_update_image(cursor, e->previous_node);