dix: switch DeliverGrabbedEvent to internal events.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2009-02-02 14:54:34 +10:00
parent fb858774b8
commit 1c38abd4b1

View File

@ -3475,6 +3475,8 @@ 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;
grabinfo = &thisDev->deviceGrab; grabinfo = &thisDev->deviceGrab;
grab = grabinfo->grab; grab = grabinfo->grab;
@ -3510,12 +3512,20 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
} }
if (!deliveries) if (!deliveries)
{ {
/* FIXME: temporary solution only. The event masks need a rework, /* XXX: In theory, we could pass the internal events through to
* especially for generic events. */ * everything and only convert just before hitting the wire. We can't
static int count; * do that yet, so DGE is the last stop for internal events. From here
static xEvent xi[1000]; /* enough bytes for the events we have atm */ * onwards, we deal with core/XI events.
*/
count = ConvertBackToXI((InternalEvent*)event, xi); rc = EventToXI(event, &xi, &count);
if (rc != Success)
{
ErrorF("[dix] %s: XI conversion failed in DGE (%d, %d). Skipping delivery.\n",
thisDev->name, event->u.any.type, rc);
goto unwind;
} else if (count == 0) /* no XI/Core event for you */
goto unwind;
if (xi->u.u.type == GenericEvent) if (xi->u.u.type == GenericEvent)
{ {
@ -3524,7 +3534,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
GenericMaskPtr gemask = grab->genericMasks; GenericMaskPtr gemask = grab->genericMasks;
if (!gemask || !gemask->eventMask[GEEXTIDX(ge)]) if (!gemask || !gemask->eventMask[GEEXTIDX(ge)])
return; goto unwind;
if (GEEventFill(xi)) if (GEEventFill(xi))
GEEventFill(xi)(ge, thisDev, grab->window, grab); GEEventFill(xi)(ge, thisDev, grab->window, grab);
@ -3541,13 +3551,12 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
if (sendCore && grab->coreGrab) if (sendCore && grab->coreGrab)
{ {
xEvent core; xEvent core;
int rc;
rc = EventToCore(event, &core); rc = EventToCore(event, &core);
if (rc != Success && rc != BadMatch) if (rc != Success && rc != BadMatch)
{ {
ErrorF("[dix] DeliverGrabbedEvent. Core conversion failed.\n"); ErrorF("[dix] DeliverGrabbedEvent. Core conversion failed.\n");
return; goto unwind;
} }
FixUpEventFromWindow(thisDev, &core, grab->window, FixUpEventFromWindow(thisDev, &core, grab->window,
@ -3622,6 +3631,10 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
break; break;
} }
} }
unwind:
if (xi)
xfree(xi);
} }
/* This function is used to set the key pressed or key released state - /* This function is used to set the key pressed or key released state -