Xi: if a TouchEnd appears on a actively grabbing client, always accept
Once the TouchEnd appears on the device, the touch is done. If the client still has a pointer grab, accept it to avoid clients with TouchOwnership selections to wait indefinitely for the actual touch event. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
parent
ece8157a59
commit
00def51445
|
@ -1566,6 +1566,19 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
|
||||||
else
|
else
|
||||||
ti = TouchFindByClientID(dev, touchid);
|
ti = TouchFindByClientID(dev, touchid);
|
||||||
|
|
||||||
|
/* Active pointer grab */
|
||||||
|
if (emulate_pointer && dev->deviceGrab.grab && !dev->deviceGrab.fromPassiveGrab &&
|
||||||
|
(dev->deviceGrab.grab->grabtype == CORE ||
|
||||||
|
dev->deviceGrab.grab->grabtype == XI ||
|
||||||
|
!xi2mask_isset(dev->deviceGrab.grab->xi2mask, dev, XI_TouchBegin)))
|
||||||
|
{
|
||||||
|
/* Active pointer grab on touch point and we get a TouchEnd - claim this
|
||||||
|
* touchpoint accepted, otherwise clients waiting for ownership will
|
||||||
|
* wait on this touchpoint until this client ungrabs, or the cows come
|
||||||
|
* home, whichever is earlier */
|
||||||
|
if (ti && type == ET_TouchEnd)
|
||||||
|
TouchListenerAcceptReject(dev, ti, 0, XIAcceptTouch);
|
||||||
|
else if (!ti && type != ET_TouchBegin) {
|
||||||
/* Under the following circumstances we create a new touch record for an
|
/* Under the following circumstances we create a new touch record for an
|
||||||
* existing touch:
|
* existing touch:
|
||||||
*
|
*
|
||||||
|
@ -1576,11 +1589,6 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
|
||||||
* This allows for an explicit grab to receive pointer events for an already
|
* This allows for an explicit grab to receive pointer events for an already
|
||||||
* active touch.
|
* active touch.
|
||||||
*/
|
*/
|
||||||
if (!ti && type != ET_TouchBegin && emulate_pointer &&
|
|
||||||
dev->deviceGrab.grab && !dev->deviceGrab.fromPassiveGrab &&
|
|
||||||
(dev->deviceGrab.grab->grabtype == CORE ||
|
|
||||||
dev->deviceGrab.grab->grabtype == XI ||
|
|
||||||
!xi2mask_isset(dev->deviceGrab.grab->xi2mask, dev, XI_TouchBegin))) {
|
|
||||||
ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid,
|
ti = TouchBeginTouch(dev, ev->device_event.sourceid, touchid,
|
||||||
emulate_pointer);
|
emulate_pointer);
|
||||||
if (!ti) {
|
if (!ti) {
|
||||||
|
@ -1593,6 +1601,7 @@ ProcessTouchEvent(InternalEvent *ev, DeviceIntPtr dev)
|
||||||
TouchBuildSprite(dev, ti, ev);
|
TouchBuildSprite(dev, ti, ev);
|
||||||
TouchSetupListeners(dev, ti, ev);
|
TouchSetupListeners(dev, ti, ev);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!ti) {
|
if (!ti) {
|
||||||
DebugF("[Xi] %s: Failed to get event %d for touchpoint %d\n",
|
DebugF("[Xi] %s: Failed to get event %d for touchpoint %d\n",
|
||||||
|
|
Loading…
Reference in New Issue