mirror of
https://gitlab.freedesktop.org/xorg/xserver.git
synced 2026-06-19 14:48:30 +02:00
dix: XAllowEvents() on a touch event means accepting it
A sync grab is the owner once it gets events. If it doesn't replay the event it will get all events from this touch, equivalent to accepting it. If the touch has ended before XAllowEvents() is called, we also now need to send the TouchEnd event and clean-up since we won't see anything more from this touch. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
e7f79c48b0
commit
5174b1f982
3 changed files with 25 additions and 0 deletions
10
dix/events.c
10
dix/events.c
|
|
@ -1742,6 +1742,16 @@ AllowSome(ClientPtr client, TimeStamp time, DeviceIntPtr thisDev, int newState)
|
|||
}
|
||||
break;
|
||||
}
|
||||
|
||||
/* We've unfrozen the grab. If the grab was a touch grab, we're now the
|
||||
* owner and expected to accept/reject it. Reject == ReplayPointer which
|
||||
* we've handled in ComputeFreezes() (during DeactivateGrab) above,
|
||||
* anything else is accept.
|
||||
*/
|
||||
if (newState != NOT_GRABBED /* Replay */ &&
|
||||
IsTouchEvent((InternalEvent*)grabinfo->sync.event)) {
|
||||
TouchAcceptAndEnd(thisDev, grabinfo->sync.event->touchid);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
14
dix/touch.c
14
dix/touch.c
|
|
@ -1102,3 +1102,17 @@ TouchEmitTouchEnd(DeviceIntPtr dev, TouchPointInfoPtr ti, int flags, XID resourc
|
|||
GetDixTouchEnd(&event, dev, ti, flags);
|
||||
DeliverTouchEvents(dev, ti, &event, resource);
|
||||
}
|
||||
|
||||
void
|
||||
TouchAcceptAndEnd(DeviceIntPtr dev, int touchid)
|
||||
{
|
||||
TouchPointInfoPtr ti = TouchFindByClientID(dev, touchid);
|
||||
if (!ti)
|
||||
return;
|
||||
|
||||
TouchListenerAcceptReject(dev, ti, 0, XIAcceptTouch);
|
||||
if (ti->pending_finish)
|
||||
TouchEmitTouchEnd(dev, ti, 0, 0);
|
||||
if (ti->num_listeners <= 1)
|
||||
TouchEndTouch(dev, ti);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -591,6 +591,7 @@ extern void TouchEndPhysicallyActiveTouches(DeviceIntPtr dev);
|
|||
extern void TouchDeliverDeviceClassesChangedEvent(TouchPointInfoPtr ti,
|
||||
Time time, XID resource);
|
||||
extern void TouchEmitTouchEnd(DeviceIntPtr dev, TouchPointInfoPtr ti, int flags, XID resource);
|
||||
extern void TouchAcceptAndEnd(DeviceIntPtr dev, int touchid);
|
||||
|
||||
/* misc event helpers */
|
||||
extern Mask GetEventMask(DeviceIntPtr dev, xEvent *ev, InputClientsPtr clients);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue