diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2013-02-28 11:02:40 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2013-05-10 14:32:36 +1000 |
commit | 5174b1f98204beee79eba74c4cda5f2be0a60a8f (patch) | |
tree | fe039ed3436b3ca9ce6bd00a38e998f4addfc238 /dix | |
parent | e7f79c48b0faea910dc881034c00eb807fcd6210 (diff) |
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>
Diffstat (limited to 'dix')
-rw-r--r-- | dix/events.c | 10 | ||||
-rw-r--r-- | dix/touch.c | 14 |
2 files changed, 24 insertions, 0 deletions
diff --git a/dix/events.c b/dix/events.c index 051205233..da9bd3821 100644 --- a/dix/events.c +++ b/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); + } } /** diff --git a/dix/touch.c b/dix/touch.c index f7112fca9..0cbc2eb01 100644 --- a/dix/touch.c +++ b/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); +} |