From 3b1e2035cc4740711360c845cfcdff07f7b60558 Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Thu, 15 Dec 2011 07:52:28 +1000 Subject: [PATCH] dix: Remove touch grabs if the grab disappears Signed-off-by: Peter Hutterer Reviewed-by: Chase Douglas --- dix/grabs.c | 3 +++ dix/touch.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ include/input.h | 1 + 3 files changed, 48 insertions(+) diff --git a/dix/grabs.c b/dix/grabs.c index da014dfc3..701470c83 100644 --- a/dix/grabs.c +++ b/dix/grabs.c @@ -266,6 +266,9 @@ CreateGrab( void FreeGrab(GrabPtr pGrab) { + if (pGrab->grabtype == XI2 && pGrab->type == XI_TouchBegin) + TouchListenerGone(pGrab->resource); + free(pGrab->modifiersDetail.pMask); free(pGrab->detail.pMask); diff --git a/dix/touch.c b/dix/touch.c index 9bd07c37c..db0bf334a 100644 --- a/dix/touch.c +++ b/dix/touch.c @@ -37,6 +37,7 @@ #include "inpututils.h" #include "eventconvert.h" #include "windowstr.h" +#include "mi.h" #define TOUCH_HISTORY_SIZE 100 @@ -936,3 +937,46 @@ TouchRemovePointerGrab(DeviceIntPtr dev) if (!ti) return; } + +/* As touch grabs don't turn into active grabs with their own resources, we + * need to walk all the touches and remove this grab from any delivery + * lists. */ +void +TouchListenerGone(XID resource) +{ + TouchPointInfoPtr ti; + DeviceIntPtr dev; + InternalEvent *events = InitEventList(GetMaximumEventsNum()); + int i, j, k, nev; + + if (!events) + FatalError("TouchListenerGone: couldn't allocate events\n"); + + for (dev = inputInfo.devices; dev; dev = dev->next) + { + if (!dev->touch) + continue; + + for (i = 0; i < dev->touch->num_touches; i++) + { + ti = &dev->touch->touches[i]; + if (!ti->active) + continue; + + for (j = 0; j < ti->num_listeners; j++) + { + if (ti->listeners[j].listener != resource) + continue; + + nev = GetTouchOwnershipEvents(events, dev, ti, XIRejectTouch, + resource, 0); + for (k = 0; k < nev; k++) + mieqProcessDeviceEvent(dev, events + k, NULL); + + break; + } + } + } + + FreeEventList(events, GetMaximumEventsNum()); +} diff --git a/include/input.h b/include/input.h index 4ed9dce14..fb456175a 100644 --- a/include/input.h +++ b/include/input.h @@ -623,6 +623,7 @@ extern int TouchConvertToPointerEvent(const InternalEvent *ev, InternalEvent *motion, InternalEvent *button); extern int TouchGetPointerEventType(const InternalEvent *ev); extern void TouchRemovePointerGrab(DeviceIntPtr dev); +extern void TouchListenerGone(XID resource); /* misc event helpers */ extern Mask GetEventMask(DeviceIntPtr dev, xEvent* ev, InputClientsPtr clients);