From 4564d3995f926434fe9325f1b167002cc50c1e79 Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Wed, 27 Feb 2013 15:05:54 +1000 Subject: [PATCH 15/35] Xi: when punting to a new owner, always create TouchEnd events If a touch is pending_finish and we just punted it to the next owner, that client must receive a TouchEnd event. If we just punted to the last owner and that owner not a touch grab, we need to end the touch since this is the last event to be sent, and the client cannot accept/reject this. Signed-off-by: Peter Hutterer (cherry picked from commit 214d11d3fcdac51fc7afbf3770516ec14f9e13c1) --- Xi/exevents.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/Xi/exevents.c b/Xi/exevents.c index 0518bf8..7c34c81 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1143,12 +1143,21 @@ TouchPuntToNextOwner(DeviceIntPtr dev, TouchPointInfoPtr ti, TouchEventHistoryReplay(ti, dev, listener->listener); } - /* If we've just removed the last grab and the touch has physically - * ended, send a TouchEnd event too and finalise the touch. */ - if (ti->num_listeners == 1 && ti->num_grabs == 0 && ti->pending_finish) { + /* New owner has Begin/Update but not end. If touch is pending_finish, + * emulate the TouchEnd now */ + if (ti->pending_finish) { EmitTouchEnd(dev, ti, 0, 0); - TouchEndTouch(dev, ti); - return; + + /* If the last owner is not a touch grab, finalise the touch, we + won't get more correspondence on this. + */ + if (ti->num_listeners == 1 && + (ti->num_grabs == 0 || + listener->grab->grabtype != XI2 || + !xi2mask_isset(listener->grab->xi2mask, dev, XI_TouchBegin))) { + TouchEndTouch(dev, ti); + return; + } } if (accepted_early) -- 1.8.2.1