diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2006-11-22 17:06:47 +1030 |
---|---|---|
committer | Peter Hutterer <whot@hyena.localdomain> | 2006-11-22 17:06:47 +1030 |
commit | 8c16f21d5df08b028e93440d632939a5fdbf5876 (patch) | |
tree | f40a1a71c46ed7c17ba5bc78a1b2da166d93b403 | |
parent | 70383105de279df553874efa56b37a7b3e426ea1 (diff) |
dix GetSpriteWindow() adjusted for MPX
added device dependency for MPX to DoEnterLeaveEvents,
EnterLeaveEvents, EnterNotifies, LeaveNotifies and
FixUpEventFromWindow.
-rw-r--r-- | Changelog | 13 | ||||
-rw-r--r-- | Xext/security.c | 4 | ||||
-rw-r--r-- | Xi/exevents.c | 6 | ||||
-rw-r--r-- | dix/events.c | 99 | ||||
-rw-r--r-- | include/dix.h | 2 | ||||
-rw-r--r-- | xkb/ddxFakeMtn.c | 2 |
6 files changed, 86 insertions, 40 deletions
@@ -17,6 +17,19 @@ Files: Xi/exevents.c +dix GetSpriteWindow() adjusted for MPX + added device dependency for MPX to DoEnterLeaveEvents, + EnterLeaveEvents, EnterNotifies, LeaveNotifies and + FixUpEventFromWindow. + +Files: + Xext/security.c + Xi/exevents.c + ddx/ddxFakeMtn.c + dix/events.c + include/dix.h + + == 21.11.06 == mi: added MPX to miSpriteReportDamage added id field to miCursorInfoPtr, required to pass through to miDC diff --git a/Xext/security.c b/Xext/security.c index ac762794a..c1c8f1f8f 100644 --- a/Xext/security.c +++ b/Xext/security.c @@ -745,12 +745,12 @@ SecurityDetermineEventPropogationLimits( if (pFocusWin == PointerRootWin) { /* focus follows the pointer */ - *ppWin = GetSpriteWindow(); + *ppWin = GetSpriteWindow(dev); *ppStopWin = NULL; /* propogate all the way to the root */ } else { /* a real window is set for the focus */ - WindowPtr pSpriteWin = GetSpriteWindow(); + WindowPtr pSpriteWin = GetSpriteWindow(dev); *ppStopWin = pFocusWin->parent; /* don't go past the focus window */ /* if the pointer is in a subwindow of the focus window, start diff --git a/Xi/exevents.c b/Xi/exevents.c index 13687e3a5..d89c379e9 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -276,9 +276,9 @@ ProcessOtherEvent(xEventPtr xE, register DeviceIntPtr other, int count) if (grab) DeliverGrabbedEvent(xE, other, deactivateDeviceGrab, count); else if (other->focus) - DeliverFocusedEvent(other, xE, GetSpriteWindow(), count); + DeliverFocusedEvent(other, xE, GetSpriteWindow(other), count); else - DeliverDeviceEvents(GetSpriteWindow(), xE, NullGrab, NullWindow, + DeliverDeviceEvents(GetSpriteWindow(other), xE, NullGrab, NullWindow, other, count); if (deactivateDeviceGrab == TRUE) @@ -781,7 +781,7 @@ SendEvent(ClientPtr client, DeviceIntPtr d, Window dest, Bool propagate, { WindowPtr pWin; WindowPtr effectiveFocus = NullWindow; /* only set if dest==InputFocus */ - WindowPtr spriteWin = GetSpriteWindow(); + WindowPtr spriteWin = GetSpriteWindow(d); if (dest == PointerWindow) pWin = spriteWin; diff --git a/dix/events.c b/dix/events.c index bb6bcfc41..492e4a415 100644 --- a/dix/events.c +++ b/dix/events.c @@ -270,6 +270,7 @@ _X_EXPORT HotSpot xeviehot; #endif static void DoEnterLeaveEvents( + DeviceIntPtr pDev, WindowPtr fromWin, WindowPtr toWin, int mode @@ -614,8 +615,9 @@ XineramaCheckMotion(xEvent *xE, DeviceIntPtr pDev) if (prevSpriteWin != NullWindow) { if (!xE) UpdateCurrentTimeIf(); - DoEnterLeaveEvents(prevSpriteWin, pSprite->win, NotifyNormal); - } + DoEnterLeaveEvents(pDev, prevSpriteWin, pSprite->win, + NotifyNormal); + } PostNewCursor(pDev); return FALSE; } @@ -991,8 +993,13 @@ GetCurrentRootWindow() } _X_EXPORT WindowPtr -GetSpriteWindow() +GetSpriteWindow(DeviceIntPtr pDev) { +#ifdef MPX + if(IsMPDev(pDev)) + return mpsprites[pDev->id].win; +#endif + return sprite->win; } @@ -1321,7 +1328,7 @@ ActivatePointerGrab(register DeviceIntPtr mouse, register GrabPtr grab, sprite->hotPhys.x = sprite->hotPhys.y = 0; ConfineCursorToWindow(grab->confineTo, FALSE, TRUE); } - DoEnterLeaveEvents(oldWin, grab->window, NotifyGrab); + DoEnterLeaveEvents(mouse, oldWin, grab->window, NotifyGrab); mouse->valuator->motionHintWindow = NullWindow; if (syncEvents.playingEvents) mouse->grabTime = syncEvents.time; @@ -1351,7 +1358,7 @@ DeactivatePointerGrab(register DeviceIntPtr mouse) if (dev->sync.other == grab) dev->sync.other = NullGrab; } - DoEnterLeaveEvents(grab->window, sprite->win, NotifyUngrab); + DoEnterLeaveEvents(mouse, grab->window, sprite->win, NotifyUngrab); if (grab->confineTo) ConfineCursorToWindow(ROOT, FALSE, FALSE); PostNewCursor(inputInfo.pointer); @@ -1823,11 +1830,18 @@ MaybeDeliverEventsToClient(register WindowPtr pWin, xEvent *pEvents, static void FixUpEventFromWindow( + DeviceIntPtr pDev, xEvent *xE, WindowPtr pWin, Window child, Bool calcChild) { + SpritePtr pSprite = sprite; +#ifdef MPX + if (IsMPDev(pDev)) + pSprite = &mpsprites[pDev->id]; +#endif + if (calcChild) { WindowPtr w=spriteTrace[spriteTraceGood-1]; @@ -1857,7 +1871,7 @@ FixUpEventFromWindow( } XE_KBPTR.root = ROOT->drawable.id; XE_KBPTR.event = pWin->drawable.id; - if (sprite->hot.pScreen == pWin->drawable.pScreen) + if (pSprite->hot.pScreen == pWin->drawable.pScreen) { XE_KBPTR.sameScreen = xTrue; XE_KBPTR.child = child; @@ -1896,7 +1910,7 @@ DeliverDeviceEvents(register WindowPtr pWin, register xEvent *xE, GrabPtr grab, { if (inputMasks && (inputMasks->inputEvents[mskidx] & filter)) { - FixUpEventFromWindow(xE, pWin, child, FALSE); + FixUpEventFromWindow(dev, xE, pWin, child, FALSE); deliveries = DeliverEventsToWindow(pWin, xE, count, filter, grab, mskidx); if (deliveries > 0) @@ -1921,7 +1935,7 @@ DeliverDeviceEvents(register WindowPtr pWin, register xEvent *xE, GrabPtr grab, { if ((wOtherEventMasks(pWin)|pWin->eventMask) & filter) { - FixUpEventFromWindow(xE, pWin, child, FALSE); + FixUpEventFromWindow(dev, xE, pWin, child, FALSE); deliveries = DeliverEventsToWindow(pWin, xE, count, filter, grab, 0); if (deliveries > 0) @@ -2125,8 +2139,9 @@ CheckMotion(xEvent *xE, DeviceIntPtr pDev) if (prevSpriteWin != NullWindow) { if (!xE) UpdateCurrentTimeIf(); - DoEnterLeaveEvents(prevSpriteWin, pSprite->win, NotifyNormal); - } + DoEnterLeaveEvents(pDev, prevSpriteWin, pSprite->win, + NotifyNormal); + } PostNewCursor(pDev); return FALSE; } @@ -2600,7 +2615,7 @@ CheckPassiveGrabsOnWindow( #endif (*device->ActivateGrab)(device, grab, currentTime, TRUE); - FixUpEventFromWindow(xE, grab->window, None, TRUE); + FixUpEventFromWindow(device, xE, grab->window, None, TRUE); (void) TryClientEvents(rClient(grab), xE, count, filters[xE->u.u.type], @@ -2705,7 +2720,7 @@ DeliverFocusedEvent(DeviceIntPtr keybd, xEvent *xE, WindowPtr window, int count) return; } /* just deliver it to the focus window */ - FixUpEventFromWindow(xE, focus, None, FALSE); + FixUpEventFromWindow(inputInfo.pointer, xE, focus, None, FALSE); if (xE->u.u.type & EXTENSION_EVENT_BASE) mskidx = keybd->id; (void)DeliverEventsToWindow(focus, xE, count, filters[xE->u.u.type], @@ -2745,7 +2760,7 @@ DeliverGrabbedEvent(register xEvent *xE, register DeviceIntPtr thisDev, } if (!deliveries) { - FixUpEventFromWindow(xE, grab->window, None, TRUE); + FixUpEventFromWindow(thisDev, xE, grab->window, None, TRUE); deliveries = TryClientEvents(rClient(grab), xE, count, (Mask)grab->eventMask, filters[xE->u.u.type], grab); @@ -3321,6 +3336,7 @@ CommonAncestor( static void EnterLeaveEvent( + DeviceIntPtr pDev, int type, int mode, int detail, @@ -3330,7 +3346,7 @@ EnterLeaveEvent( xEvent event; register DeviceIntPtr keybd = inputInfo.keyboard; WindowPtr focus; - register DeviceIntPtr mouse = inputInfo.pointer; + register DeviceIntPtr mouse = pDev; register GrabPtr grab = mouse->grab; Mask mask; @@ -3355,7 +3371,7 @@ EnterLeaveEvent( event.u.enterLeave.rootX = sprite->hot.x; event.u.enterLeave.rootY = sprite->hot.y; /* Counts on the same initial structure of crossing & button events! */ - FixUpEventFromWindow(&event, pWin, None, FALSE); + FixUpEventFromWindow(mouse, &event, pWin, None, FALSE); /* Enter/Leave events always set child */ event.u.enterLeave.child = child; event.u.enterLeave.flags = event.u.keyButtonPointer.sameScreen ? @@ -3406,18 +3422,26 @@ EnterLeaveEvent( } static void -EnterNotifies(WindowPtr ancestor, WindowPtr child, int mode, int detail) +EnterNotifies(DeviceIntPtr pDev, + WindowPtr ancestor, + WindowPtr child, + int mode, + int detail) { WindowPtr parent = child->parent; if (ancestor == parent) return; - EnterNotifies(ancestor, parent, mode, detail); - EnterLeaveEvent(EnterNotify, mode, detail, parent, child->drawable.id); -} + EnterNotifies(pDev, ancestor, parent, mode, detail); + EnterLeaveEvent(pDev, EnterNotify, mode, detail, parent, + child->drawable.id); } static void -LeaveNotifies(WindowPtr child, WindowPtr ancestor, int mode, int detail) +LeaveNotifies(DeviceIntPtr pDev, + WindowPtr child, + WindowPtr ancestor, + int mode, + int detail) { register WindowPtr pWin; @@ -3425,36 +3449,45 @@ LeaveNotifies(WindowPtr child, WindowPtr ancestor, int mode, int detail) return; for (pWin = child->parent; pWin != ancestor; pWin = pWin->parent) { - EnterLeaveEvent(LeaveNotify, mode, detail, pWin, child->drawable.id); - child = pWin; + EnterLeaveEvent(pDev, LeaveNotify, mode, detail, pWin, + child->drawable.id); + child = pWin; } } static void -DoEnterLeaveEvents(WindowPtr fromWin, WindowPtr toWin, int mode) +DoEnterLeaveEvents(DeviceIntPtr pDev, + WindowPtr fromWin, + WindowPtr toWin, + int mode) { if (fromWin == toWin) return; if (IsParent(fromWin, toWin)) { - EnterLeaveEvent(LeaveNotify, mode, NotifyInferior, fromWin, None); - EnterNotifies(fromWin, toWin, mode, NotifyVirtual); - EnterLeaveEvent(EnterNotify, mode, NotifyAncestor, toWin, None); + EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyInferior, fromWin, + None); + EnterNotifies(pDev, fromWin, toWin, mode, + NotifyVirtual); + EnterLeaveEvent(pDev, EnterNotify, mode, NotifyAncestor, toWin, None); } else if (IsParent(toWin, fromWin)) { - EnterLeaveEvent(LeaveNotify, mode, NotifyAncestor, fromWin, None); - LeaveNotifies(fromWin, toWin, mode, NotifyVirtual); - EnterLeaveEvent(EnterNotify, mode, NotifyInferior, toWin, None); + EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyAncestor, fromWin, + None); + LeaveNotifies(pDev, fromWin, toWin, mode, NotifyVirtual); + EnterLeaveEvent(pDev, EnterNotify, mode, NotifyInferior, toWin, None); } else { /* neither fromWin nor toWin is descendent of the other */ WindowPtr common = CommonAncestor(toWin, fromWin); /* common == NullWindow ==> different screens */ - EnterLeaveEvent(LeaveNotify, mode, NotifyNonlinear, fromWin, None); - LeaveNotifies(fromWin, common, mode, NotifyNonlinearVirtual); - EnterNotifies(common, toWin, mode, NotifyNonlinearVirtual); - EnterLeaveEvent(EnterNotify, mode, NotifyNonlinear, toWin, None); + EnterLeaveEvent(pDev, LeaveNotify, mode, NotifyNonlinear, fromWin, + None); + LeaveNotifies(pDev, fromWin, common, mode, NotifyNonlinearVirtual); + EnterNotifies(pDev, common, toWin, mode, NotifyNonlinearVirtual); + EnterLeaveEvent(pDev, EnterNotify, mode, NotifyNonlinear, toWin, + None); } } diff --git a/include/dix.h b/include/dix.h index a5a570a51..0c66d8d57 100644 --- a/include/dix.h +++ b/include/dix.h @@ -525,7 +525,7 @@ extern Bool IsParent( extern WindowPtr GetCurrentRootWindow(void); -extern WindowPtr GetSpriteWindow(void); +extern WindowPtr GetSpriteWindow(DeviceIntPtr pDev); extern void NoticeEventTime(xEventPtr /* xE */); diff --git a/xkb/ddxFakeMtn.c b/xkb/ddxFakeMtn.c index 3dd733b32..7e75c1586 100644 --- a/xkb/ddxFakeMtn.c +++ b/xkb/ddxFakeMtn.c @@ -54,7 +54,7 @@ int oldX,oldY; ScreenPtr pScreen, oldScreen; GetSpritePosition(inputInfo.pointer, &oldX, &oldY); - pScreen = oldScreen = GetSpriteWindow()->drawable.pScreen; + pScreen = oldScreen = GetSpriteWindow(inputInfo.pointer)->drawable.pScreen; #ifdef PANORAMIX if (!noPanoramiXExtension) { |