diff --git a/Xi/exevents.c b/Xi/exevents.c index 22dc214c9..193e57e22 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -1389,6 +1389,12 @@ DeliverTouchEmulatedEvent(DeviceIntPtr dev, TouchPointInfoPtr ti, nevents = TouchConvertToPointerEvent(ev, &motion, &button); BUG_RETURN_VAL(nevents == 0, BadValue); + /* Note that here we deliver only part of the events that are generated by the touch event: + * + * TouchBegin results in ButtonPress (motion is handled in DeliverEmulatedMotionEvent) + * TouchUpdate results in Motion + * TouchEnd results in ButtonRelease (motion is handled in DeliverEmulatedMotionEvent) + */ if (nevents > 1) ptrev = &button; @@ -1593,7 +1599,8 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev) /* if emulate_pointer is set, emulate the motion event right * here, so we can ignore it for button event emulation. TouchUpdate * events which _only_ emulate motion just work normally */ - if (emulate_pointer && ev->any.type != ET_TouchUpdate) + if (emulate_pointer && (ev->any.type == ET_TouchBegin || + (ev->any.type == ET_TouchEnd && ti->num_listeners > 0))) DeliverEmulatedMotionEvent(dev, ti, ev); if (emulate_pointer && IsMaster(dev))