diff options
author | Chase Douglas <chase.douglas@canonical.com> | 2011-11-22 17:13:52 -0800 |
---|---|---|
committer | Chase Douglas <chase.douglas@canonical.com> | 2011-11-28 17:33:43 -0800 |
commit | f874eca8f3224db924d7bb5169aa28ad47c3b5a7 (patch) | |
tree | 0a81d029a74581b45f790aed6805f460b92875b9 | |
parent | 072898f26acd059b76f63035342055b32035ea70 (diff) |
Update DeliverGrabbedEvent for touch pointer emulation
Signed-off-by: Chase Douglas <chase.douglas@canonical.com>
-rw-r--r-- | dix/events.c | 137 |
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); |