dix: split grab event conversion and delivery into a helper function
Effective functional change: XI2 events are checked with XACE now. DeliverOneGrabbedEvent is exported for future use by touch events. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net> Reviewed-by: Chase Douglas <chase.douglas@canonical.com>
This commit is contained in:
parent
c81cdb0862
commit
93945b0a74
144
dix/events.c
144
dix/events.c
|
@ -4061,6 +4061,75 @@ unwind:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
DeliverOneGrabbedEvent(InternalEvent *event, DeviceIntPtr dev, enum InputLevel level)
|
||||||
|
{
|
||||||
|
SpritePtr pSprite = dev->spriteInfo->sprite;
|
||||||
|
int rc;
|
||||||
|
xEvent *xE = NULL;
|
||||||
|
int count = 0;
|
||||||
|
int deliveries = 0;
|
||||||
|
Mask mask;
|
||||||
|
GrabInfoPtr grabinfo = &dev->deviceGrab;
|
||||||
|
GrabPtr grab = grabinfo->grab;
|
||||||
|
Mask filter;
|
||||||
|
|
||||||
|
switch(level)
|
||||||
|
{
|
||||||
|
case XI2:
|
||||||
|
rc = EventToXI2(event, &xE);
|
||||||
|
count = 1;
|
||||||
|
if (rc == Success)
|
||||||
|
{
|
||||||
|
int evtype = xi2_get_type(xE);
|
||||||
|
mask = xi2mask_isset(grab->xi2mask, dev, evtype);
|
||||||
|
filter = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case XI:
|
||||||
|
if (grabinfo->fromPassiveGrab && grabinfo->implicitGrab)
|
||||||
|
mask = grab->deviceMask;
|
||||||
|
else
|
||||||
|
mask = grab->eventMask;
|
||||||
|
rc = EventToXI(event, &xE, &count);
|
||||||
|
if (rc == Success)
|
||||||
|
filter = GetEventFilter(dev, xE);
|
||||||
|
break;
|
||||||
|
case CORE:
|
||||||
|
rc = EventToCore(event, &xE, &count);
|
||||||
|
mask = grab->eventMask;
|
||||||
|
if (rc == Success)
|
||||||
|
filter = GetEventFilter(dev, xE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
BUG_WARN_MSG(1, "Invalid input level %d\n", level);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc == Success)
|
||||||
|
{
|
||||||
|
FixUpEventFromWindow(pSprite, xE, grab->window, None, TRUE);
|
||||||
|
if (XaceHook(XACE_SEND_ACCESS, 0, dev,
|
||||||
|
grab->window, xE, count) ||
|
||||||
|
XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
|
||||||
|
grab->window, xE, count))
|
||||||
|
deliveries = 1; /* don't send, but pretend we did */
|
||||||
|
else if (level != CORE || !IsInterferingGrab(rClient(grab), dev, xE))
|
||||||
|
{
|
||||||
|
deliveries = TryClientEvents(rClient(grab), dev,
|
||||||
|
xE, count, mask, filter,
|
||||||
|
grab);
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
BUG_WARN_MSG(rc != BadMatch, "%s: conversion to mode %d failed on %d with %d\n",
|
||||||
|
dev->name, level, event->any.type, rc);
|
||||||
|
|
||||||
|
free(xE);
|
||||||
|
return deliveries;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Deliver an event from a device that is currently grabbed. Uses
|
* Deliver an event from a device that is currently grabbed. Uses
|
||||||
* DeliverDeviceEvents() for further delivery if a ownerEvents is set on the
|
* DeliverDeviceEvents() for further delivery if a ownerEvents is set on the
|
||||||
|
@ -4080,10 +4149,6 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
|
||||||
DeviceIntPtr dev;
|
DeviceIntPtr dev;
|
||||||
SpritePtr pSprite = thisDev->spriteInfo->sprite;
|
SpritePtr pSprite = thisDev->spriteInfo->sprite;
|
||||||
BOOL sendCore = FALSE;
|
BOOL sendCore = FALSE;
|
||||||
int rc, count = 0;
|
|
||||||
xEvent *xi = NULL;
|
|
||||||
xEvent *xi2 = NULL;
|
|
||||||
xEvent *core = NULL;
|
|
||||||
|
|
||||||
grabinfo = &thisDev->deviceGrab;
|
grabinfo = &thisDev->deviceGrab;
|
||||||
grab = grabinfo->grab;
|
grab = grabinfo->grab;
|
||||||
|
@ -4119,88 +4184,27 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
|
||||||
}
|
}
|
||||||
if (!deliveries)
|
if (!deliveries)
|
||||||
{
|
{
|
||||||
Mask mask;
|
|
||||||
|
|
||||||
/* XXX: In theory, we could pass the internal events through to
|
/* XXX: In theory, we could pass the internal events through to
|
||||||
* everything and only convert just before hitting the wire. We can't
|
* everything and only convert just before hitting the wire. We can't
|
||||||
* do that yet, so DGE is the last stop for internal events. From here
|
* do that yet, so DGE is the last stop for internal events. From here
|
||||||
* onwards, we deal with core/XI events.
|
* onwards, we deal with core/XI events.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
mask = grab->eventMask;
|
|
||||||
|
|
||||||
sendCore = (IsMaster(thisDev) && thisDev->coreEvents);
|
sendCore = (IsMaster(thisDev) && thisDev->coreEvents);
|
||||||
/* try core event */
|
/* try core event */
|
||||||
if (sendCore && grab->grabtype == GRABTYPE_CORE)
|
if (sendCore && grab->grabtype == GRABTYPE_CORE)
|
||||||
{
|
{
|
||||||
rc = EventToCore(event, &core, &count);
|
deliveries = DeliverOneGrabbedEvent(event, thisDev, CORE);
|
||||||
if (rc == Success)
|
|
||||||
{
|
|
||||||
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
|
|
||||||
BUG_WARN_MSG(rc != BadMatch, "%s: Core conversion failed on %d with %d\n",
|
|
||||||
thisDev->name, event->any.type, rc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!deliveries)
|
if (!deliveries)
|
||||||
{
|
{
|
||||||
rc = EventToXI2(event, &xi2);
|
deliveries = DeliverOneGrabbedEvent(event, thisDev, XI2);
|
||||||
if (rc == Success)
|
|
||||||
{
|
|
||||||
int evtype = xi2_get_type(xi2);
|
|
||||||
mask = xi2mask_isset(grab->xi2mask, thisDev, evtype);
|
|
||||||
/* try XI2 event */
|
|
||||||
FixUpEventFromWindow(pSprite, xi2, grab->window, None, TRUE);
|
|
||||||
/* XXX: XACE */
|
|
||||||
deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask, 1, grab);
|
|
||||||
} else
|
|
||||||
BUG_WARN_MSG(rc != BadMatch, "%s: XI2 conversion failed on %d with %d\n",
|
|
||||||
thisDev->name, event->any.type, rc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!deliveries)
|
if (!deliveries)
|
||||||
{
|
{
|
||||||
rc = EventToXI(event, &xi, &count);
|
deliveries = DeliverOneGrabbedEvent(event, thisDev, XI);
|
||||||
if (rc == Success)
|
|
||||||
{
|
|
||||||
/* 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
|
|
||||||
BUG_WARN_MSG(rc != BadMatch, "%s: XI conversion failed on %d with %d\n",
|
|
||||||
thisDev->name, event->any.type, rc);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (deliveries && (event->any.type == ET_Motion))
|
if (deliveries && (event->any.type == ET_Motion))
|
||||||
|
@ -4233,10 +4237,6 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
free(core);
|
|
||||||
free(xi);
|
|
||||||
free(xi2);
|
|
||||||
|
|
||||||
return deliveries;
|
return deliveries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -400,6 +400,11 @@ extern int DeliverDeviceEvents(
|
||||||
WindowPtr /* stopAt */,
|
WindowPtr /* stopAt */,
|
||||||
DeviceIntPtr /* dev */);
|
DeviceIntPtr /* dev */);
|
||||||
|
|
||||||
|
extern int DeliverOneGrabbedEvent(
|
||||||
|
InternalEvent* /* event*/,
|
||||||
|
DeviceIntPtr /* dev */,
|
||||||
|
enum InputLevel /* level */);
|
||||||
|
|
||||||
extern void InitializeSprite(
|
extern void InitializeSprite(
|
||||||
DeviceIntPtr /* pDev */,
|
DeviceIntPtr /* pDev */,
|
||||||
WindowPtr /* pWin */);
|
WindowPtr /* pWin */);
|
||||||
|
|
Loading…
Reference in New Issue