On Wed, Apr 18, 2012 at 06:24:52PM -0700, Chase Douglas wrote: > The generated event does not have axes other than X and Y and has a > newer timestamp. In particular, the newer timestamp may be newer than > the real touch end event, which may be stuck in the syncEvents queue. If > a client uses the timestamps for grabbing bad things may happen. > > Signed-off-by: Chase Douglas <[email protected]>
Weeped-at-by: Peter Hutterer <[email protected]> > --- > dix/touch.c | 18 +++++++++++++++--- > 1 files changed, 15 insertions(+), 3 deletions(-) > > diff --git a/dix/touch.c b/dix/touch.c > index a71189a..b12c779 100644 > --- a/dix/touch.c > +++ b/dix/touch.c > @@ -474,10 +474,22 @@ TouchEventHistoryReplay(TouchPointInfoPtr ti, > DeviceIntPtr dev, XID resource) > flags = TOUCH_CLIENT_ID | TOUCH_REPLAYING; > if (ti->emulate_pointer) > flags |= TOUCH_POINTER_EMULATED; > - /* send fake begin event to next owner */ > + /* Generate events based on a fake touch begin event to get DCCE events > if > + * needed */ > + /* FIXME: This needs to be cleaned up */ > nev = GetTouchEvents(tel, dev, ti->client_id, XI_TouchBegin, flags, > mask); > - for (i = 0; i < nev; i++) > - DeliverTouchEvents(dev, ti, tel + i, resource); > + for (i = 0; i < nev; i++) { > + /* Send saved touch begin event */ > + if (tel[i].any.type == ET_TouchBegin) { > + DeviceEvent *ev = &ti->history[0]; > + ev->flags |= TOUCH_REPLAYING; > + DeliverTouchEvents(dev, ti, (InternalEvent*)ev, resource); > + } > + else {/* Send DCCE event */ > + tel[i].any.time = ti->history[0].time; > + DeliverTouchEvents(dev, ti, tel + i, resource); > + } > + } > > valuator_mask_free(&mask); > FreeEventList(tel, GetMaximumEventsNum()); > -- > 1.7.9.1 > _______________________________________________ [email protected]: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel
