[PATCH] Xi: Do not handle ET_TouchOwnership in ProcessTouchEvent
Peter Hutterer
peter.hutterer at who-t.net
Wed Apr 10 18:09:35 PDT 2013
On Tue, Apr 09, 2013 at 11:19:07AM +0200, Maarten Lankhorst wrote:
> The event struct is different, causing memory corruption on 1.13 and 1.14,
>
> as can be witnessed in https://bugs.freedesktop.org/show_bug.cgi?id=56578
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at canonical.com>
thanks, merged.
Cheers,
Peter
>
> ---
> Applies cleanly to 1.14, but will conflict with Peter Hutterer's proposed patches.
> It's trivial to fix, because the changes modify the !ET_TouchOwnership branch.
>
> diff --git a/Xi/exevents.c b/Xi/exevents.c
> index 6779139..576f0fe 100644
> --- a/Xi/exevents.c
> +++ b/Xi/exevents.c
> @@ -1223,9 +1223,16 @@ TouchRejected(DeviceIntPtr sourcedev, TouchPointInfoPtr ti, XID resource,
> * touchpoint if it is pending finish.
> */
> static void
> -ProcessTouchOwnershipEvent(DeviceIntPtr dev, TouchPointInfoPtr ti,
> - TouchOwnershipEvent *ev)
> +ProcessTouchOwnershipEvent(TouchOwnershipEvent *ev,
> + DeviceIntPtr dev)
> {
> + TouchPointInfoPtr ti = TouchFindByClientID(dev, ev->touchid);
> +
> + if (!ti) {
> + DebugF("[Xi] %s: Failed to get event %d for touchpoint %d\n",
> + dev->name, ev->type, ev->touchid);
> + return;
> + }
>
> if (ev->reason == XIRejectTouch)
> TouchRejected(dev, ti, ev->resource, ev);
> @@ -1538,10 +1545,7 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
> if (!t)
> return;
>
> - if (ev->any.type == ET_TouchOwnership)
> - touchid = ev->touch_ownership_event.touchid;
> - else
> - touchid = ev->device_event.touchid;
> + touchid = ev->device_event.touchid;
>
> if (type == ET_TouchBegin) {
> ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid,
> @@ -1614,19 +1618,13 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
> (type != ET_TouchEnd && ti->sprite.spriteTraceGood == 0))
> return;
>
> - /* TouchOwnership events are handled separately from the rest, as they
> - * have more complex semantics. */
> - if (ev->any.type == ET_TouchOwnership)
> - ProcessTouchOwnershipEvent(dev, ti, &ev->touch_ownership_event);
> - else {
> - TouchCopyValuatorData(&ev->device_event, ti);
> - /* WARNING: the event type may change to TouchUpdate in
> - * DeliverTouchEvents if a TouchEnd was delivered to a grabbing
> - * owner */
> - DeliverTouchEvents(dev, ti, (InternalEvent *) ev, 0);
> - if (ev->any.type == ET_TouchEnd)
> - TouchEndTouch(dev, ti);
> - }
> + TouchCopyValuatorData(&ev->device_event, ti);
> + /* WARNING: the event type may change to TouchUpdate in
> + * DeliverTouchEvents if a TouchEnd was delivered to a grabbing
> + * owner */
> + DeliverTouchEvents(dev, ti, (InternalEvent *) ev, 0);
> + if (ev->any.type == ET_TouchEnd)
> + TouchEndTouch(dev, ti);
>
> if (emulate_pointer)
> UpdateDeviceState(dev, &ev->device_event);
> @@ -1820,10 +1818,14 @@ ProcessOtherEvent(InternalEvent *ev, DeviceIntPtr device)
> break;
> case ET_TouchBegin:
> case ET_TouchUpdate:
> - case ET_TouchOwnership:
> case ET_TouchEnd:
> ProcessTouchEvent(ev, device);
> break;
> + case ET_TouchOwnership:
> + /* TouchOwnership events are handled separately from the rest, as they
> + * have more complex semantics. */
> + ProcessTouchOwnershipEvent(&ev->touch_ownership_event, device);
> + break;
> case ET_BarrierHit:
> case ET_BarrierLeave:
> ProcessBarrierEvent(ev, device);
>
More information about the xorg-devel
mailing list