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.
This commit is contained in:
Tudor Brindus 2020-05-20 23:45:43 -04:00 committed by Simon Ser
parent 704d675a36
commit 6ea45395c7
2 changed files with 3 additions and 0 deletions

View file

@ -807,6 +807,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);
}
}
}

View file

@ -656,6 +656,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);