[RFC XI 2.1 - xserver 4/9] Input: Pass sprite instead of device to FixUpEventFromWindow
Peter Hutterer
peter.hutterer at who-t.net
Tue Nov 16 21:29:03 PST 2010
On Fri, Nov 12, 2010 at 05:35:05PM -0500, Chase Douglas wrote:
> From: Daniel Stone <daniel at fooishbar.org>
>
> Since FixUpEventFromWindow only uses the sprite trace to determine the
> window stack, pass in a sprite instead of hardcoding the device sprite,
> so we can deliver to windows other than the one currently containing the
> sprite.
>
> Signed-off-by: Daniel Stone <daniel at fooishbar.org>
merged, thanks.
Cheers,
Peter
> ---
> Xi/exevents.c | 3 ++-
> dix/events.c | 43 +++++++++++++++++++++----------------------
> include/input.h | 3 ++-
> include/inputstr.h | 4 ++--
> 4 files changed, 27 insertions(+), 26 deletions(-)
>
> diff --git a/Xi/exevents.c b/Xi/exevents.c
> index d57265e..0cd2246 100644
> --- a/Xi/exevents.c
> +++ b/Xi/exevents.c
> @@ -1259,7 +1259,8 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
> xi2event->group.effective_group = dev->key->xkbInfo->state.group;
> }
>
> - FixUpEventFromWindow(dev, (xEvent*)xi2event, pWin, None, FALSE);
> + FixUpEventFromWindow(dev->spriteInfo->sprite, (xEvent*)xi2event, pWin,
> + None, FALSE);
>
> DeliverEventsToWindow(dev, pWin, (xEvent*)xi2event, 1,
> GetEventFilter(dev, (xEvent*)xi2event), NullGrab);
> diff --git a/dix/events.c b/dix/events.c
> index 07f7b1f..f7781ce 100644
> --- a/dix/events.c
> +++ b/dix/events.c
> @@ -2198,9 +2198,8 @@ MaybeDeliverEventsToClient(WindowPtr pWin, xEvent *pEvents,
> return 2;
> }
>
> -static Window FindChildForEvent(DeviceIntPtr dev, WindowPtr event)
> +static Window FindChildForEvent(SpritePtr pSprite, WindowPtr event)
> {
> - SpritePtr pSprite = dev->spriteInfo->sprite;
> WindowPtr w = pSprite->spriteTrace[pSprite->spriteTraceGood-1];
> Window child = None;
>
> @@ -2239,16 +2238,14 @@ static Window FindChildForEvent(DeviceIntPtr dev, WindowPtr event)
> */
> void
> FixUpEventFromWindow(
> - DeviceIntPtr pDev,
> + SpritePtr pSprite,
> xEvent *xE,
> WindowPtr pWin,
> Window child,
> Bool calcChild)
> {
> - SpritePtr pSprite = pDev->spriteInfo->sprite;
> -
> if (calcChild)
> - child = FindChildForEvent(pDev, pWin);
> + child = FindChildForEvent(pSprite, pWin);
>
> if (XI2_EVENT(xE))
> {
> @@ -2264,7 +2261,7 @@ FixUpEventFromWindow(
> event->evtype == XI_PropertyEvent)
> return;
>
> - event->root = RootWindow(pDev)->drawable.id;
> + event->root = pSprite->spriteTrace[0]->drawable.id;
> event->event = pWin->drawable.id;
> if (pSprite->hot.pScreen == pWin->drawable.pScreen)
> {
> @@ -2285,7 +2282,7 @@ FixUpEventFromWindow(
>
> } else
> {
> - XE_KBPTR.root = RootWindow(pDev)->drawable.id;
> + XE_KBPTR.root = pSprite->spriteTrace[0]->drawable.id;
> XE_KBPTR.event = pWin->drawable.id;
> if (pSprite->hot.pScreen == pWin->drawable.pScreen)
> {
> @@ -2402,6 +2399,7 @@ int
> DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
> WindowPtr stopAt, DeviceIntPtr dev)
> {
> + SpritePtr pSprite = dev->spriteInfo->sprite;
> Window child = None;
> Mask filter;
> int deliveries = 0;
> @@ -2424,7 +2422,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
> {
> /* XXX: XACE */
> filter = GetEventFilter(dev, xi2);
> - FixUpEventFromWindow(dev, xi2, pWin, child, FALSE);
> + FixUpEventFromWindow(pSprite, xi2, pWin, child, FALSE);
> deliveries = DeliverEventsToWindow(dev, pWin, xi2, 1,
> filter, grab);
> free(xi2);
> @@ -2442,7 +2440,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
> if (rc == Success) {
> if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, xE, count) == Success) {
> filter = GetEventFilter(dev, xE);
> - FixUpEventFromWindow(dev, xE, pWin, child, FALSE);
> + FixUpEventFromWindow(pSprite, xE, pWin, child, FALSE);
> deliveries = DeliverEventsToWindow(dev, pWin, xE, count,
> filter, grab);
> if (deliveries > 0)
> @@ -2460,7 +2458,7 @@ DeliverDeviceEvents(WindowPtr pWin, InternalEvent *event, GrabPtr grab,
> if (rc == Success) {
> if (XaceHook(XACE_SEND_ACCESS, NULL, dev, pWin, &core, 1) == Success) {
> filter = GetEventFilter(dev, &core);
> - FixUpEventFromWindow(dev, &core, pWin, child, FALSE);
> + FixUpEventFromWindow(pSprite, &core, pWin, child, FALSE);
> deliveries = DeliverEventsToWindow(dev, pWin, &core, 1,
> filter, grab);
> if (deliveries > 0)
> @@ -3395,6 +3393,7 @@ CheckPassiveGrabsOnWindow(
> DeviceEvent *event,
> BOOL checkCore)
> {
> + SpritePtr pSprite = device->spriteInfo->sprite;
> GrabPtr grab = wPassiveGrabs(pWin);
> GrabRec tempGrab;
> GrabInfoPtr grabinfo;
> @@ -3561,7 +3560,7 @@ CheckPassiveGrabsOnWindow(
>
> if (xE)
> {
> - FixUpEventFromWindow(device, xE, grab->window, None, TRUE);
> + FixUpEventFromWindow(pSprite, xE, grab->window, None, TRUE);
>
> TryClientEvents(rClient(grab), device, xE, count,
> GetEventFilter(device, xE),
> @@ -3705,7 +3704,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
> {
> /* XXX: XACE */
> int filter = GetEventFilter(keybd, xi2);
> - FixUpEventFromWindow(ptr, xi2, focus, None, FALSE);
> + FixUpEventFromWindow(ptr->spriteInfo->sprite, xi2, focus, None, FALSE);
> deliveries = DeliverEventsToWindow(keybd, focus, xi2, 1,
> filter, NullGrab);
> if (deliveries > 0)
> @@ -3718,7 +3717,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
> if (rc == Success &&
> XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, xE, count) == Success)
> {
> - FixUpEventFromWindow(ptr, xE, focus, None, FALSE);
> + FixUpEventFromWindow(ptr->spriteInfo->sprite, xE, focus, None, FALSE);
> deliveries = DeliverEventsToWindow(keybd, focus, xE, count,
> GetEventFilter(keybd, xE),
> NullGrab);
> @@ -3734,7 +3733,8 @@ DeliverFocusedEvent(DeviceIntPtr keybd, InternalEvent *event, WindowPtr window)
> rc = EventToCore(event, &core);
> if (rc == Success) {
> if (XaceHook(XACE_SEND_ACCESS, NULL, keybd, focus, &core, 1) == Success) {
> - FixUpEventFromWindow(keybd, &core, focus, None, FALSE);
> + FixUpEventFromWindow(keybd->spriteInfo->sprite, &core, focus,
> + None, FALSE);
> deliveries = DeliverEventsToWindow(keybd, focus, &core, 1,
> GetEventFilter(keybd, &core),
> NullGrab);
> @@ -3824,8 +3824,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
> rc = EventToCore(event, &core);
> if (rc == Success)
> {
> - FixUpEventFromWindow(thisDev, &core, grab->window,
> - None, TRUE);
> + FixUpEventFromWindow(pSprite, &core, grab->window, None, TRUE);
> if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
> grab->window, &core, 1) ||
> XaceHook(XACE_RECEIVE_ACCESS, rClient(grab),
> @@ -3852,7 +3851,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
> grab->xi2mask[XIAllMasterDevices][evtype/8] |
> grab->xi2mask[thisDev->id][evtype/8];
> /* try XI2 event */
> - FixUpEventFromWindow(thisDev, xi2, grab->window, None, TRUE);
> + FixUpEventFromWindow(pSprite, xi2, grab->window, None, TRUE);
> /* XXX: XACE */
> deliveries = TryClientEvents(rClient(grab), thisDev, xi2, 1, mask,
> GetEventFilter(thisDev, xi2), grab);
> @@ -3873,8 +3872,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
> else
> mask = grab->eventMask;
>
> - FixUpEventFromWindow(thisDev, xi, grab->window,
> - None, TRUE);
> + FixUpEventFromWindow(pSprite, xi, grab->window, None, TRUE);
>
> if (XaceHook(XACE_SEND_ACCESS, 0, thisDev,
> grab->window, xi, count) ||
> @@ -4220,7 +4218,7 @@ CoreEnterLeaveEvent(
> event.u.enterLeave.rootX = mouse->spriteInfo->sprite->hot.x;
> event.u.enterLeave.rootY = mouse->spriteInfo->sprite->hot.y;
> /* Counts on the same initial structure of crossing & button events! */
> - FixUpEventFromWindow(mouse, &event, pWin, None, FALSE);
> + FixUpEventFromWindow(mouse->spriteInfo->sprite, &event, pWin, None, FALSE);
> /* Enter/Leave events always set child */
> event.u.enterLeave.child = child;
> event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ?
> @@ -4320,7 +4318,8 @@ DeviceEnterLeaveEvent(
> event->group.locked_group = kbd->key->xkbInfo->state.locked_group;
> }
>
> - FixUpEventFromWindow(mouse, (xEvent*)event, pWin, None, FALSE);
> + FixUpEventFromWindow(mouse->spriteInfo->sprite, (xEvent*)event, pWin,
> + None, FALSE);
>
> filter = GetEventFilter(mouse, (xEvent*)event);
>
> diff --git a/include/input.h b/include/input.h
> index fef69a1..31fdc52 100644
> --- a/include/input.h
> +++ b/include/input.h
> @@ -103,6 +103,7 @@ typedef struct _OtherClients *OtherClientsPtr;
> typedef struct _InputClients *InputClientsPtr;
> typedef struct _DeviceIntRec *DeviceIntPtr;
> typedef struct _ClassesRec *ClassesPtr;
> +typedef struct _SpriteRec *SpritePtr;
> typedef union _GrabMask GrabMask;
>
> typedef struct _EventList {
> @@ -527,7 +528,7 @@ extern _X_EXPORT void FreeInputAttributes(InputAttributes *attrs);
> /* misc event helpers */
> extern Mask GetEventFilter(DeviceIntPtr dev, xEvent *event);
> extern Mask GetWindowXI2Mask(DeviceIntPtr dev, WindowPtr win, xEvent* ev);
> -void FixUpEventFromWindow(DeviceIntPtr pDev,
> +void FixUpEventFromWindow(SpritePtr pSprite,
> xEvent *xE,
> WindowPtr pWin,
> Window child,
> diff --git a/include/inputstr.h b/include/inputstr.h
> index d4c253e..4d8ea12 100644
> --- a/include/inputstr.h
> +++ b/include/inputstr.h
> @@ -363,7 +363,7 @@ typedef struct _ClassesRec {
> /**
> * Sprite information for a device.
> */
> -typedef struct {
> +typedef struct _SpriteRec {
> CursorPtr current;
> BoxRec hotLimits; /* logical constraints of hot spot */
> Bool confined; /* confined to screen */
> @@ -399,7 +399,7 @@ typedef struct {
> ScreenPtr pEnqueueScreen;
> ScreenPtr pDequeueScreen;
>
> -} SpriteRec, *SpritePtr;
> +} SpriteRec;
>
> /* Device properties */
> typedef struct _XIPropertyValue
> --
> 1.7.1
More information about the xorg-devel
mailing list