mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-05-08 13:48:03 +02:00
Xi: update the core listener state if we delivered the touch event
If a TouchBegin is sent to a core client, that client is now the owner.
By the time the TouchEnd is being processed, the client cannot replay
anymore, so we can assume that this is the final touch end and we can clean
up the touch record.
Note: DeliverTouchEmulatedEvent is called for all listeners and immediately
bails out if the client is not the owner and thus shouldn't yet get the
event. Thus, check the return code.
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
(cherry picked from commit d08bae297f)
This commit is contained in:
parent
a7ec834d5e
commit
000d469dd4
1 changed files with 9 additions and 7 deletions
|
|
@ -1849,6 +1849,8 @@ DeliverTouchBeginEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|||
listener->type == LISTENER_POINTER_GRAB) {
|
||||
rc = DeliverTouchEmulatedEvent(dev, ti, ev, listener, client, win,
|
||||
grab, xi2mask);
|
||||
if (rc == Success)
|
||||
listener->state = LISTENER_IS_OWNER;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
@ -1889,13 +1891,13 @@ DeliverTouchEndEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, InternalEvent *ev,
|
|||
rc = DeliverTouchEmulatedEvent(dev, ti, ev, listener, client, win,
|
||||
grab, xi2mask);
|
||||
|
||||
if (ti->num_listeners > 1) {
|
||||
ev->any.type = ET_TouchUpdate;
|
||||
ev->device_event.flags |= TOUCH_PENDING_END;
|
||||
if (!(ev->device_event.flags & TOUCH_CLIENT_ID))
|
||||
ti->pending_finish = TRUE;
|
||||
}
|
||||
|
||||
/* Once we send a TouchEnd to a legacy listener, we're already well
|
||||
* past the accepting/rejecting stage (can only happen on
|
||||
* GrabModeSync + replay. This listener now gets the end event,
|
||||
* and we can continue.
|
||||
*/
|
||||
if (rc == Success)
|
||||
listener->state = LISTENER_HAS_END;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue