Don't use GetTouchEvents in EmitTouchEnd
As before GetTouchEvents causes unwanted side effects. Add a new function GetDixTouchEnd, which generates a touch event from the touch point. We fill in the event's screen coordinates from the MD's current sprite position. Signed-off-by: Thomas Jaeger <ThJaeger@gmail.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net> Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
cc79107a5b
commit
fe59774c55
|
@ -1066,24 +1066,14 @@ ActivateEarlyAccept(DeviceIntPtr dev, TouchPointInfoPtr ti)
|
||||||
static void
|
static void
|
||||||
EmitTouchEnd(DeviceIntPtr dev, TouchPointInfoPtr ti, int flags, XID resource)
|
EmitTouchEnd(DeviceIntPtr dev, TouchPointInfoPtr ti, int flags, XID resource)
|
||||||
{
|
{
|
||||||
InternalEvent *tel = InitEventList(GetMaximumEventsNum());
|
InternalEvent event;
|
||||||
ValuatorMask *mask = valuator_mask_new(2);
|
|
||||||
int i, nev;
|
|
||||||
|
|
||||||
valuator_mask_set_double(mask, 0,
|
|
||||||
valuator_mask_get_double(ti->valuators, 0));
|
|
||||||
valuator_mask_set_double(mask, 1,
|
|
||||||
valuator_mask_get_double(ti->valuators, 1));
|
|
||||||
|
|
||||||
flags |= TOUCH_CLIENT_ID;
|
flags |= TOUCH_CLIENT_ID;
|
||||||
if (ti->emulate_pointer)
|
if (ti->emulate_pointer)
|
||||||
flags |= TOUCH_POINTER_EMULATED;
|
flags |= TOUCH_POINTER_EMULATED;
|
||||||
nev = GetTouchEvents(tel, dev, ti->client_id, XI_TouchEnd, flags, mask);
|
TouchDeliverDeviceClassesChangedEvent(ti, GetTimeInMillis(), resource);
|
||||||
for (i = 0; i < nev; i++)
|
GetDixTouchEnd(&event, dev, ti, flags);
|
||||||
DeliverTouchEvents(dev, ti, tel + i, resource);
|
DeliverTouchEvents(dev, ti, &event, resource);
|
||||||
|
|
||||||
valuator_mask_free(&mask);
|
|
||||||
FreeEventList(tel, GetMaximumEventsNum());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2022,6 +2022,37 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
|
||||||
return num_events;
|
return num_events;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
GetDixTouchEnd(InternalEvent *ievent, DeviceIntPtr dev, TouchPointInfoPtr ti,
|
||||||
|
uint32_t flags)
|
||||||
|
{
|
||||||
|
ScreenPtr scr = dev->spriteInfo->sprite->hotPhys.pScreen;
|
||||||
|
DeviceEvent *event = &ievent->device_event;
|
||||||
|
CARD32 ms = GetTimeInMillis();
|
||||||
|
|
||||||
|
BUG_WARN(!dev->enabled);
|
||||||
|
|
||||||
|
init_device_event(event, dev, ms);
|
||||||
|
|
||||||
|
event->sourceid = ti->sourceid;
|
||||||
|
event->type = ET_TouchEnd;
|
||||||
|
|
||||||
|
event->root = scr->root->drawable.id;
|
||||||
|
|
||||||
|
/* Get screen event coordinates from the sprite. Is this really the best
|
||||||
|
* we can do? */
|
||||||
|
event_set_root_coordinates(event,
|
||||||
|
dev->last.valuators[0],
|
||||||
|
dev->last.valuators[1]);
|
||||||
|
event->touchid = ti->client_id;
|
||||||
|
event->flags = flags;
|
||||||
|
|
||||||
|
if (flags & TOUCH_POINTER_EMULATED) {
|
||||||
|
event->flags |= TOUCH_POINTER_EMULATED;
|
||||||
|
event->detail.button = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synthesize a single motion event for the core pointer.
|
* Synthesize a single motion event for the core pointer.
|
||||||
*
|
*
|
||||||
|
|
|
@ -465,6 +465,11 @@ extern int GetTouchOwnershipEvents(InternalEvent *events,
|
||||||
TouchPointInfoPtr ti,
|
TouchPointInfoPtr ti,
|
||||||
uint8_t mode, XID resource, uint32_t flags);
|
uint8_t mode, XID resource, uint32_t flags);
|
||||||
|
|
||||||
|
extern void GetDixTouchEnd(InternalEvent *ievent,
|
||||||
|
DeviceIntPtr dev,
|
||||||
|
TouchPointInfoPtr ti,
|
||||||
|
uint32_t flags);
|
||||||
|
|
||||||
extern _X_EXPORT int GetProximityEvents(InternalEvent *events,
|
extern _X_EXPORT int GetProximityEvents(InternalEvent *events,
|
||||||
DeviceIntPtr pDev,
|
DeviceIntPtr pDev,
|
||||||
int type, const ValuatorMask *mask);
|
int type, const ValuatorMask *mask);
|
||||||
|
|
Loading…
Reference in New Issue