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
|
||||
EmitTouchEnd(DeviceIntPtr dev, TouchPointInfoPtr ti, int flags, XID resource)
|
||||
{
|
||||
InternalEvent *tel = InitEventList(GetMaximumEventsNum());
|
||||
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));
|
||||
InternalEvent event;
|
||||
|
||||
flags |= TOUCH_CLIENT_ID;
|
||||
if (ti->emulate_pointer)
|
||||
flags |= TOUCH_POINTER_EMULATED;
|
||||
nev = GetTouchEvents(tel, dev, ti->client_id, XI_TouchEnd, flags, mask);
|
||||
for (i = 0; i < nev; i++)
|
||||
DeliverTouchEvents(dev, ti, tel + i, resource);
|
||||
|
||||
valuator_mask_free(&mask);
|
||||
FreeEventList(tel, GetMaximumEventsNum());
|
||||
TouchDeliverDeviceClassesChangedEvent(ti, GetTimeInMillis(), resource);
|
||||
GetDixTouchEnd(&event, dev, ti, flags);
|
||||
DeliverTouchEvents(dev, ti, &event, resource);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -2022,6 +2022,37 @@ GetTouchEvents(InternalEvent *events, DeviceIntPtr dev, uint32_t ddx_touchid,
|
|||
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.
|
||||
*
|
||||
|
|
|
@ -465,6 +465,11 @@ extern int GetTouchOwnershipEvents(InternalEvent *events,
|
|||
TouchPointInfoPtr ti,
|
||||
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,
|
||||
DeviceIntPtr pDev,
|
||||
int type, const ValuatorMask *mask);
|
||||
|
|
Loading…
Reference in New Issue
Block a user