End physically active touches when device is disabled
Otherwise: * We can't end the touches while device is disabled * New touches after enabling the device may erroneously be mapped to old logical touches Signed-off-by: Chase Douglas <chase.douglas@canonical.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
a69429a17b
commit
3b67cd2614
|
@ -443,6 +443,7 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
|
|||
if (*prev != dev)
|
||||
return FALSE;
|
||||
|
||||
TouchEndPhysicallyActiveTouches(dev);
|
||||
ReleaseButtonsAndKeys(dev);
|
||||
SyncRemoveDeviceIdleTime(dev->idle_counter);
|
||||
dev->idle_counter = NULL;
|
||||
|
|
28
dix/touch.c
28
dix/touch.c
|
@ -1029,3 +1029,31 @@ TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
|
|||
|
||||
return TouchListenerAcceptReject(dev, ti, i, mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* End physically active touches for a device.
|
||||
*/
|
||||
void
|
||||
TouchEndPhysicallyActiveTouches(DeviceIntPtr dev)
|
||||
{
|
||||
InternalEvent *eventlist = InitEventList(GetMaximumEventsNum());
|
||||
int i;
|
||||
|
||||
OsBlockSignals();
|
||||
mieqProcessInputEvents();
|
||||
for (i = 0; i < dev->last.num_touches; i++) {
|
||||
DDXTouchPointInfoPtr ddxti = dev->last.touches + i;
|
||||
|
||||
if (ddxti->active) {
|
||||
int j;
|
||||
int nevents = GetTouchEvents(eventlist, dev, ddxti->ddx_id,
|
||||
XI_TouchEnd, 0, NULL);
|
||||
|
||||
for (j = 0; j < nevents; j++)
|
||||
mieqProcessDeviceEvent(dev, eventlist + j, NULL);
|
||||
}
|
||||
}
|
||||
OsReleaseSignals();
|
||||
|
||||
FreeEventList(eventlist, GetMaximumEventsNum());
|
||||
}
|
||||
|
|
|
@ -579,6 +579,7 @@ extern int TouchListenerAcceptReject(DeviceIntPtr dev, TouchPointInfoPtr ti,
|
|||
int listener, int mode);
|
||||
extern int TouchAcceptReject(ClientPtr client, DeviceIntPtr dev, int mode,
|
||||
uint32_t touchid, Window grab_window, XID *error);
|
||||
extern void TouchEndPhysicallyActiveTouches(DeviceIntPtr dev);
|
||||
|
||||
/* misc event helpers */
|
||||
extern Mask GetEventMask(DeviceIntPtr dev, xEvent *ev, InputClientsPtr clients);
|
||||
|
|
Loading…
Reference in New Issue
Block a user