Hi, On Fri, Jan 08, 2010 at 03:27:27PM +1000, Peter Hutterer wrote: > I'd like to get more testing and review for this since it might become a > candidate for 1.7.5. First tests look like it works fine again. > This patch requires the EventToCore patch > http://lists.freedesktop.org/archives/xorg-devel/2010-January/004752.html
Comments inline.
> + eventinfo.events = (xEventPtr)xi_events;
> + eventinfo.count = count;
> + ErrorF("POE xi root is %lx\n", xi_events->u.keyButtonPointer.root);
> + CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
> + xfree(xi_events);
> +
> + if (IsMaster(device))
> + {
> + xEvent core;
> + EventToCore(ev, &core);
> + eventinfo.events = (xEventPtr)&core;
> + eventinfo.count = 1;
> + ErrorF("POE core root is %lx\n", core.u.keyButtonPointer.root);
> + CallCallbacks(&DeviceEventCallback, (pointer) & eventinfo);
> + }
So it looks like we will record one Xi and one core event for every
event that ends up getting sent through the MD, regardless of which
deliveries were made.
Previously we'd only record an input event if any deliveries of that
type occurred, right? It looks like something like the attached
(note: wholly untested, had to peg my CPU at 12% to prevent thermal
shutdowns ... MacBook Air + Australian summer is a poor combination)
would match the old semantics.
Cheers,
Daniel
diff --git a/dix/events.c b/dix/events.c
index 85c8f9a..cf6b253 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -2454,10 +2454,14 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent
*event, GrabPtr grab,
int deliveries = 0;
xEvent core;
xEvent *xE = NULL;
+ xEvent *xi2 = NULL;
+ xEventInfo event_info;
int rc, mask, count = 0;
CHECKEVENT(event);
+ event_info.count = 0;
+
while (pWin)
{
if ((mask = EventIsDeliverable(dev, event, pWin)))
@@ -2465,7 +2469,6 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event,
GrabPtr grab,
/* XI2 events first */
if (mask & XI2_MASK)
{
- xEvent *xi2 = NULL;
rc = EventToXI2(event, &xi2);
if (rc == Success)
{
@@ -2474,9 +2477,14 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent
*event, GrabPtr grab,
FixUpEventFromWindow(dev, xi2, pWin, child, FALSE);
deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
filter, grab);
- xfree(xi2);
if (deliveries > 0)
+ {
+ event_info.events = xi2;
+ event_info.count = 1;
goto unwind;
+ }
+ xfree(xi2);
+ xi2 = NULL;
} else if (rc != BadMatch)
ErrorF("[dix] %s: XI2 conversion failed in DDE (%d).\n",
dev->name, rc);
@@ -2494,7 +2502,16 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent
*event, GrabPtr grab,
deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
filter, grab);
if (deliveries > 0)
+ {
+ event_info.events = xE;
+ event_info.count = count;
goto unwind;
+ }
+ }
+
+ if (rc == Success) {
+ xfree(xE);
+ xE = NULL;
}
}
@@ -2510,7 +2527,11 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent
*event, GrabPtr grab,
deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
filter, grab);
if (deliveries > 0)
+ {
+ event_info.events = &core;
+ event_info.events = 1;
goto unwind;
+ }
}
}
@@ -2527,7 +2548,12 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent
*event, GrabPtr grab,
}
unwind:
+ if (event_info.count)
+ CallCallbacks(&DeviceEventCallback, (pointer) &event_info);
+
+ xfree(xi2);
xfree(xE);
+
return deliveries;
}
@@ -3734,9 +3760,12 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent
*event, WindowPtr window)
BOOL sendCore = (IsMaster(keybd) && keybd->coreEvents);
xEvent core;
xEvent *xE = NULL, *xi2 = NULL;
+ xEventInfo event_info;
int count, rc;
int deliveries = 0;
+ event_info.count = 0;
+
if (focus == FollowKeyboardWin)
focus = inputInfo.keyboard->focus->win;
if (!focus)
@@ -3765,22 +3794,39 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent
*event, WindowPtr window)
deliveries = DeliverEventsToWindow(keybd, focus, xi2, 1,
filter, NullGrab);
if (deliveries > 0)
+ {
+ event_info.events = xi2;
+ event_info.count = 1;
goto unwind;
+ }
+
+ xfree(xi2);
+ xi2 = NULL;
} else if (rc != BadMatch)
ErrorF("[dix] %s: XI2 conversion failed in DFE (%d, %d). Skipping
delivery.\n",
keybd->name, event->any.type, rc);
rc = EventToXI(event, &xE, &count);
- if (rc == Success &&
- XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE, count) == Success)
+ if (rc == Success)
{
- FixUpEventFromWindow(ptr, xE, focus, None, FALSE);
- deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
- GetEventFilter(keybd, xE),
- NullGrab);
+ if (XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE,
+ count) == Success)
+ {
+ FixUpEventFromWindow(ptr, xE, focus, None, FALSE);
+ deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
+ GetEventFilter(keybd, xE),
+ NullGrab);
- if (deliveries > 0)
- goto unwind;
+ if (deliveries > 0)
+ {
+ event_info.events = xE;
+ event_info.count = count;
+ goto unwind;
+ }
+ }
+
+ xfree(xE);
+ xE = NULL;
} else if (rc != BadMatch)
ErrorF("[dix] %s: XI conversion failed in DFE (%d, %d). Skipping
delivery.\n",
keybd->name, event->any.type, rc);
@@ -3796,13 +3842,20 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent
*event, WindowPtr window)
GetEventFilter(keybd, &core),
NullGrab);
}
+
+ if (deliveries > 0)
+ {
+ event_info.events = &core;
+ event_info.count = 1;
+ goto unwind;
+ }
}
unwind:
- if (xE)
- xfree(xE);
- if (xi2)
- xfree(xi2);
+ if (event_info.count)
+ CallCallbacks(&DeviceEventCallback, (pointer) &event_info);
+ xfree(xi2);
+ xfree(xE);
return;
}
@@ -3824,6 +3877,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr
thisDev,
SpritePtr pSprite = thisDev->spriteInfo->sprite;
BOOL sendCore = FALSE;
int rc, count = 0;
+ xEvent core;
xEvent *xi = NULL;
xEvent *xi2 = NULL;
@@ -3875,8 +3929,6 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr
thisDev,
/* try core event */
if (sendCore && grab->grabtype == GRABTYPE_CORE)
{
- xEvent core;
-
rc = EventToCore(event, &core);
if (rc == Success)
{
@@ -3893,6 +3945,11 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr
thisDev,
&core, 1, mask,
GetEventFilter(thisDev, &core),
grab);
+ if (deliveries)
+ {
+ event_info.events = &core;
+ event_info.count = 1;
+ }
}
} else if (rc != BadMatch)
ErrorF("[dix] DeliverGrabbedEvent. Core conversion failed.\n");
@@ -3912,6 +3969,11 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr
thisDev,
/* XXX: XACE */
deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1,
mask,
GetEventFilter(thisDev, xi2), grab);
+ if (deliveries)
+ {
+ event_info.events = xi2;
+ event_info.count = 1;
+ }
} else if (rc != BadMatch)
ErrorF("[dix] %s: XI2 conversion failed in DGE (%d, %d).
Skipping delivery.\n",
thisDev->name, event->any.type, rc);
@@ -3945,6 +4007,11 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr
thisDev,
mask,
GetEventFilter(thisDev, xi),
grab);
+ if (deliveries)
+ {
+ event_info.events = xi;
+ event_info.count = count;
+ }
}
} else if (rc != BadMatch)
ErrorF("[dix] %s: XI conversion failed in DGE (%d, %d).
Skipping delivery.\n",
@@ -3982,6 +4049,9 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr
thisDev,
}
}
+ if (event_info.count)
+ CallCallbacks(&DeviceEventCallback, (pointer) &event_info);
+
if (xi)
xfree(xi);
if (xi2)
pgpeVPc1ryHx1.pgp
Description: PGP signature
_______________________________________________ xorg-devel mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-devel
