Fix wl_pointer.frame not sent on touch emulation

When emulating touch, the simulating_pointer_from_touch field is
set to true. It's switched back to false when a touch_up event is
received. However we need to ensure we always send a wl_pointer.frame
event following a group of other wl_pointer events.

Since a touch_frame event is always guaranteed to come after a group
of touch events, unset simulating_pointer_from_touch in the touch_frame
handler instead of the touch_up handler. Add a new field to know whether
the touch_frame handler should stop emulation.
This commit is contained in:
Simon Ser 2021-07-10 14:02:20 +02:00
parent e7f4e50da0
commit 2e03a61262
2 changed files with 7 additions and 1 deletions

View file

@ -507,7 +507,7 @@ static void handle_touch_up(struct wl_listener *listener, void *data) {
if (cursor->simulating_pointer_from_touch) {
if (cursor->pointer_touch_id == cursor->seat->touch_id) {
cursor->simulating_pointer_from_touch = false;
cursor->pointer_touch_up = true;
dispatch_cursor_button(cursor, event->device, event->time_msec,
BTN_LEFT, WLR_BUTTON_RELEASED);
}
@ -565,6 +565,11 @@ static void handle_touch_frame(struct wl_listener *listener, void *data) {
if (cursor->simulating_pointer_from_touch) {
wlr_seat_pointer_notify_frame(wlr_seat);
if (cursor->pointer_touch_up) {
cursor->pointer_touch_up = false;
cursor->simulating_pointer_from_touch = false;
}
} else {
wlr_seat_touch_notify_frame(wlr_seat);
}