summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChase Douglas <chase.douglas@canonical.com>2012-04-11 08:17:25 -0700
committerChase Douglas <chase.douglas@ubuntu.com>2012-04-18 13:58:39 -0700
commit6ca30cb33e829b4edd01822367e44ffe6f0951b0 (patch)
tree7bbd004183bbe9b32261a0cddf1c487865b7b315
parentcacdb9a74065ccba7d50a82e14abdf04b36c5309 (diff)
When deactivating an explicit pointer grab, reject all grabs on touches
Explicit pointer grabs are placed at the head of the touch listener array for pointer emulated touches. If the grab is deactivated, we must remove it from all touches for the device. Signed-off-by: Chase Douglas <chase.douglas@canonical.com> Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
-rw-r--r--dix/events.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/dix/events.c b/dix/events.c
index a137d6f7a..52ce0b875 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -1473,6 +1473,8 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
DeviceIntPtr dev;
Bool wasImplicit = (mouse->deviceGrab.fromPassiveGrab &&
mouse->deviceGrab.implicitGrab);
+ XID grab_resource = grab->resource;
+ int i;
TouchRemovePointerGrab(mouse);
@@ -1497,6 +1499,15 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
ReattachToOldMaster(mouse);
ComputeFreezes();
+
+ /* If an explicit grab was deactivated, we must remove it from the head of
+ * all the touches' listener lists. */
+ for (i = 0; mouse->touch && i < mouse->touch->num_touches; i++) {
+ TouchPointInfoPtr ti = mouse->touch->touches + i;
+
+ if (ti->active && TouchResourceIsOwner(ti, grab_resource))
+ TouchListenerAcceptReject(mouse, ti, 0, XIRejectTouch);
+ }
}
/**