summaryrefslogtreecommitdiff
path: root/dix/events.c
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 /dix/events.c
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>
Diffstat (limited to 'dix/events.c')
-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);
+ }
}
/**