summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChase Douglas <chase.douglas@canonical.com>2011-11-22 17:13:52 -0800
committerChase Douglas <chase.douglas@canonical.com>2011-11-28 17:33:43 -0800
commitf874eca8f3224db924d7bb5169aa28ad47c3b5a7 (patch)
tree0a81d029a74581b45f790aed6805f460b92875b9
parent072898f26acd059b76f63035342055b32035ea70 (diff)
Update DeliverGrabbedEvent for touch pointer emulation
Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
-rw-r--r--dix/events.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/dix/events.c b/dix/events.c
index c974e1648..cc1b5868e 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -4491,6 +4491,11 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
grabinfo = &thisDev->deviceGrab;
grab = grabinfo->grab;
+ /* Touch events for touch grabs are delivered in DeliverPEGrabbedTouchEvent.
+ */
+ if (grab->grabtype == GRABTYPE_XI2 && grab->type == XI_TouchBegin)
+ return 0;
+
if (event->any.type == ET_ButtonPress ||
event->any.type == ET_ButtonRelease)
{
@@ -4560,6 +4565,48 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
GetEventFilter(thisDev, core),
grab);
}
+ } else if (IsTouchEvent(event)) {
+ rc = TouchToMotion(thisDev, event, CORE, &core, &count);
+ if (count > 0)
+ {
+ FixUpEventFromWindow(pSprite, core, grab->window, None,
+ TRUE);
+ if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
+ grab->window, core, count) ||
+ XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
+ grab->window, core, count))
+ deliveries = 1; /* don't send, but pretend we did */
+ else if (!IsInterferingGrab(rClient(grab), thisDev, core))
+ {
+ deliveries =
+ TryClientEvents(rClient(grab), thisDev, core, count,
+ mask, GetEventFilter(thisDev, core),
+ grab);
+ }
+ } else if (rc != Success && rc != BadMatch)
+ ErrorF("[dix] DeliverGrabbedEvent. Core pointer emulation "
+ "conversion failed.\n");
+
+ rc = TouchToButton(thisDev, event, CORE, &core, &count);
+ if (count > 0)
+ {
+ FixUpEventFromWindow(pSprite, core, grab->window, None,
+ TRUE);
+ if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
+ grab->window, core, count) ||
+ XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
+ grab->window, core, count))
+ deliveries = 1; /* don't send, but pretend we did */
+ else if (!IsInterferingGrab(rClient(grab), thisDev, core))
+ {
+ deliveries =
+ TryClientEvents(rClient(grab), thisDev, core, count,
+ mask, GetEventFilter(thisDev, core),
+ grab);
+ }
+ } else if (rc != Success && rc != BadMatch)
+ ErrorF("[dix] DeliverGrabbedEvent. Core pointer emulation "
+ "conversion failed.\n");
} else if (rc != BadMatch)
ErrorF("[dix] DeliverGrabbedEvent. Core conversion failed.\n");
}
@@ -4575,6 +4622,40 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
FixUpEventFromWindow(pSprite, xi2, grab->window, None, TRUE);
/* XXX: XACE */
deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask, 1, grab);
+
+ if (!deliveries && IsTouchEvent(event)) {
+ rc = TouchToMotion(thisDev, event, XI2, &xi2, &count);
+ if (count > 0)
+ {
+ evtype = xi2_get_type(xi2);
+ mask = xi2mask_isset(grab->xi2mask, thisDev, evtype);
+ /* try pointer emulated XI2 motion event */
+ FixUpEventFromWindow(pSprite, xi2, grab->window, None,
+ TRUE);
+ /* XXX: XACE */
+ deliveries = TryClientEvents(rClient(grab), thisDev,
+ xi2, 1, mask, 1, grab);
+ } else if (rc != Success && rc != BadMatch)
+ ErrorF("[dix] %s: XI2 pointer emulation conversion "
+ "failed in DGE (%d, %d). Skipping delivery.\n",
+ thisDev->name, event->any.type, rc);
+
+ rc = TouchToButton(thisDev, event, XI2, &xi2, &count);
+ if (count > 0)
+ {
+ evtype = xi2_get_type(xi2);
+ mask = xi2mask_isset(grab->xi2mask, thisDev, evtype);
+ /* try pointer emulated XI2 button event */
+ FixUpEventFromWindow(pSprite, xi2, grab->window, None,
+ TRUE);
+ /* XXX: XACE */
+ deliveries = TryClientEvents(rClient(grab), thisDev,
+ xi2, 1, mask, 1, grab);
+ } else if (rc != Success && rc != BadMatch)
+ ErrorF("[dix] %s: XI2 pointer emulation conversion "
+ "failed in DGE (%d, %d). Skipping delivery.\n",
+ thisDev->name, event->any.type, rc);
+ }
} else if (rc != BadMatch)
ErrorF("[dix] %s: XI2 conversion failed in DGE (%d, %d). Skipping delivery.\n",
thisDev->name, event->any.type, rc);
@@ -4608,6 +4689,62 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
GetEventFilter(thisDev, xi),
grab);
}
+ } else if (IsTouchEvent(event)) {
+ rc = TouchToMotion(thisDev, event, XI, &xi, &count);
+ if (count > 0)
+ {
+ /* try XI event */
+ if (grabinfo->fromPassiveGrab && grabinfo->implicitGrab)
+ mask = grab->deviceMask;
+ else
+ mask = grab->eventMask;
+
+ FixUpEventFromWindow(pSprite, xi, grab->window, None, TRUE);
+
+ if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
+ grab->window, xi, count) ||
+ XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
+ grab->window, xi, count))
+ deliveries = 1; /* don't send, but pretend we did */
+ else
+ {
+ deliveries =
+ TryClientEvents(rClient(grab), thisDev, xi, count,
+ mask, GetEventFilter(thisDev, xi),
+ grab);
+ }
+ } else if (rc != Success && rc != BadMatch)
+ ErrorF("[dix] %s: XI pointer emulation conversion failed "
+ "in DGE (%d, %d). Skipping delivery.\n",
+ thisDev->name, event->any.type, rc);
+
+ rc = TouchToButton(thisDev, event, XI, &xi, &count);
+ if (count > 0)
+ {
+ /* try XI event */
+ if (grabinfo->fromPassiveGrab && grabinfo->implicitGrab)
+ mask = grab->deviceMask;
+ else
+ mask = grab->eventMask;
+
+ FixUpEventFromWindow(pSprite, xi, grab->window, None, TRUE);
+
+ if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
+ grab->window, xi, count) ||
+ XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
+ grab->window, xi, count))
+ deliveries = 1; /* don't send, but pretend we did */
+ else
+ {
+ deliveries =
+ TryClientEvents(rClient(grab), thisDev, xi, count,
+ mask, GetEventFilter(thisDev, xi),
+ grab);
+ }
+ } else if (rc != Success && rc != BadMatch)
+ ErrorF("[dix] %s: XI pointer emulation conversion failed "
+ "in DGE (%d, %d). Skipping delivery.\n",
+ thisDev->name, event->any.type, rc);
} else if (rc != BadMatch)
ErrorF("[dix] %s: XI conversion failed in DGE (%d, %d). Skipping delivery.\n",
thisDev->name, event->any.type, rc);