diff options
author | Peter Hutterer <peter@cs.unisa.edu.au> | 2006-11-21 18:15:04 +1030 |
---|---|---|
committer | Peter Hutterer <whot@hyena.localdomain> | 2006-11-21 18:15:04 +1030 |
commit | 9db851c22d4befb95bfb074b96620261d8e32ac9 (patch) | |
tree | b12f93f7ca5f37f966cee84f92849dcda0fb6c01 | |
parent | fd8b9a6eaee28a453a00af14195b81ef1890a577 (diff) |
dix: moved sprite from static to be pointer of type SpritePtr
added SpriteRecs for MPX devices
changed sprite dependency and added MPX functionality to parts
of events.c (ConfineToShape, PostNewCursor, XineramaCheckMotion,
CheckMotion, XineramaChangeToCursor, ChangeToCursor, CheckPhysLimits,
PointerConfinedToScreen)
added DeviceIntRec param to GetSpritePosition(). This required some
minor changes in ddx, xtest, xkb and xfixes.
mi: changed miPointer to pointer instead of static struct.
-rw-r--r-- | Changelog | 24 | ||||
-rw-r--r-- | Xext/xtest.c | 2 | ||||
-rw-r--r-- | Xi/exevents.c | 6 | ||||
-rw-r--r-- | dix/events.c | 904 | ||||
-rw-r--r-- | include/cursor.h | 5 | ||||
-rw-r--r-- | mi/mieq.c | 14 | ||||
-rw-r--r-- | mi/mipointer.c | 194 | ||||
-rwxr-xr-x | xfixes/cursor.c | 4 | ||||
-rw-r--r-- | xkb/ddxDevBtn.c | 2 | ||||
-rw-r--r-- | xkb/ddxFakeBtn.c | 2 | ||||
-rw-r--r-- | xkb/ddxFakeMtn.c | 2 | ||||
-rw-r--r-- | xkb/xkbActions.c | 2 |
12 files changed, 659 insertions, 502 deletions
@@ -34,6 +34,30 @@ Files: TAG: MPX_BEFORE_DIX_API_BREAK + + +dix: moved sprite from static to be pointer of type SpritePtr + added SpriteRecs for MPX devices + changed sprite dependency and added MPX functionality to parts + of events.c (ConfineToShape, PostNewCursor, XineramaCheckMotion, + CheckMotion, XineramaChangeToCursor, ChangeToCursor, CheckPhysLimits, + PointerConfinedToScreen) + added DeviceIntRec param to GetSpritePosition(). This required some + minor changes in ddx, xtest, xkb and xfixes. + +mi: changed miPointer to pointer instead of static struct. + +Files: + dix/events.c + dix/exevents.c + Xext/xtest.c + ddx/ddxFakeBtn.c + ddx/ddxFakeMtn.c + ddx/ddxDevBtn.c + xkb/xkbActions.c + xfixes/cursor.c + mi/mieq.c + == 20.11.06 == mi: moved core pointer information from miSpriteScreenRec into a diff --git a/Xext/xtest.c b/Xext/xtest.c index 83f8b8cc6..18111c0df 100644 --- a/Xext/xtest.c +++ b/Xext/xtest.c @@ -379,7 +379,7 @@ ProcXTestFakeInput(client) if (ev->u.u.detail == xTrue) { int x, y; - GetSpritePosition(&x, &y); + GetSpritePosition(inputInfo.pointer, &x, &y); ev->u.keyButtonPointer.rootX += x; ev->u.keyButtonPointer.rootY += y; } diff --git a/Xi/exevents.c b/Xi/exevents.c index 92a5f0599..7f7e12886 100644 --- a/Xi/exevents.c +++ b/Xi/exevents.c @@ -119,13 +119,17 @@ ProcessOtherEvent(xEventPtr xE, register DeviceIntPtr other, int count) deviceValuator *xV = (deviceValuator *) xE; if (xE->u.u.type != DeviceValuator) { - GetSpritePosition(&rootX, &rootY); + GetSpritePosition(other, &rootX, &rootY); xE->u.keyButtonPointer.rootX = rootX; xE->u.keyButtonPointer.rootY = rootY; key = xE->u.u.detail; NoticeEventTime(xE); xE->u.keyButtonPointer.state = inputInfo.keyboard->key->state | +#ifdef MPX + other->button->state; +#else inputInfo.pointer->button->state; +#endif bit = 1 << (key & 7); } if (DeviceEventCallback) { diff --git a/dix/events.c b/dix/events.c index 4c33fd49e..2def70465 100644 --- a/dix/events.c +++ b/dix/events.c @@ -236,7 +236,7 @@ static WindowPtr *spriteTrace = (WindowPtr *)NULL; static int spriteTraceSize = 0; static int spriteTraceGood; -static struct { +typedef struct { CursorPtr current; BoxRec hotLimits; /* logical constraints of hot spot */ Bool confined; /* confined to screen */ @@ -254,7 +254,15 @@ static struct { WindowPtr windows[MAXSCREENS]; WindowPtr confineWin; /* confine window */ #endif -} sprite; /* info about the cursor sprite */ +} SpriteRec, *SpritePtr; + +static SpritePtr sprite; /* info about the cursor sprite */ + +#ifdef MPX +static SpritePtr mpsprites; /* info about the MPX sprites */ + +extern BOOL IsMPDev(DeviceIntPtr dev); +#endif #ifdef XEVIE _X_EXPORT WindowPtr xeviewin; @@ -326,12 +334,12 @@ static CARD8 criticalEvents[32] = }; #ifdef PANORAMIX -static void ConfineToShape(RegionPtr shape, int *px, int *py); -static void PostNewCursor(void); +static void ConfineToShape(DeviceIntPtr pDev, RegionPtr shape, int *px, int *py); +static void PostNewCursor(DeviceIntPtr pDev); #define SyntheticMotion(x, y) \ PostSyntheticMotion(x, y, noPanoramiXExtension ? 0 : \ - sprite.screen->myNum, \ + sprite->screen->myNum, \ syncEvents.playingEvents ? \ syncEvents.time.milliseconds : \ currentTime.milliseconds); @@ -350,7 +358,7 @@ XineramaSetCursorPosition( to send the message too and what the coordinates relative to that screen are. */ - pScreen = sprite.screen; + pScreen = sprite->screen; x += panoramiXdataPtr[0].x; y += panoramiXdataPtr[0].y; @@ -369,9 +377,9 @@ XineramaSetCursorPosition( } } - sprite.screen = pScreen; - sprite.hotPhys.x = x - panoramiXdataPtr[0].x; - sprite.hotPhys.y = y - panoramiXdataPtr[0].y; + sprite->screen = pScreen; + sprite->hotPhys.x = x - panoramiXdataPtr[0].x; + sprite->hotPhys.y = y - panoramiXdataPtr[0].y; x -= panoramiXdataPtr[pScreen->myNum].x; y -= panoramiXdataPtr[pScreen->myNum].y; @@ -382,8 +390,8 @@ XineramaSetCursorPosition( static void XineramaConstrainCursor(void) { - ScreenPtr pScreen = sprite.screen; - BoxRec newBox = sprite.physLimits; + ScreenPtr pScreen = sprite->screen; + BoxRec newBox = sprite->physLimits; /* Translate the constraining box to the screen the sprite is actually on */ @@ -405,27 +413,27 @@ XineramaCheckPhysLimits( if (!cursor) return; - new = sprite.hotPhys; + new = sprite->hotPhys; /* I don't care what the DDX has to say about it */ - sprite.physLimits = sprite.hotLimits; + sprite->physLimits = sprite->hotLimits; /* constrain the pointer to those limits */ - if (new.x < sprite.physLimits.x1) - new.x = sprite.physLimits.x1; + if (new.x < sprite->physLimits.x1) + new.x = sprite->physLimits.x1; else - if (new.x >= sprite.physLimits.x2) - new.x = sprite.physLimits.x2 - 1; - if (new.y < sprite.physLimits.y1) - new.y = sprite.physLimits.y1; + if (new.x >= sprite->physLimits.x2) + new.x = sprite->physLimits.x2 - 1; + if (new.y < sprite->physLimits.y1) + new.y = sprite->physLimits.y1; else - if (new.y >= sprite.physLimits.y2) - new.y = sprite.physLimits.y2 - 1; + if (new.y >= sprite->physLimits.y2) + new.y = sprite->physLimits.y2 - 1; - if (sprite.hotShape) /* more work if the shape is a mess */ - ConfineToShape(sprite.hotShape, &new.x, &new.y); + if (sprite->hotShape) /* more work if the shape is a mess */ + ConfineToShape(inputInfo.pointer, sprite->hotShape, &new.x, &new.y); - if((new.x != sprite.hotPhys.x) || (new.y != sprite.hotPhys.y)) + if((new.x != sprite->hotPhys.x) || (new.y != sprite->hotPhys.y)) { XineramaSetCursorPosition (new.x, new.y, generateEvents); if (!generateEvents) @@ -441,7 +449,7 @@ static Bool XineramaSetWindowPntrs(WindowPtr pWin) { if(pWin == WindowTable[0]) { - memcpy(sprite.windows, WindowTable, + memcpy(sprite->windows, WindowTable, PanoramiXNumScreens*sizeof(WindowPtr)); } else { PanoramiXRes *win; @@ -453,8 +461,8 @@ XineramaSetWindowPntrs(WindowPtr pWin) return FALSE; for(i = 0; i < PanoramiXNumScreens; i++) { - sprite.windows[i] = LookupIDByType(win->info[i].id, RT_WINDOW); - if(!sprite.windows[i]) /* window is being unmapped */ + sprite->windows[i] = LookupIDByType(win->info[i].id, RT_WINDOW); + if(!sprite->windows[i]) /* window is being unmapped */ return FALSE; } } @@ -469,9 +477,9 @@ XineramaCheckVirtualMotion( if (qe) { - sprite.hot.pScreen = qe->pScreen; /* should always be Screen 0 */ - sprite.hot.x = qe->event->u.keyButtonPointer.rootX; - sprite.hot.y = qe->event->u.keyButtonPointer.rootY; + sprite->hot.pScreen = qe->pScreen; /* should always be Screen 0 */ + sprite->hot.x = qe->event->u.keyButtonPointer.rootX; + sprite->hot.y = qe->event->u.keyButtonPointer.rootY; pWin = inputInfo.pointer->grab ? inputInfo.pointer->grab->confineTo : NullWindow; } @@ -485,8 +493,8 @@ XineramaCheckVirtualMotion( i = PanoramiXNumScreens - 1; - REGION_COPY(sprite.screen, &sprite.Reg2, - &sprite.windows[i]->borderSize); + REGION_COPY(sprite->screen, &sprite->Reg2, + &sprite->windows[i]->borderSize); off_x = panoramiXdataPtr[i].x; off_y = panoramiXdataPtr[i].y; @@ -495,97 +503,105 @@ XineramaCheckVirtualMotion( y = off_y - panoramiXdataPtr[i].y; if(x || y) - REGION_TRANSLATE(sprite.screen, &sprite.Reg2, x, y); + REGION_TRANSLATE(sprite->screen, &sprite->Reg2, x, y); - REGION_UNION(sprite.screen, &sprite.Reg2, &sprite.Reg2, - &sprite.windows[i]->borderSize); + REGION_UNION(sprite->screen, &sprite->Reg2, &sprite->Reg2, + &sprite->windows[i]->borderSize); off_x = panoramiXdataPtr[i].x; off_y = panoramiXdataPtr[i].y; } - lims = *REGION_EXTENTS(sprite.screen, &sprite.Reg2); + lims = *REGION_EXTENTS(sprite->screen, &sprite->Reg2); - if (sprite.hot.x < lims.x1) - sprite.hot.x = lims.x1; - else if (sprite.hot.x >= lims.x2) - sprite.hot.x = lims.x2 - 1; - if (sprite.hot.y < lims.y1) - sprite.hot.y = lims.y1; - else if (sprite.hot.y >= lims.y2) - sprite.hot.y = lims.y2 - 1; + if (sprite->hot.x < lims.x1) + sprite->hot.x = lims.x1; + else if (sprite->hot.x >= lims.x2) + sprite->hot.x = lims.x2 - 1; + if (sprite->hot.y < lims.y1) + sprite->hot.y = lims.y1; + else if (sprite->hot.y >= lims.y2) + sprite->hot.y = lims.y2 - 1; - if (REGION_NUM_RECTS(&sprite.Reg2) > 1) - ConfineToShape(&sprite.Reg2, &sprite.hot.x, &sprite.hot.y); + if (REGION_NUM_RECTS(&sprite->Reg2) > 1) + ConfineToShape(inputInfo.pointer, &sprite->Reg2, &sprite->hot.x, &sprite->hot.y); if (qe) { - qe->pScreen = sprite.hot.pScreen; - qe->event->u.keyButtonPointer.rootX = sprite.hot.x; - qe->event->u.keyButtonPointer.rootY = sprite.hot.y; + qe->pScreen = sprite->hot.pScreen; + qe->event->u.keyButtonPointer.rootX = sprite->hot.x; + qe->event->u.keyButtonPointer.rootY = sprite->hot.y; } } #ifdef XEVIE - xeviehot.x = sprite.hot.x; - xeviehot.y = sprite.hot.y; + xeviehot.x = sprite->hot.x; + xeviehot.y = sprite->hot.y; #endif } static Bool -XineramaCheckMotion(xEvent *xE) +XineramaCheckMotion(xEvent *xE, DeviceIntPtr pDev) { - WindowPtr prevSpriteWin = sprite.win; + WindowPtr prevSpriteWin; + SpritePtr pSprite = sprite; + +#ifdef MPX + if (IsMPDev(pDev)) + pSprite = &mpsprites[pDev->id]; +#endif + + prevSpriteWin = pSprite->win; if (xE && !syncEvents.playingEvents) { /* Motion events entering DIX get translated to Screen 0 coordinates. Replayed events have already been translated since they've entered DIX before */ - XE_KBPTR.rootX += panoramiXdataPtr[sprite.screen->myNum].x - + XE_KBPTR.rootX += panoramiXdataPtr[pSprite->screen->myNum].x - panoramiXdataPtr[0].x; - XE_KBPTR.rootY += panoramiXdataPtr[sprite.screen->myNum].y - + XE_KBPTR.rootY += panoramiXdataPtr[pSprite->screen->myNum].y - panoramiXdataPtr[0].y; - sprite.hot.x = XE_KBPTR.rootX; - sprite.hot.y = XE_KBPTR.rootY; - if (sprite.hot.x < sprite.physLimits.x1) - sprite.hot.x = sprite.physLimits.x1; - else if (sprite.hot.x >= sprite.physLimits.x2) - sprite.hot.x = sprite.physLimits.x2 - 1; - if (sprite.hot.y < sprite.physLimits.y1) - sprite.hot.y = sprite.physLimits.y1; - else if (sprite.hot.y >= sprite.physLimits.y2) - sprite.hot.y = sprite.physLimits.y2 - 1; - - if (sprite.hotShape) - ConfineToShape(sprite.hotShape, &sprite.hot.x, &sprite.hot.y); - - sprite.hotPhys = sprite.hot; - if ((sprite.hotPhys.x != XE_KBPTR.rootX) || - (sprite.hotPhys.y != XE_KBPTR.rootY)) + pSprite->hot.x = XE_KBPTR.rootX; + pSprite->hot.y = XE_KBPTR.rootY; + if (pSprite->hot.x < pSprite->physLimits.x1) + pSprite->hot.x = pSprite->physLimits.x1; + else if (pSprite->hot.x >= pSprite->physLimits.x2) + pSprite->hot.x = pSprite->physLimits.x2 - 1; + if (pSprite->hot.y < pSprite->physLimits.y1) + pSprite->hot.y = pSprite->physLimits.y1; + else if (pSprite->hot.y >= pSprite->physLimits.y2) + pSprite->hot.y = pSprite->physLimits.y2 - 1; + + if (pSprite->hotShape) + ConfineToShape(pDev, pSprite->hotShape, &pSprite->hot.x, &pSprite->hot.y); + + pSprite->hotPhys = pSprite->hot; + if ((pSprite->hotPhys.x != XE_KBPTR.rootX) || + (pSprite->hotPhys.y != XE_KBPTR.rootY)) { XineramaSetCursorPosition( - sprite.hotPhys.x, sprite.hotPhys.y, FALSE); + pSprite->hotPhys.x, pSprite->hotPhys.y, FALSE); } - XE_KBPTR.rootX = sprite.hot.x; - XE_KBPTR.rootY = sprite.hot.y; + XE_KBPTR.rootX = pSprite->hot.x; + XE_KBPTR.rootY = pSprite->hot.y; } #ifdef XEVIE - xeviehot.x = sprite.hot.x; - xeviehot.y = sprite.hot.y; + xeviehot.x = pSprite->hot.x; + xeviehot.y = pSprite->hot.y; xeviewin = #endif - sprite.win = XYToWindow(sprite.hot.x, sprite.hot.y); + pSprite->win = XYToWindow(pSprite->hot.x, pSprite->hot.y); - if (sprite.win != prevSpriteWin) + if (pSprite->win != prevSpriteWin) { if (prevSpriteWin != NullWindow) { if (!xE) UpdateCurrentTimeIf(); - DoEnterLeaveEvents(prevSpriteWin, sprite.win, NotifyNormal); + DoEnterLeaveEvents(prevSpriteWin, pSprite->win, NotifyNormal); } - PostNewCursor(); + PostNewCursor(pDev); return FALSE; } return TRUE; @@ -599,7 +615,7 @@ XineramaConfineCursorToWindow(WindowPtr pWin, Bool generateEvents) if (syncEvents.playingEvents) { XineramaCheckVirtualMotion((QdEventPtr)NULL, pWin); - SyntheticMotion(sprite.hot.x, sprite.hot.y); + SyntheticMotion(sprite->hot.x, sprite->hot.y); } else { @@ -610,8 +626,8 @@ XineramaConfineCursorToWindow(WindowPtr pWin, Bool generateEvents) i = PanoramiXNumScreens - 1; - REGION_COPY(sprite.screen, &sprite.Reg1, - &sprite.windows[i]->borderSize); + REGION_COPY(sprite->screen, &sprite->Reg1, + &sprite->windows[i]->borderSize); off_x = panoramiXdataPtr[i].x; off_y = panoramiXdataPtr[i].y; @@ -620,42 +636,42 @@ XineramaConfineCursorToWindow(WindowPtr pWin, Bool generateEvents) y = off_y - panoramiXdataPtr[i].y; if(x || y) - REGION_TRANSLATE(sprite.screen, &sprite.Reg1, x, y); + REGION_TRANSLATE(sprite->screen, &sprite->Reg1, x, y); - REGION_UNION(sprite.screen, &sprite.Reg1, &sprite.Reg1, - &sprite.windows[i]->borderSize); + REGION_UNION(sprite->screen, &sprite->Reg1, &sprite->Reg1, + &sprite->windows[i]->borderSize); off_x = panoramiXdataPtr[i].x; off_y = panoramiXdataPtr[i].y; } - sprite.hotLimits = *REGION_EXTENTS(sprite.screen, &sprite.Reg1); + sprite->hotLimits = *REGION_EXTENTS(sprite->screen, &sprite->Reg1); - if(REGION_NUM_RECTS(&sprite.Reg1) > 1) - sprite.hotShape = &sprite.Reg1; + if(REGION_NUM_RECTS(&sprite->Reg1) > 1) + sprite->hotShape = &sprite->Reg1; else - sprite.hotShape = NullRegion; + sprite->hotShape = NullRegion; - sprite.confined = FALSE; - sprite.confineWin = (pWin == WindowTable[0]) ? NullWindow : pWin; + sprite->confined = FALSE; + sprite->confineWin = (pWin == WindowTable[0]) ? NullWindow : pWin; - XineramaCheckPhysLimits(sprite.current, generateEvents); + XineramaCheckPhysLimits(sprite->current, generateEvents); } } static void -XineramaChangeToCursor(CursorPtr cursor) +XineramaChangeToCursor(DeviceIntPtr pDev, CursorPtr cursor) { - if (cursor != sprite.current) + if (cursor != sprite->current) { - if ((sprite.current->bits->xhot != cursor->bits->xhot) || - (sprite.current->bits->yhot != cursor->bits->yhot)) + if ((sprite->current->bits->xhot != cursor->bits->xhot) || + (sprite->current->bits->yhot != cursor->bits->yhot)) XineramaCheckPhysLimits(cursor, FALSE); - (*sprite.screen->DisplayCursor)(sprite.screen, cursor); - FreeCursor(sprite.current, (Cursor)0); - sprite.current = cursor; - sprite.current->refcnt++; + (*sprite->screen->DisplayCursor)(sprite->screen, cursor); + FreeCursor(sprite->current, (Cursor)0); + sprite->current = cursor; + sprite->current->refcnt++; } } @@ -680,15 +696,20 @@ SetCriticalEvent(int event) #ifdef SHAPE static void -ConfineToShape(RegionPtr shape, int *px, int *py) +ConfineToShape(DeviceIntPtr pDev, RegionPtr shape, int *px, int *py) { BoxRec box; int x = *px, y = *py; int incx = 1, incy = 1; + SpritePtr pSprite = sprite; +#ifdef MPX + if (IsMPDev(pDev)) + pSprite = &mpsprites[pDev->id]; +#endif - if (POINT_IN_REGION(sprite.hot.pScreen, shape, x, y, &box)) + if (POINT_IN_REGION(pSprite->hot.pScreen, shape, x, y, &box)) return; - box = *REGION_EXTENTS(sprite.hot.pScreen, shape); + box = *REGION_EXTENTS(pSprite->hot.pScreen, shape); /* this is rather crude */ do { x += incx; @@ -710,7 +731,7 @@ ConfineToShape(RegionPtr shape, int *px, int *py) else if (y < box.y1) return; /* should never get here! */ } - } while (!POINT_IN_REGION(sprite.hot.pScreen, shape, x, y, &box)); + } while (!POINT_IN_REGION(pSprite->hot.pScreen, shape, x, y, &box)); *px = x; *py = y; } @@ -718,43 +739,50 @@ ConfineToShape(RegionPtr shape, int *px, int *py) static void CheckPhysLimits( + DeviceIntPtr pDev, CursorPtr cursor, Bool generateEvents, Bool confineToScreen, ScreenPtr pScreen) { HotSpot new; + SpritePtr pSprite = sprite; + +#ifdef MPX + if (IsMPDev(pDev)) + pSprite = &mpsprites[pDev->id]; +#endif if (!cursor) return; - new = sprite.hotPhys; + new = pSprite->hotPhys; if (pScreen) new.pScreen = pScreen; else pScreen = new.pScreen; - (*pScreen->CursorLimits) (pScreen, cursor, &sprite.hotLimits, - &sprite.physLimits); - sprite.confined = confineToScreen; - (* pScreen->ConstrainCursor)(inputInfo.pointer, pScreen, &sprite.physLimits); - if (new.x < sprite.physLimits.x1) - new.x = sprite.physLimits.x1; + (*pScreen->CursorLimits) (pScreen, cursor, &pSprite->hotLimits, + &pSprite->physLimits); + pSprite->confined = confineToScreen; + (* pScreen->ConstrainCursor)(pDev, pScreen, &pSprite->physLimits); + if (new.x < pSprite->physLimits.x1) + new.x = pSprite->physLimits.x1; else - if (new.x >= sprite.physLimits.x2) - new.x = sprite.physLimits.x2 - 1; - if (new.y < sprite.physLimits.y1) - new.y = sprite.physLimits.y1; + if (new.x >= pSprite->physLimits.x2) + new.x = pSprite->physLimits.x2 - 1; + if (new.y < pSprite->physLimits.y1) + new.y = pSprite->physLimits.y1; else - if (new.y >= sprite.physLimits.y2) - new.y = sprite.physLimits.y2 - 1; + if (new.y >= pSprite->physLimits.y2) + new.y = pSprite->physLimits.y2 - 1; #ifdef SHAPE - if (sprite.hotShape) - ConfineToShape(sprite.hotShape, &new.x, &new.y); + if (pSprite->hotShape) + ConfineToShape(pDev, pSprite->hotShape, &new.x, &new.y); #endif - if ((pScreen != sprite.hotPhys.pScreen) || - (new.x != sprite.hotPhys.x) || (new.y != sprite.hotPhys.y)) + if ((pScreen != pSprite->hotPhys.pScreen) || + (new.x != pSprite->hotPhys.x) || (new.y != pSprite->hotPhys.y)) { - if (pScreen != sprite.hotPhys.pScreen) - sprite.hotPhys = new; + if (pScreen != pSprite->hotPhys.pScreen) + pSprite->hotPhys = new; (*pScreen->SetCursorPosition) (pScreen, new.x, new.y, generateEvents); if (!generateEvents) SyntheticMotion(new.x, new.y); @@ -774,9 +802,9 @@ CheckVirtualMotion( #endif if (qe) { - sprite.hot.pScreen = qe->pScreen; - sprite.hot.x = qe->event->u.keyButtonPointer.rootX; - sprite.hot.y = qe->event->u.keyButtonPointer.rootY; + sprite->hot.pScreen = qe->pScreen; + sprite->hot.x = qe->event->u.keyButtonPointer.rootX; + sprite->hot.y = qe->event->u.keyButtonPointer.rootY; pWin = inputInfo.pointer->grab ? inputInfo.pointer->grab->confineTo : NullWindow; } @@ -784,36 +812,36 @@ CheckVirtualMotion( { BoxRec lims; - if (sprite.hot.pScreen != pWin->drawable.pScreen) + if (sprite->hot.pScreen != pWin->drawable.pScreen) { - sprite.hot.pScreen = pWin->drawable.pScreen; - sprite.hot.x = sprite.hot.y = 0; + sprite->hot.pScreen = pWin->drawable.pScreen; + sprite->hot.x = sprite->hot.y = 0; } lims = *REGION_EXTENTS(pWin->drawable.pScreen, &pWin->borderSize); - if (sprite.hot.x < lims.x1) - sprite.hot.x = lims.x1; - else if (sprite.hot.x >= lims.x2) - sprite.hot.x = lims.x2 - 1; - if (sprite.hot.y < lims.y1) - sprite.hot.y = lims.y1; - else if (sprite.hot.y >= lims.y2) - sprite.hot.y = lims.y2 - 1; + if (sprite->hot.x < lims.x1) + sprite->hot.x = lims.x1; + else if (sprite->hot.x >= lims.x2) + sprite->hot.x = lims.x2 - 1; + if (sprite->hot.y < lims.y1) + sprite->hot.y = lims.y1; + else if (sprite->hot.y >= lims.y2) + sprite->hot.y = lims.y2 - 1; #ifdef SHAPE if (wBoundingShape(pWin)) - ConfineToShape(&pWin->borderSize, &sprite.hot.x, &sprite.hot.y); + ConfineToShape(inputInfo.pointer, &pWin->borderSize, &sprite->hot.x, &sprite->hot.y); #endif if (qe) { - qe->pScreen = sprite.hot.pScreen; - qe->event->u.keyButtonPointer.rootX = sprite.hot.x; - qe->event->u.keyButtonPointer.rootY = sprite.hot.y; + qe->pScreen = sprite->hot.pScreen; + qe->event->u.keyButtonPointer.rootX = sprite->hot.x; + qe->event->u.keyButtonPointer.rootY = sprite->hot.y; } } #ifdef XEVIE - xeviehot.x = sprite.hot.x; - xeviehot.y = sprite.hot.y; + xeviehot.x = sprite->hot.x; + xeviehot.y = sprite->hot.y; #endif - ROOT = WindowTable[sprite.hot.pScreen->myNum]; + ROOT = WindowTable[sprite->hot.pScreen->myNum]; } static void @@ -831,47 +859,59 @@ ConfineCursorToWindow(WindowPtr pWin, Bool generateEvents, Bool confineToScreen) if (syncEvents.playingEvents) { CheckVirtualMotion((QdEventPtr)NULL, pWin); - SyntheticMotion(sprite.hot.x, sprite.hot.y); + SyntheticMotion(sprite->hot.x, sprite->hot.y); } else { - sprite.hotLimits = *REGION_EXTENTS( pScreen, &pWin->borderSize); + sprite->hotLimits = *REGION_EXTENTS( pScreen, &pWin->borderSize); #ifdef SHAPE - sprite.hotShape = wBoundingShape(pWin) ? &pWin->borderSize + sprite->hotShape = wBoundingShape(pWin) ? &pWin->borderSize : NullRegion; #endif - CheckPhysLimits(sprite.current, generateEvents, confineToScreen, - pScreen); + CheckPhysLimits(inputInfo.pointer, sprite->current, generateEvents, + confineToScreen, pScreen); } } _X_EXPORT Bool -PointerConfinedToScreen() +PointerConfinedToScreen(DeviceIntPtr pDev) { - return sprite.confined; + SpritePtr pSprite = sprite; +#ifdef MPX + if (IsMPDev(pDev)) + pSprite = &mpsprites[pDev->id]; +#endif + return pSprite->confined; } static void -ChangeToCursor(CursorPtr cursor) +ChangeToCursor(DeviceIntPtr pDev, CursorPtr cursor) { + SpritePtr pSprite = sprite; + +#ifdef MPX + if (IsMPDev(pDev)) + pSprite = &mpsprites[pDev->id]; +#endif + #ifdef PANORAMIX if(!noPanoramiXExtension) { - XineramaChangeToCursor(cursor); + XineramaChangeToCursor(pDev, cursor); return; } #endif - if (cursor != sprite.current) + if (cursor != pSprite->current) { - if ((sprite.current->bits->xhot != cursor->bits->xhot) || - (sprite.current->bits->yhot != cursor->bits->yhot)) - CheckPhysLimits(cursor, FALSE, sprite.confined, + if ((pSprite->current->bits->xhot != cursor->bits->xhot) || + (pSprite->current->bits->yhot != cursor->bits->yhot)) + CheckPhysLimits(pDev, cursor, FALSE, pSprite->confined, (ScreenPtr)NULL); - (*sprite.hotPhys.pScreen->DisplayCursor) (sprite.hotPhys.pScreen, + (*sprite->hotPhys.pScreen->DisplayCursor) (pSprite->hotPhys.pScreen, cursor); - FreeCursor(sprite.current, (Cursor)0); - sprite.current = cursor; - sprite.current->refcnt++; + FreeCursor(pSprite->current, (Cursor)0); + pSprite->current = cursor; + pSprite->current->refcnt++; } } @@ -885,10 +925,17 @@ IsParent(register WindowPtr a, register WindowPtr b) } static void -PostNewCursor(void) +PostNewCursor(DeviceIntPtr pDev) { register WindowPtr win; - register GrabPtr grab = inputInfo.pointer->grab; + register GrabPtr grab = pDev->grab; + SpritePtr pSprite = sprite; + +#ifdef MPX + if (IsMPDev(pDev)) + pSprite = &mpsprites[pDev->id]; +#endif + if (syncEvents.playingEvents) return; @@ -896,20 +943,20 @@ PostNewCursor(void) { if (grab->cursor) { - ChangeToCursor(grab->cursor); + ChangeToCursor(pDev, grab->cursor); return; } - if (IsParent(grab->window, sprite.win)) - win = sprite.win; + if (IsParent(grab->window, pSprite->win)) + win = pSprite->win; else win = grab->window; } else - win = sprite.win; + win = pSprite->win; for (; win; win = win->parent) if (win->optional && win->optional->cursor != NullCursor) { - ChangeToCursor(win->optional->cursor); + ChangeToCursor(pDev, win->optional->cursor); return; } } @@ -923,20 +970,25 @@ GetCurrentRootWindow() _X_EXPORT WindowPtr GetSpriteWindow() { - return sprite.win; + return sprite->win; } _X_EXPORT CursorPtr GetSpriteCursor() { - return sprite.current; + return sprite->current; } _X_EXPORT void -GetSpritePosition(int *px, int *py) +GetSpritePosition(DeviceIntPtr pDev, int *px, int *py) { - *px = sprite.hotPhys.x; - *py = sprite.hotPhys.y; + SpritePtr pSprite = sprite; +#ifdef MPX + if (IsMPDev(pDev)) + pSprite = &mpsprites[pDev->id]; +#endif + *px = pSprite->hotPhys.x; + *py = pSprite->hotPhys.y; } #ifdef PANORAMIX @@ -944,7 +996,7 @@ _X_EXPORT int XineramaGetCursorScreen() { if(!noPanoramiXExtension) { - return sprite.screen->myNum; + return sprite->screen->myNum; } else { return 0; } @@ -1013,7 +1065,7 @@ EnqueueEvent(xEvent *xE, DeviceIntPtr device, int count) */ if (xE->u.u.type == MotionNotify) XE_KBPTR.root = - WindowTable[sprite.hotPhys.pScreen->myNum]->drawable.id; + WindowTable[sprite->hotPhys.pScreen->myNum]->drawable.id; eventinfo.events = xE; eventinfo.count = count; CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo); @@ -1022,21 +1074,21 @@ EnqueueEvent(xEvent *xE, DeviceIntPtr device, int count) { #ifdef PANORAMIX if(!noPanoramiXExtension) { - XE_KBPTR.rootX += panoramiXdataPtr[sprite.screen->myNum].x - + XE_KBPTR.rootX += panoramiXdataPtr[sprite->screen->myNum].x - panoramiXdataPtr[0].x; - XE_KBPTR.rootY += panoramiXdataPtr[sprite.screen->myNum].y - + XE_KBPTR.rootY += panoramiXdataPtr[sprite->screen->myNum].y - panoramiXdataPtr[0].y; } #endif - sprite.hotPhys.x = XE_KBPTR.rootX; - sprite.hotPhys.y = XE_KBPTR.rootY; + sprite->hotPhys.x = XE_KBPTR.rootX; + sprite->hotPhys.y = XE_KBPTR.rootY; /* do motion compression */ if (tail && (tail->event->u.u.type == MotionNotify) && - (tail->pScreen == sprite.hotPhys.pScreen)) + (tail->pScreen == sprite->hotPhys.pScreen)) { - tail->event->u.keyButtonPointer.rootX = sprite.hotPhys.x; - tail->event->u.keyButtonPointer.rootY = sprite.hotPhys.y; + tail->event->u.keyButtonPointer.rootX = sprite->hotPhys.x; + tail->event->u.keyButtonPointer.rootY = sprite->hotPhys.y; tail->event->u.keyButtonPointer.time = XE_KBPTR.time; tail->months = currentTime.months; return; @@ -1047,7 +1099,7 @@ EnqueueEvent(xEvent *xE, DeviceIntPtr device, int count) return; qe->next = (QdEventPtr)NULL; qe->device = device; - qe->pScreen = sprite.hotPhys.pScreen; + qe->pScreen = sprite->hotPhys.pScreen; qe->months = currentTime.months; qe->event = (xEvent *)(qe + 1); qe->evcount = count; @@ -1083,10 +1135,10 @@ PlayReleasedEvents(void) if(!noPanoramiXExtension) { qe->event->u.keyButtonPointer.rootX += panoramiXdataPtr[0].x - - panoramiXdataPtr[sprite.screen->myNum].x; + panoramiXdataPtr[sprite->screen->myNum].x; qe->event->u.keyButtonPointer.rootY += panoramiXdataPtr[0].y - - panoramiXdataPtr[sprite.screen->myNum].y; + panoramiXdataPtr[sprite->screen->myNum].y; } #endif (*qe->device->public.processInputProc)(qe->event, qe->device, @@ -1171,14 +1223,14 @@ playmore: /* the following may have been skipped during replay, so do it now */ if ((grab = inputInfo.pointer->grab) && grab->confineTo) { - if (grab->confineTo->drawable.pScreen != sprite.hotPhys.pScreen) - sprite.hotPhys.x = sprite.hotPhys.y = 0; + if (grab->confineTo->drawable.pScreen != sprite->hotPhys.pScreen) + sprite->hotPhys.x = sprite->hotPhys.y = 0; ConfineCursorToWindow(grab->confineTo, TRUE, TRUE); } else - ConfineCursorToWindow(WindowTable[sprite.hotPhys.pScreen->myNum], + ConfineCursorToWindow(WindowTable[sprite->hotPhys.pScreen->myNum], TRUE, FALSE); - PostNewCursor(); + PostNewCursor(inputInfo.pointer); } #ifdef RANDR @@ -1189,12 +1241,12 @@ ScreenRestructured (ScreenPtr pScreen) if ((grab = inputInfo.pointer->grab) && grab->confineTo) { - if (grab->confineTo->drawable.pScreen != sprite.hotPhys.pScreen) - sprite.hotPhys.x = sprite.hotPhys.y = 0; + if (grab->confineTo->drawable.pScreen != sprite->hotPhys.pScreen) + sprite->hotPhys.x = sprite->hotPhys.y = 0; ConfineCursorToWindow(grab->confineTo, TRUE, TRUE); } else - ConfineCursorToWindow(WindowTable[sprite.hotPhys.pScreen->myNum], + ConfineCursorToWindow(WindowTable[sprite->hotPhys.pScreen->myNum], TRUE, FALSE); } #endif @@ -1238,12 +1290,12 @@ ActivatePointerGrab(register DeviceIntPtr mouse, register GrabPtr grab, TimeStamp time, Bool autoGrab) { WindowPtr oldWin = (mouse->grab) ? mouse->grab->window - : sprite.win; + : sprite->win; if (grab->confineTo) { - if (grab->confineTo->drawable.pScreen != sprite.hotPhys.pScreen) - sprite.hotPhys.x = sprite.hotPhys.y = 0; + if (grab->confineTo->drawable.pScreen != sprite->hotPhys.pScreen) + sprite->hotPhys.x = sprite->hotPhys.y = 0; ConfineCursorToWindow(grab->confineTo, FALSE, TRUE); } DoEnterLeaveEvents(oldWin, grab->window, NotifyGrab); @@ -1257,7 +1309,7 @@ ActivatePointerGrab(register DeviceIntPtr mouse, register GrabPtr grab, mouse->activeGrab = *grab; mouse->grab = &mouse->activeGrab; mouse->fromPassiveGrab = autoGrab; - PostNewCursor(); + PostNewCursor(inputInfo.pointer); CheckGrabForSyncs(mouse,(Bool)grab->pointerMode, (Bool)grab->keyboardMode); } @@ -1276,10 +1328,10 @@ DeactivatePointerGrab(register DeviceIntPtr mouse) if (dev->sync.other == grab) dev->sync.other = NullGrab; } - DoEnterLeaveEvents(grab->window, sprite.win, NotifyUngrab); + DoEnterLeaveEvents(grab->window, sprite->win, NotifyUngrab); if (grab->confineTo) ConfineCursorToWindow(ROOT, FALSE, FALSE); - PostNewCursor(); + PostNewCursor(inputInfo.pointer); if (grab->cursor) FreeCursor(grab->cursor, (Cursor)0); ComputeFreezes(); @@ -1295,7 +1347,7 @@ ActivateKeyboardGrab(register DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, else if (keybd->focus) oldWin = keybd->focus->win; else - oldWin = sprite.win; + oldWin = sprite->win; if (oldWin == FollowKeyboardWin) oldWin = inputInfo.keyboard->focus->win; if (keybd->valuator) @@ -1317,7 +1369,7 @@ DeactivateKeyboardGrab(register DeviceIntPtr keybd) register GrabPtr grab = keybd->grab; register DeviceIntPtr dev; register WindowPtr focusWin = keybd->focus ? keybd->focus->win - : sprite.win; + : sprite->win; if (focusWin == FollowKeyboardWin) focusWin = inputInfo.keyboard->focus->win; @@ -1782,7 +1834,7 @@ FixUpEventFromWindow( } XE_KBPTR.root = ROOT->drawable.id; XE_KBPTR.event = pWin->drawable.id; - if (sprite.hot.pScreen == pWin->drawable.pScreen) + if (sprite->hot.pScreen == pWin->drawable.pScreen) { XE_KBPTR.sameScreen = xTrue; XE_KBPTR.child = child; @@ -1916,8 +1968,8 @@ PointInBorderSize(WindowPtr pWin, int x, int y) int i; for(i = 1; i < PanoramiXNumScreens; i++) { - if(POINT_IN_REGION(sprite.screen, - &sprite.windows[i]->borderSize, + if(POINT_IN_REGION(sprite->screen, + &sprite->windows[i]->borderSize, x + panoramiXdataPtr[0].x - panoramiXdataPtr[i].x, y + panoramiXdataPtr[0].y - panoramiXdataPtr[i].y, &box)) @@ -1977,74 +2029,82 @@ XYToWindow(int x, int y) } static Bool -CheckMotion(xEvent *xE) +CheckMotion(xEvent *xE, DeviceIntPtr pDev) { - WindowPtr prevSpriteWin = sprite.win; + WindowPtr prevSpriteWin; + SpritePtr pSprite = sprite; + +#ifdef MPX + if (IsMPDev(pDev)) + pSprite = &mpsprites[pDev->id]; +#endif + + prevSpriteWin = pSprite->win; #ifdef PANORAMIX if(!noPanoramiXExtension) - return XineramaCheckMotion(xE); + return XineramaCheckMotion(xE, pDev); #endif if (xE && !syncEvents.playingEvents) { - if (sprite.hot.pScreen != sprite.hotPhys.pScreen) + if (pSprite->hot.pScreen != pSprite->hotPhys.pScreen) { - sprite.hot.pScreen = sprite.hotPhys.pScreen; - ROOT = WindowTable[sprite.hot.pScreen->myNum]; + pSprite->hot.pScreen = pSprite->hotPhys.pScreen; + ROOT = WindowTable[pSprite->hot.pScreen->myNum]; } - sprite.hot.x = XE_KBPTR.rootX; - sprite.hot.y = XE_KBPTR.rootY; - if (sprite.hot.x < sprite.physLimits.x1) - sprite.hot.x = sprite.physLimits.x1; - else if (sprite.hot.x >= sprite.physLimits.x2) - sprite.hot.x = sprite.physLimits.x2 - 1; - if (sprite.hot.y < sprite.physLimits.y1) - sprite.hot.y = sprite.physLimits.y1; - else if (sprite.hot.y >= sprite.physLimits.y2) - sprite.hot.y = sprite.physLimits.y2 - 1; + pSprite->hot.x = XE_KBPTR.rootX; + pSprite->hot.y = XE_KBPTR.rootY; + if (pSprite->hot.x < pSprite->physLimits.x1) + pSprite->hot.x = pSprite->physLimits.x1; + else if (pSprite->hot.x >= pSprite->physLimits.x2) + pSprite->hot.x = pSprite->physLimits.x2 - 1; + if (pSprite->hot.y < pSprite->physLimits.y1) + pSprite->hot.y = pSprite->physLimits.y1; + else if (pSprite->hot.y >= pSprite->physLimits.y2) + pSprite->hot.y = pSprite->physLimits.y2 - 1; #ifdef SHAPE - if (sprite.hotShape) - ConfineToShape(sprite.hotShape, &sprite.hot.x, &sprite.hot.y); + if (pSprite->hotShape) + ConfineToShape(pDev, pSprite->hotShape, &pSprite->hot.x, &pSprite->hot.y); #endif #ifdef XEVIE - xeviehot.x = sprite.hot.x; - xeviehot.y = sprite.hot.y; + xeviehot.x = pSprite->hot.x; + xeviehot.y = pSprite->hot.y; #endif - sprite.hotPhys = sprite.hot; + pSprite->hotPhys = pSprite->hot; #ifndef MPX - if ((sprite.hotPhys.x != XE_KBPTR.rootX) || - (sprite.hotPhys.y != XE_KBPTR.rootY)) + if ((pSprite->hotPhys.x != XE_KBPTR.rootX) || + (pSprite->hotPhys.y != XE_KBPTR.rootY)) { - (*sprite.hotPhys.pScreen->SetCursorPosition)( - sprite.hotPhys.pScreen, - sprite.hotPhys.x, sprite.hotPhys.y, FALSE); + (*pSprite->hotPhys.pScreen->SetCursorPosition)( + pSprite->hotPhys.pScreen, + pSprite->hotPhys.x, pSprite->hotPhys.y, FALSE); } #endif - XE_KBPTR.rootX = sprite.hot.x; - XE_KBPTR.rootY = sprite.hot.y; + XE_KBPTR.rootX = pSprite->hot.x; + XE_KBPTR.rootY = pSprite->hot.y; } #ifdef XEVIE xeviewin = #endif - sprite.win = XYToWindow(sprite.hot.x, sprite.hot.y); + pSprite->win = XYToWindow(pSprite->hot.x, pSprite->hot.y); #ifdef notyet - if (!(sprite.win->deliverableEvents & + if (!(pSprite->win->deliverableEvents & Motion_Filter(inputInfo.pointer->button)) !syncEvents.playingEvents) { /* XXX Do PointerNonInterestBox here */ } #endif - if (sprite.win != prevSpriteWin) + if (pSprite->win != prevSpriteWin) { if (prevSpriteWin != NullWindow) { if (!xE) UpdateCurrentTimeIf(); - DoEnterLeaveEvents(prevSpriteWin, sprite.win, NotifyNormal); + DoEnterLeaveEvents(prevSpriteWin, pSprite->win, NotifyNormal); } - PostNewCursor(); + PostNewCursor(pDev); return FALSE; } return TRUE; @@ -2053,7 +2113,7 @@ CheckMotion(xEvent *xE) _X_EXPORT void WindowsRestructured() { - (void) CheckMotion((xEvent *)NULL); + (void) CheckMotion((xEvent *)NULL, inputInfo.pointer); } #ifdef PANORAMIX @@ -2068,29 +2128,29 @@ void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff) if (noPanoramiXExtension) return; - sprite.hot.x -= xoff; - sprite.hot.y -= yoff; + sprite->hot.x -= xoff; + sprite->hot.y -= yoff; - sprite.hotPhys.x -= xoff; - sprite.hotPhys.y -= yoff; + sprite->hotPhys.x -= xoff; + sprite->hotPhys.y -= yoff; - sprite.hotLimits.x1 -= xoff; - sprite.hotLimits.y1 -= yoff; - sprite.hotLimits.x2 -= xoff; - sprite.hotLimits.y2 -= yoff; + sprite->hotLimits.x1 -= xoff; + sprite->hotLimits.y1 -= yoff; + sprite->hotLimits.x2 -= xoff; + sprite->hotLimits.y2 -= yoff; - if (REGION_NOTEMPTY(sprite.screen, &sprite.Reg1)) - REGION_TRANSLATE(sprite.screen, &sprite.Reg1, xoff, yoff); - if (REGION_NOTEMPTY(sprite.screen, &sprite.Reg2)) - REGION_TRANSLATE(sprite.screen, &sprite.Reg2, xoff, yoff); + if (REGION_NOTEMPTY(sprite->screen, &sprite->Reg1)) + REGION_TRANSLATE(sprite->screen, &sprite->Reg1, xoff, yoff); + if (REGION_NOTEMPTY(sprite->screen, &sprite->Reg2)) + REGION_TRANSLATE(sprite->screen, &sprite->Reg2, xoff, yoff); /* FIXME: if we call ConfineCursorToWindow, must we do anything else? */ if ((grab = inputInfo.pointer->grab) && grab->confineTo) { - if (grab->confineTo->drawable.pScreen != sprite.hotPhys.pScreen) - sprite.hotPhys.x = sprite.hotPhys.y = 0; + if (grab->confineTo->drawable.pScreen != sprite->hotPhys.pScreen) + sprite->hotPhys.x = sprite->hotPhys.y = 0; ConfineCursorToWindow(grab->confineTo, TRUE, TRUE); } else - ConfineCursorToWindow(WindowTable[sprite.hotPhys.pScreen->myNum], + ConfineCursorToWindow(WindowTable[sprite->hotPhys.pScreen->myNum], TRUE, FALSE); } #endif @@ -2099,55 +2159,72 @@ void DefineInitialRootWindow(register WindowPtr win) { register ScreenPtr pScreen = win->drawable.pScreen; + SpritePtr pSprite = sprite; +#ifdef MPX + int mpSpriteIdx = 0; + DeviceIntPtr pDev; + + + while (mpSpriteIdx < MAX_DEVICES) + { + pSprite = &mpsprites[mpSpriteIdx]; +#endif - sprite.hotPhys.pScreen = pScreen; - sprite.hotPhys.x = pScreen->width / 2; - sprite.hotPhys.y = pScreen->height / 2; - sprite.hot = sprite.hotPhys; - sprite.hotLimits.x2 = pScreen->width; - sprite.hotLimits.y2 = pScreen->height; + pSprite->hotPhys.pScreen = pScreen; + pSprite->hotPhys.x = pScreen->width / 2; + pSprite->hotPhys.y = pScreen->height / 2; + pSprite->hot = pSprite->hotPhys; + pSprite->hotLimits.x2 = pScreen->width; + pSprite->hotLimits.y2 = pScreen->height; #ifdef XEVIE - xeviewin = + xeviewin = #endif - sprite.win = win; - sprite.current = wCursor (win); - sprite.current->refcnt++; - spriteTraceGood = 1; - ROOT = win; -/* FIXME: This only limits the core pointer, not the MPX pointer */ - (*pScreen->CursorLimits) ( - pScreen, sprite.current, &sprite.hotLimits, &sprite.physLimits); - sprite.confined = FALSE; + pSprite->win = win; + pSprite->current = wCursor (win); + pSprite->current->refcnt++; + spriteTraceGood = 1; + ROOT = win; + (*pScreen->CursorLimits) ( pScreen, pSprite->current, + &pSprite->hotLimits, &pSprite->physLimits); + pSprite->confined = FALSE; + #ifdef MPX - { - DeviceIntPtr pDev = inputInfo.devices; + /* this is ugly */ + pDev = inputInfo.devices; while(pDev) { - (*pScreen->ConstrainCursor) (pDev, pScreen, &sprite.physLimits); + if (pDev->id == mpSpriteIdx) + (*pScreen->ConstrainCursor) (pDev, pScreen, &pSprite->physLimits); + pDev = pDev->next; } - } #else - (*pScreen->ConstrainCursor) (pScreen, &sprite.physLimits); + (*pScreen->ConstrainCursor) (inputInfo.pointer, pScreen, + &pSprite->physLimits); #endif - (*pScreen->SetCursorPosition) (pScreen, sprite.hot.x, sprite.hot.y, FALSE); - (*pScreen->DisplayCursor) (pScreen, sprite.current); + (*pScreen->SetCursorPosition) (pScreen, pSprite->hot.x, pSprite->hot.y, + FALSE); + (*pScreen->DisplayCursor) (pScreen, pSprite->current); #ifdef PANORAMIX - if(!noPanoramiXExtension) { - sprite.hotLimits.x1 = -panoramiXdataPtr[0].x; - sprite.hotLimits.y1 = -panoramiXdataPtr[0].y; - sprite.hotLimits.x2 = PanoramiXPixWidth - panoramiXdataPtr[0].x; - sprite.hotLimits.y2 = PanoramiXPixHeight - panoramiXdataPtr[0].y; - sprite.physLimits = sprite.hotLimits; - sprite.confineWin = NullWindow; + if(!noPanoramiXExtension) { + pSprite->hotLimits.x1 = -panoramiXdataPtr[0].x; + pSprite->hotLimits.y1 = -panoramiXdataPtr[0].y; + pSprite->hotLimits.x2 = PanoramiXPixWidth - panoramiXdataPtr[0].x; + pSprite->hotLimits.y2 = PanoramiXPixHeight - panoramiXdataPtr[0].y; + pSprite->physLimits = pSprite->hotLimits; + pSprite->confineWin = NullWindow; #ifdef SHAPE - sprite.hotShape = NullRegion; + pSprite->hotShape = NullRegion; #endif - sprite.screen = pScreen; - /* gotta UNINIT these someplace */ - REGION_NULL(pScreen, &sprite.Reg1); - REGION_NULL(pScreen, &sprite.Reg2); + pSprite->screen = pScreen; + /* gotta UNINIT these someplace */ + REGION_NULL(pScreen, &pSprite->Reg1); + REGION_NULL(pScreen, &pSprite->Reg2); + } +#endif +#ifdef MPX + mpSpriteIdx++; } #endif } @@ -2162,39 +2239,39 @@ DefineInitialRootWindow(register WindowPtr win) void WindowHasNewCursor(WindowPtr pWin) { - PostNewCursor(); + PostNewCursor(inputInfo.pointer); } _X_EXPORT void NewCurrentScreen(ScreenPtr newScreen, int x, int y) { - sprite.hotPhys.x = x; - sprite.hotPhys.y = y; + sprite->hotPhys.x = x; + sprite->hotPhys.y = y; #ifdef PANORAMIX if(!noPanoramiXExtension) { - sprite.hotPhys.x += panoramiXdataPtr[newScreen->myNum].x - + sprite->hotPhys.x += panoramiXdataPtr[newScreen->myNum].x - panoramiXdataPtr[0].x; - sprite.hotPhys.y += panoramiXdataPtr[newScreen->myNum].y - + sprite->hotPhys.y += panoramiXdataPtr[newScreen->myNum].y - panoramiXdataPtr[0].y; - if (newScreen != sprite.screen) { - sprite.screen = newScreen; + if (newScreen != sprite->screen) { + sprite->screen = newScreen; /* Make sure we tell the DDX to update its copy of the screen */ - if(sprite.confineWin) - XineramaConfineCursorToWindow(sprite.confineWin, TRUE); + if(sprite->confineWin) + XineramaConfineCursorToWindow(sprite->confineWin, TRUE); else XineramaConfineCursorToWindow(WindowTable[0], TRUE); /* if the pointer wasn't confined, the DDX won't get told of the pointer warp so we reposition it here */ if(!syncEvents.playingEvents) - (*sprite.screen->SetCursorPosition)(sprite.screen, - sprite.hotPhys.x + panoramiXdataPtr[0].x - - panoramiXdataPtr[sprite.screen->myNum].x, - sprite.hotPhys.y + panoramiXdataPtr[0].y - - panoramiXdataPtr[sprite.screen->myNum].y, FALSE); + (*sprite->screen->SetCursorPosition)(sprite->screen, + sprite->hotPhys.x + panoramiXdataPtr[0].x - + panoramiXdataPtr[sprite->screen->myNum].x, + sprite->hotPhys.y + panoramiXdataPtr[0].y - + panoramiXdataPtr[sprite->screen->myNum].y, FALSE); } } else #endif - if (newScreen != sprite.hotPhys.pScreen) + if (newScreen != sprite->hotPhys.pScreen) ConfineCursorToWindow(WindowTable[newScreen->myNum], TRUE, FALSE); } @@ -2222,7 +2299,7 @@ XineramaPointInWindowIsVisible( yoff = y + panoramiXdataPtr[0].y; for(i = 1; i < PanoramiXNumScreens; i++) { - pWin = sprite.windows[i]; + pWin = sprite->windows[i]; pScreen = pWin->drawable.pScreen; x = xoff - panoramiXdataPtr[i].x; y = yoff - panoramiXdataPtr[i].y; @@ -2255,8 +2332,8 @@ XineramaWarpPointer(ClientPtr client) if (!dest) return BadWindow; } - x = sprite.hotPhys.x; - y = sprite.hotPhys.y; + x = sprite->hotPhys.x; + y = sprite->hotPhys.y; if (stuff->srcWid != None) { @@ -2294,16 +2371,16 @@ XineramaWarpPointer(ClientPtr client) x += stuff->dstX; y += stuff->dstY; - if (x < sprite.physLimits.x1) - x = sprite.physLimits.x1; - else if (x >= sprite.physLimits.x2) - x = sprite.physLimits.x2 - 1; - if (y < sprite.physLimits.y1) - y = sprite.physLimits.y1; - else if (y >= sprite.physLimits.y2) - y = sprite.physLimits.y2 - 1; - if (sprite.hotShape) - ConfineToShape(sprite.hotShape, &x, &y); + if (x < sprite->physLimits.x1) + x = sprite->physLimits.x1; + else if (x >= sprite->physLimits.x2) + x = sprite->physLimits.x2 - 1; + if (y < sprite->physLimits.y1) + y = sprite->physLimits.y1; + else if (y >= sprite->physLimits.y2) + y = sprite->physLimits.y2 - 1; + if (sprite->hotShape) + ConfineToShape(inputInfo.pointer, sprite->hotShape, &x, &y); XineramaSetCursorPosition(x, y, TRUE); @@ -2335,8 +2412,8 @@ ProcWarpPointer(ClientPtr client) if (!dest) return BadWindow; } - x = sprite.hotPhys.x; - y = sprite.hotPhys.y; + x = sprite->hotPhys.x; + y = sprite->hotPhys.y; if (stuff->srcWid != None) { @@ -2349,7 +2426,7 @@ ProcWarpPointer(ClientPtr client) winX = source->drawable.x; winY = source->drawable.y; - if (source->drawable.pScreen != sprite.hotPhys.pScreen || + if (source->drawable.pScreen != sprite->hotPhys.pScreen || x < winX + stuff->srcX || y < winY + stuff->srcY || (stuff->srcWidth != 0 && @@ -2365,7 +2442,7 @@ ProcWarpPointer(ClientPtr client) y = dest->drawable.y; newScreen = dest->drawable.pScreen; } else - newScreen = sprite.hotPhys.pScreen; + newScreen = sprite->hotPhys.pScreen; x += stuff->dstX; y += stuff->dstY; @@ -2379,23 +2456,23 @@ ProcWarpPointer(ClientPtr client) else if (y >= newScreen->height) y = newScreen->height - 1; - if (newScreen == sprite.hotPhys.pScreen) + if (newScreen == sprite->hotPhys.pScreen) { - if (x < sprite.physLimits.x1) - x = sprite.physLimits.x1; - else if (x >= sprite.physLimits.x2) - x = sprite.physLimits.x2 - 1; - if (y < sprite.physLimits.y1) - y = sprite.physLimits.y1; - else if (y >= sprite.physLimits.y2) - y = sprite.physLimits.y2 - 1; + if (x < sprite->physLimits.x1) + x = sprite->physLimits.x1; + else if (x >= sprite->physLimits.x2) + x = sprite->physLimits.x2 - 1; + if (y < sprite->physLimits.y1) + y = sprite->physLimits.y1; + else if (y >= sprite->physLimits.y2) + y = sprite->physLimits.y2 - 1; #if defined(SHAPE) - if (sprite.hotShape) - ConfineToShape(sprite.hotShape, &x, &y); + if (sprite->hotShape) + ConfineToShape(inputInfo.pointer, sprite->hotShape, &x, &y); #endif (*newScreen->SetCursorPosition)(newScreen, x, y, TRUE); } - else if (!PointerConfinedToScreen()) + else if (!PointerConfinedToScreen(inputInfo.pointer)) { NewCurrentScreen(newScreen, x, y); } @@ -2405,7 +2482,7 @@ ProcWarpPointer(ClientPtr client) static Bool BorderSizeNotEmpty(WindowPtr pWin) { - if(REGION_NOTEMPTY(sprite.hotPhys.pScreen, &pWin->borderSize)) + if(REGION_NOTEMPTY(sprite->hotPhys.pScreen, &pWin->borderSize)) return TRUE; #ifdef PANORAMIX @@ -2413,7 +2490,7 @@ BorderSizeNotEmpty(WindowPtr pWin) int i; for(i = 1; i < PanoramiXNumScreens; i++) { - if(REGION_NOTEMPTY(sprite.screen, &sprite.windows[i]->borderSize)) + if(REGION_NOTEMPTY(sprite->screen, &sprite->windows[i]->borderSize)) return TRUE; } } @@ -2624,10 +2701,10 @@ DeliverGrabbedEvent(register xEvent *xE, register DeviceIntPtr thisDev, else focus = PointerRootWin; if (focus == PointerRootWin) - deliveries = DeliverDeviceEvents(sprite.win, xE, grab, NullWindow, + deliveries = DeliverDeviceEvents(sprite->win, xE, grab, NullWindow, thisDev, count); - else if (focus && (focus == sprite.win || IsParent(focus, sprite.win))) - deliveries = DeliverDeviceEvents(sprite.win, xE, grab, focus, + else if (focus && (focus == sprite->win || IsParent(focus, sprite->win))) + deliveries = DeliverDeviceEvents(sprite->win, xE, grab, focus, thisDev, count); else if (focus) deliveries = DeliverDeviceEvents(focus, xE, grab, focus, @@ -2760,8 +2837,8 @@ drawable.id:0; ))) #endif XE_KBPTR.state = (keyc->state | inputInfo.pointer->button->state); - XE_KBPTR.rootX = sprite.hot.x; - XE_KBPTR.rootY = sprite.hot.y; + XE_KBPTR.rootX = sprite->hot.x; + XE_KBPTR.rootY = sprite->hot.y; key = xE->u.u.detail; kptr = &keyc->down[key >> 3]; bit = 1 << (key & 7); @@ -2837,7 +2914,7 @@ drawable.id:0; if (grab) DeliverGrabbedEvent(xE, keybd, deactivateGrab, count); else - DeliverFocusedEvent(keybd, xE, sprite.win, count); + DeliverFocusedEvent(keybd, xE, sprite->win, count); if (deactivateGrab) (*keybd->DeactivateGrab)(keybd); @@ -2891,6 +2968,13 @@ ProcessPointerEvent (register xEvent *xE, register DeviceIntPtr mouse, int count register GrabPtr grab = mouse->grab; Bool deactivateGrab = FALSE; register ButtonClassPtr butc = mouse->button; + SpritePtr pSprite = sprite; + +#ifdef MPX + if (IsMPDev(mouse)) + pSprite = &mpsprites[mouse->id]; +#endif + #ifdef XKB XkbSrvInfoPtr xkbi= inputInfo.keyboard->key->xkbInfo; #endif @@ -2926,7 +3010,7 @@ ProcessPointerEvent (register xEvent *xE, register DeviceIntPtr mouse, int count /* see comment in EnqueueEvents regarding the next three lines */ if (xE->u.u.type == MotionNotify) XE_KBPTR.root = - WindowTable[sprite.hotPhys.pScreen->myNum]->drawable.id; + WindowTable[pSprite->hotPhys.pScreen->myNum]->drawable.id; eventinfo.events = xE; eventinfo.count = count; CallCallbacks(&DeviceEventCallback, (pointer)&eventinfo); @@ -2938,8 +3022,8 @@ ProcessPointerEvent (register xEvent *xE, register DeviceIntPtr mouse, int count register BYTE *kptr; int bit; - XE_KBPTR.rootX = sprite.hot.x; - XE_KBPTR.rootY = sprite.hot.y; + XE_KBPTR.rootX = pSprite->hot.x; + XE_KBPTR.rootY = pSprite->hot.y; key = xE->u.u.detail; kptr = &butc->down[key >> 3]; @@ -2980,12 +3064,12 @@ ProcessPointerEvent (register xEvent *xE, register DeviceIntPtr mouse, int count FatalError("bogus pointer event from ddx"); } } - else if (!CheckMotion(xE)) + else if (!CheckMotion(xE, mouse)) return; if (grab) DeliverGrabbedEvent(xE, mouse, deactivateGrab, count); else - DeliverDeviceEvents(sprite.win, xE, NullGrab, NullWindow, + DeliverDeviceEvents(pSprite->win, xE, NullGrab, NullWindow, mouse, count); if (deactivateGrab) (*mouse->DeactivateGrab)(mouse); @@ -3235,8 +3319,8 @@ EnterLeaveEvent( event.u.u.type = type; event.u.u.detail = detail; event.u.enterLeave.time = currentTime.milliseconds; - event.u.enterLeave.rootX = sprite.hot.x; - event.u.enterLeave.rootY = sprite.hot.y; + 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); /* Enter/Leave events always set child */ @@ -3441,7 +3525,7 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode) if ((fromWin == NullWindow) || (fromWin == PointerRootWin)) { if (fromWin == PointerRootWin) - FocusOutEvents(dev, sprite.win, ROOT, mode, NotifyPointer, + FocusOutEvents(dev, sprite->win, ROOT, mode, NotifyPointer, TRUE); /* Notify all the roots */ #ifdef PANORAMIX @@ -3454,8 +3538,8 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode) } else { - if (IsParent(fromWin, sprite.win)) - FocusOutEvents(dev, sprite.win, fromWin, mode, NotifyPointer, + if (IsParent(fromWin, sprite->win)) + FocusOutEvents(dev, sprite->win, fromWin, mode, NotifyPointer, FALSE); FocusEvent(dev, FocusOut, mode, NotifyNonlinear, fromWin); /* next call catches the root too, if the screen changed */ @@ -3471,7 +3555,7 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode) for (i=0; i<screenInfo.numScreens; i++) FocusEvent(dev, FocusIn, mode, in, WindowTable[i]); if (toWin == PointerRootWin) - (void)FocusInEvents(dev, ROOT, sprite.win, NullWindow, mode, + (void)FocusInEvents(dev, ROOT, sprite->win, NullWindow, mode, NotifyPointer, TRUE); } else @@ -3479,7 +3563,7 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode) if ((fromWin == NullWindow) || (fromWin == PointerRootWin)) { if (fromWin == PointerRootWin) - FocusOutEvents(dev, sprite.win, ROOT, mode, NotifyPointer, + FocusOutEvents(dev, sprite->win, ROOT, mode, NotifyPointer, TRUE); #ifdef PANORAMIX if ( !noPanoramiXExtension ) @@ -3492,8 +3576,8 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode) (void)FocusInEvents(dev, ROOT, toWin, toWin, mode, NotifyNonlinearVirtual, TRUE); FocusEvent(dev, FocusIn, mode, NotifyNonlinear, toWin); - if (IsParent(toWin, sprite.win)) - (void)FocusInEvents(dev, toWin, sprite.win, NullWindow, mode, + if (IsParent(toWin, sprite->win)) + (void)FocusInEvents(dev, toWin, sprite->win, NullWindow, mode, NotifyPointer, FALSE); } else @@ -3504,21 +3588,21 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode) FocusOutEvents(dev, fromWin->parent, toWin, mode, NotifyVirtual, FALSE); FocusEvent(dev, FocusIn, mode, NotifyInferior, toWin); - if ((IsParent(toWin, sprite.win)) && - (sprite.win != fromWin) && - (!IsParent(fromWin, sprite.win)) && - (!IsParent(sprite.win, fromWin))) - (void)FocusInEvents(dev, toWin, sprite.win, NullWindow, + if ((IsParent(toWin, sprite->win)) && + (sprite->win != fromWin) && + (!IsParent(fromWin, sprite->win)) && + (!IsParent(sprite->win, fromWin))) + (void)FocusInEvents(dev, toWin, sprite->win, NullWindow, mode, NotifyPointer, FALSE); } else if (IsParent(fromWin, toWin)) { - if ((IsParent(fromWin, sprite.win)) && - (sprite.win != fromWin) && - (!IsParent(toWin, sprite.win)) && - (!IsParent(sprite.win, toWin))) - FocusOutEvents(dev, sprite.win, fromWin, mode, + if ((IsParent(fromWin, sprite->win)) && + (sprite->win != fromWin) && + (!IsParent(toWin, sprite->win)) && + (!IsParent(sprite->win, toWin))) + FocusOutEvents(dev, sprite->win, fromWin, mode, NotifyPointer, FALSE); FocusEvent(dev, FocusOut, mode, NotifyInferior, fromWin); (void)FocusInEvents(dev, fromWin, toWin, toWin, mode, @@ -3530,8 +3614,8 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode) /* neither fromWin or toWin is child of other */ WindowPtr common = CommonAncestor(toWin, fromWin); /* common == NullWindow ==> different screens */ - if (IsParent(fromWin, sprite.win)) - FocusOutEvents(dev, sprite.win, fromWin, mode, + if (IsParent(fromWin, sprite->win)) + FocusOutEvents(dev, sprite->win, fromWin, mode, NotifyPointer, FALSE); FocusEvent(dev, FocusOut, mode, NotifyNonlinear, fromWin); if (fromWin->parent != NullWindow) @@ -3541,8 +3625,8 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode) (void)FocusInEvents(dev, common, toWin, toWin, mode, NotifyNonlinearVirtual, FALSE); FocusEvent(dev, FocusIn, mode, NotifyNonlinear, toWin); - if (IsParent(toWin, sprite.win)) - (void)FocusInEvents(dev, toWin, sprite.win, NullWindow, + if (IsParent(toWin, sprite->win)) + (void)FocusInEvents(dev, toWin, sprite->win, NullWindow, mode, NotifyPointer, FALSE); } } @@ -3808,7 +3892,7 @@ ProcChangeActivePointerGrab(ClientPtr client) grab->cursor = newCursor; if (newCursor) newCursor->refcnt++; - PostNewCursor(); + PostNewCursor(inputInfo.pointer); if (oldCursor) FreeCursor(oldCursor, (Cursor)0); grab->eventMask = stuff->eventMask; @@ -3958,15 +4042,15 @@ ProcQueryPointer(ClientPtr client) rep.mask = mouse->button->state | inputInfo.keyboard->key->state; rep.length = 0; rep.root = (ROOT)->drawable.id; - rep.rootX = sprite.hot.x; - rep.rootY = sprite.hot.y; + rep.rootX = sprite->hot.x; + rep.rootY = sprite->hot.y; rep.child = None; - if (sprite.hot.pScreen == pWin->drawable.pScreen) + if (sprite->hot.pScreen == pWin->drawable.pScreen) { rep.sameScreen = xTrue; - rep.winX = sprite.hot.x - pWin->drawable.x; - rep.winY = sprite.hot.y - pWin->drawable.y; - for (t = sprite.win; t; t = t->parent) + rep.winX = sprite->hot.x - pWin->drawable.x; + rep.winY = sprite->hot.y - pWin->drawable.y; + for (t = sprite->win; t; t = t->parent) if (t->parent == pWin) { rep.child = t->drawable.id; @@ -4001,7 +4085,19 @@ InitEvents() { int i; - sprite.hot.pScreen = sprite.hotPhys.pScreen = (ScreenPtr)NULL; + sprite = (SpritePtr)xalloc(sizeof(SpriteRec)); + if (!sprite) + FatalError("failed to allocate sprite struct"); + +#ifdef MPX + mpsprites = (SpritePtr)xalloc(MAX_DEVICES * sizeof(SpriteRec)); + if (!mpsprites) + FatalError("failed to allocate MPX sprite structs"); + xfree(sprite); + sprite = &mpsprites[1]; +#endif + + sprite->hot.pScreen = sprite->hotPhys.pScreen = (ScreenPtr)NULL; inputInfo.numDevices = 0; inputInfo.devices = (DeviceIntPtr)NULL; inputInfo.off_devices = (DeviceIntPtr)NULL; @@ -4020,13 +4116,34 @@ InitEvents() #ifdef XEVIE xeviewin = #endif - sprite.win = NullWindow; - sprite.current = NullCursor; - sprite.hotLimits.x1 = 0; - sprite.hotLimits.y1 = 0; - sprite.hotLimits.x2 = 0; - sprite.hotLimits.y2 = 0; - sprite.confined = FALSE; + sprite->win = NullWindow; + sprite->current = NullCursor; + sprite->hotLimits.x1 = 0; + sprite->hotLimits.y1 = 0; + sprite->hotLimits.x2 = 0; + sprite->hotLimits.y2 = 0; + sprite->confined = FALSE; + +#ifdef MPX + { + int mpSpriteIdx = 0; + while(mpSpriteIdx < MAX_DEVICES) + { + SpritePtr pSprite = &mpsprites[mpSpriteIdx]; + pSprite->hot.pScreen = pSprite->hotPhys.pScreen = (ScreenPtr)NULL; + pSprite->win = NullWindow; + pSprite->current = NullCursor; + pSprite->hotLimits.x1 = 0; + pSprite->hotLimits.y1 = 0; + pSprite->hotLimits.x2 = 0; + pSprite->hotLimits.y2 = 0; + pSprite->confined = FALSE; + + mpSpriteIdx++; + } + } +#endif + syncEvents.replayDev = (DeviceIntPtr)NULL; syncEvents.replayWin = NullWindow; while (syncEvents.pending) @@ -4055,6 +4172,13 @@ CloseDownEvents(void) xfree(spriteTrace); spriteTrace = NULL; spriteTraceSize = 0; + +#ifdef MPX + /* sprite points to mpsprites[1] in MPX, don't free it separately */ + xfree(mpsprites); +#else + xfree(sprite); +#endif } int @@ -4092,7 +4216,7 @@ ProcSendEvent(ClientPtr client) } if (stuff->destination == PointerWindow) - pWin = sprite.win; + pWin = sprite->win; else if (stuff->destination == InputFocus) { WindowPtr inputFocus = inputInfo.keyboard->focus->win; @@ -4105,10 +4229,10 @@ ProcSendEvent(ClientPtr client) if (inputFocus == PointerRootWin) inputFocus = ROOT; - if (IsParent(inputFocus, sprite.win)) + if (IsParent(inputFocus, sprite->win)) { effectiveFocus = inputFocus; - pWin = sprite.win; + pWin = sprite->win; } else effectiveFocus = pWin = inputFocus; @@ -4499,12 +4623,12 @@ ProcRecolorCursor(ClientPtr client) pscr = screenInfo.screens[nscr]; #ifdef PANORAMIX if(!noPanoramiXExtension) - displayed = (pscr == sprite.screen); + displayed = (pscr == sprite->screen); else #endif - displayed = (pscr == sprite.hotPhys.pScreen); + displayed = (pscr == sprite->hotPhys.pScreen); ( *pscr->RecolorCursor)(pscr, pCursor, - (pCursor == sprite.current) && displayed); + (pCursor == sprite->current) && displayed); } return (Success); } diff --git a/include/cursor.h b/include/cursor.h index bdf4fd301..b28f8db5b 100644 --- a/include/cursor.h +++ b/include/cursor.h @@ -59,6 +59,8 @@ SOFTWARE. #define ARGB_CURSOR #endif +struct _DeviceIntRec; + typedef struct _Cursor *CursorPtr; typedef struct _CursorMetric *CursorMetricPtr; @@ -133,9 +135,10 @@ extern void NewCurrentScreen( int /*x*/, int /*y*/); -extern Bool PointerConfinedToScreen(void); +extern Bool PointerConfinedToScreen(struct _DeviceIntRec* /* pDev */); extern void GetSpritePosition( + struct _DeviceIntRec* /* pDev */, int * /*px*/, int * /*py*/); @@ -239,11 +239,9 @@ mieqProcessInputEvents() } #ifdef MPX - /* MPX devices send both core and Xi events. Depending on what - * event we have, dev is set to either the core pointer or the - * device. This gives us the right processing function but we need - * to pass the right device in too. - * Any device that is not a MP device is processed as usual. + /* MPX devices send both core and Xi events. + * Use dev to get the correct processing function but supply + * e->pDev to pass the correct device */ if (e->pDev->isMPDev) dev->public.processInputProc(e->event, e->pDev, e->nevents); @@ -252,11 +250,7 @@ mieqProcessInputEvents() dev->public.processInputProc(e->event, dev, e->nevents); } #ifdef MPX - /* - * This is inefficient as we update the sprite for each event rather - * than at the end of the event queue. But we don't know if the - * next event is from the same device, so it's better to do it here. - */ + /* Update the sprite now. Next event may be from different device. */ if (e->event[0].u.u.type == MotionNotify && (e->pDev->isMPDev || e->pDev->coreEvents)) { diff --git a/mi/mipointer.c b/mi/mipointer.c index d3f5a5471..27692234c 100644 --- a/mi/mipointer.c +++ b/mi/mipointer.c @@ -1,5 +1,5 @@ /* - * mipointer.c + * miPointer->c */ @@ -65,7 +65,7 @@ static unsigned long miPointerGeneration = 0; * until more than one pointer device exists. */ -static miPointerRec miPointer; +static miPointerPtr miPointer; #ifdef MPX /* Multipointers */ @@ -144,19 +144,27 @@ miPointerInitialize (pScreen, spriteFuncs, screenFuncs, waitForUpdate) /* * set up the pointer object */ - miPointer.pScreen = NULL; - miPointer.pSpriteScreen = NULL; - miPointer.pCursor = NULL; - miPointer.pSpriteCursor = NULL; - miPointer.limits.x1 = 0; - miPointer.limits.x2 = 32767; - miPointer.limits.y1 = 0; - miPointer.limits.y2 = 32767; - miPointer.confined = FALSE; - miPointer.x = 0; - miPointer.y = 0; + miPointer = (miPointerPtr)xalloc(sizeof(miPointerRec)); + if (!miPointer) + { + xfree(pScreenPriv); + return FALSE; + } + miPointer->pScreen = NULL; + miPointer->pSpriteScreen = NULL; + miPointer->pCursor = NULL; + miPointer->pSpriteCursor = NULL; + miPointer->limits.x1 = 0; + miPointer->limits.x2 = 32767; + miPointer->limits.y1 = 0; + miPointer->limits.y2 = 32767; + miPointer->confined = FALSE; + miPointer->x = 0; + miPointer->y = 0; #ifdef MPX + xfree(miPointer); + miPointer = &miMPPointers[1]; /* * Set up pointer objects for multipointer devices. */ @@ -188,10 +196,10 @@ miPointerCloseScreen (index, pScreen) int mpPointerIdx = 0; SetupScreen(pScreen); - if (pScreen == miPointer.pScreen) - miPointer.pScreen = 0; - if (pScreen == miPointer.pSpriteScreen) - miPointer.pSpriteScreen = 0; + if (pScreen == miPointer->pScreen) + miPointer->pScreen = 0; + if (pScreen == miPointer->pSpriteScreen) + miPointer->pSpriteScreen = 0; #ifdef MPX while(mpPointerIdx < MAX_DEVICES) { @@ -249,8 +257,8 @@ miPointerDisplayCursor (pScreen, pCursor) } #endif - miPointer.pCursor = pCursor; - miPointer.pScreen = pScreen; + miPointer->pCursor = pCursor; + miPointer->pScreen = pScreen; miPointerUpdateSprite(inputInfo.pointer); return TRUE; } @@ -261,14 +269,13 @@ miPointerConstrainCursor (pDev, pScreen, pBox) ScreenPtr pScreen; BoxPtr pBox; { + miPointerPtr pPointer = miPointer; #ifdef MPX if (IsMPDev(pDev)) - { - miMPPointers[pDev->id].limits = *pBox; - } + pPointer = &miMPPointers[pDev->id]; #endif - miPointer.limits = *pBox; - miPointer.confined = PointerConfinedToScreen(); + pPointer->limits = *pBox; + pPointer->confined = PointerConfinedToScreen(pDev); } /*ARGSUSED*/ @@ -320,7 +327,7 @@ miPointerWarpCursor (pScreen, x, y) SetupScreen (pScreen); - if (miPointer.pScreen != pScreen) + if (miPointer->pScreen != pScreen) (*pScreenPriv->screenFuncs->NewEventScreen) (pScreen, TRUE); if (GenerateEvent) @@ -331,16 +338,16 @@ miPointerWarpCursor (pScreen, x, y) { /* everything from miPointerMove except the event and history */ - if (!pScreenPriv->waitForUpdate && pScreen == miPointer.pSpriteScreen) + if (!pScreenPriv->waitForUpdate && pScreen == miPointer->pSpriteScreen) { - miPointer.devx = x; - miPointer.devy = y; - if(!miPointer.pCursor->bits->emptyMask) + miPointer->devx = x; + miPointer->devy = y; + if(!miPointer->pCursor->bits->emptyMask) (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y); } - miPointer.x = x; - miPointer.y = y; - miPointer.pScreen = pScreen; + miPointer->x = x; + miPointer->y = y; + miPointer->pScreen = pScreen; } } @@ -367,7 +374,7 @@ miPointerUpdateSprite (DeviceIntPtr pDev) miPointerScreenPtr pScreenPriv; CursorPtr pCursor; int x, y, devx, devy; - miPointerPtr pointer; + miPointerPtr pPointer; #ifdef MPX if (!pDev || @@ -379,66 +386,66 @@ miPointerUpdateSprite (DeviceIntPtr pDev) #ifdef MPX if (IsMPDev(pDev)) - pointer = &miMPPointers[pDev->id]; + pPointer = &miMPPointers[pDev->id]; else - pointer = &miPointer; + pPointer = miPointer; #endif - pScreen = pointer->pScreen; + pScreen = pPointer->pScreen; if (!pScreen) return; - x = pointer->x; - y = pointer->y; - devx = pointer->devx; - devy = pointer->devy; + x = pPointer->x; + y = pPointer->y; + devx = pPointer->devx; + devy = pPointer->devy; pScreenPriv = GetScreenPrivate (pScreen); /* * if the cursor has switched screens, disable the sprite * on the old screen */ - if (pScreen != pointer->pSpriteScreen) + if (pScreen != pPointer->pSpriteScreen) { - if (pointer->pSpriteScreen) + if (pPointer->pSpriteScreen) { miPointerScreenPtr pOldPriv; - pOldPriv = GetScreenPrivate (pointer->pSpriteScreen); - if (pointer->pCursor) + pOldPriv = GetScreenPrivate (pPointer->pSpriteScreen); + if (pPointer->pCursor) { (*pOldPriv->spriteFuncs->SetCursor) - (pDev, pointer->pSpriteScreen, NullCursor, 0, 0); + (pDev, pPointer->pSpriteScreen, NullCursor, 0, 0); } - (*pOldPriv->screenFuncs->CrossScreen) (pointer->pSpriteScreen, FALSE); + (*pOldPriv->screenFuncs->CrossScreen) (pPointer->pSpriteScreen, FALSE); } (*pScreenPriv->screenFuncs->CrossScreen) (pScreen, TRUE); (*pScreenPriv->spriteFuncs->SetCursor) - (pDev, pScreen, pointer->pCursor, x, y); - pointer->devx = x; - pointer->devy = y; - pointer->pSpriteCursor = pointer->pCursor; - pointer->pSpriteScreen = pScreen; + (pDev, pScreen, pPointer->pCursor, x, y); + pPointer->devx = x; + pPointer->devy = y; + pPointer->pSpriteCursor = pPointer->pCursor; + pPointer->pSpriteScreen = pScreen; } /* * if the cursor has changed, display the new one */ - else if (pointer->pCursor != pointer->pSpriteCursor) + else if (pPointer->pCursor != pPointer->pSpriteCursor) { - pCursor = pointer->pCursor; + pCursor = pPointer->pCursor; if (pCursor->bits->emptyMask && !pScreenPriv->showTransparent) pCursor = NullCursor; (*pScreenPriv->spriteFuncs->SetCursor) (pDev, pScreen, pCursor, x, y); - pointer->devx = x; - pointer->devy = y; - pointer->pSpriteCursor = pointer->pCursor; + pPointer->devx = x; + pPointer->devy = y; + pPointer->pSpriteCursor = pPointer->pCursor; } else if (x != devx || y != devy) { - pointer->devx = x; - pointer->devy = y; - if(!pointer->pCursor->bits->emptyMask) + pPointer->devx = x; + pPointer->devy = y; + if(!pPointer->pCursor->bits->emptyMask) (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y); } } @@ -451,7 +458,7 @@ miPointerUpdateSprite (DeviceIntPtr pDev) void miPointerDeltaCursor (int dx, int dy, unsigned long time) { - int x = miPointer.x + dx, y = miPointer.y + dy; + int x = miPointer->x + dx, y = miPointer->y + dy; miPointerSetPosition(inputInfo.pointer, &x, &y, time); } @@ -480,8 +487,8 @@ miPointerSetScreen(DeviceIntPtr pDev, int screen_no, int x, int y) } #endif { - miPointer.limits.x2 = pScreen->width; - miPointer.limits.y2 = pScreen->height; + miPointer->limits.x2 = pScreen->width; + miPointer->limits.y2 = pScreen->height; } } @@ -498,7 +505,7 @@ miPointerGetScreen(DeviceIntPtr pDev) if (IsMPDev(pDev)) return miMPPointers[pDev->id].pScreen; #endif - return miPointer.pScreen; + return miPointer->pScreen; } /* Move the pointer to x, y on the current screen, update the sprite, and @@ -517,15 +524,15 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y, unsigned long time) ScreenPtr pScreen; ScreenPtr newScreen; - miPointerPtr pointer; + miPointerPtr pPointer; #ifdef MPX if (IsMPDev(pDev)) - pointer = &(miMPPointers[pDev->id]); + pPointer = &(miMPPointers[pDev->id]); else #endif - pointer = &miPointer; + pPointer = miPointer; - pScreen = pointer->pScreen; + pScreen = pPointer->pScreen; if (!pScreen) return; /* called before ready */ @@ -540,7 +547,7 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y, unsigned long time) if (*x < 0 || *x >= pScreen->width || *y < 0 || *y >= pScreen->height) { pScreenPriv = GetScreenPrivate (pScreen); - if (!pointer->confined) + if (!pPointer->confined) { newScreen = pScreen; (*pScreenPriv->screenFuncs->CursorOffScreen) (&newScreen, x, y); @@ -550,23 +557,24 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y, unsigned long time) (*pScreenPriv->screenFuncs->NewEventScreen) (pScreen, FALSE); pScreenPriv = GetScreenPrivate (pScreen); /* Smash the confine to the new screen */ - pointer->limits.x2 = pScreen->width; - pointer->limits.y2 = pScreen->height; + pPointer->limits.x2 = pScreen->width; + pPointer->limits.y2 = pScreen->height; } } } /* Constrain the sprite to the current limits. */ - if (*x < pointer->limits.x1) - *x = pointer->limits.x1; - if (*x >= pointer->limits.x2) - *x = pointer->limits.x2 - 1; - if (*y < pointer->limits.y1) - *y = pointer->limits.y1; - if (*y >= pointer->limits.y2) - *y = pointer->limits.y2 - 1; - - if (pointer->x == *x && pointer->y == *y && pointer->pScreen == pScreen) - return; + if (*x < pPointer->limits.x1) + *x = pPointer->limits.x1; + if (*x >= pPointer->limits.x2) + *x = pPointer->limits.x2 - 1; + if (*y < pPointer->limits.y1) + *y = pPointer->limits.y1; + if (*y >= pPointer->limits.y2) + *y = pPointer->limits.y2 - 1; + + if (pPointer->x == *x && pPointer->y == *y && + pPointer->pScreen == pScreen) + return; miPointerMoved(pDev, pScreen, *x, *y, time); } @@ -589,8 +597,8 @@ miPointerGetPosition(DeviceIntPtr pDev, int *x, int *y) else #endif { - *x = miPointer.x; - *y = miPointer.y; + *x = miPointer->x; + *y = miPointer->y; } } @@ -605,30 +613,30 @@ void miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y, unsigned long time) { - miPointerPtr pointer; + miPointerPtr pPointer; SetupScreen(pScreen); #ifdef MPX if (IsMPDev(pDev)) - pointer = &miMPPointers[pDev->id]; + pPointer = &miMPPointers[pDev->id]; else #endif - pointer = &miPointer; + pPointer = miPointer; if (pDev && (pDev->coreEvents || pDev == inputInfo.pointer #ifdef MPX || pDev->isMPDev #endif ) && - !pScreenPriv->waitForUpdate && pScreen == miPointer.pSpriteScreen) + !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen) { - pointer->devx = x; - pointer->devy = y; - if(!pointer->pCursor->bits->emptyMask) + pPointer->devx = x; + pPointer->devy = y; + if(!pPointer->pCursor->bits->emptyMask) (*pScreenPriv->spriteFuncs->MoveCursor) (pDev, pScreen, x, y); } - pointer->x = x; - pointer->y = y; - pointer->pScreen = pScreen; + pPointer->x = x; + pPointer->y = y; + pPointer->pScreen = pScreen; } diff --git a/xfixes/cursor.c b/xfixes/cursor.c index c75e74442..22f9b0942 100755 --- a/xfixes/cursor.c +++ b/xfixes/cursor.c @@ -355,7 +355,7 @@ ProcXFixesGetCursorImage (ClientPtr client) pCursor = CursorCurrent; if (!pCursor) return BadCursor; - GetSpritePosition (&x, &y); + GetSpritePosition (inputInfo.pointer, &x, &y); width = pCursor->bits->width; height = pCursor->bits->height; npixels = width * height; @@ -503,7 +503,7 @@ ProcXFixesGetCursorImageAndName (ClientPtr client) pCursor = CursorCurrent; if (!pCursor) return BadCursor; - GetSpritePosition (&x, &y); + GetSpritePosition (inputInfo.pointer, &x, &y); width = pCursor->bits->width; height = pCursor->bits->height; npixels = width * height; diff --git a/xkb/ddxDevBtn.c b/xkb/ddxDevBtn.c index 3de8f8721..dd7d4459c 100644 --- a/xkb/ddxDevBtn.c +++ b/xkb/ddxDevBtn.c @@ -60,7 +60,7 @@ int nAxes, i, count; if (nAxes > 6) nAxes = 6; - GetSpritePosition(&x,&y); + GetSpritePosition(dev, &x,&y); btn= (deviceKeyButtonPointer *) &events[0]; val= (deviceValuator *) &events[1]; if (press) btn->type= DeviceButtonPress; diff --git a/xkb/ddxFakeBtn.c b/xkb/ddxFakeBtn.c index f7b746b05..3f23542fe 100644 --- a/xkb/ddxFakeBtn.c +++ b/xkb/ddxFakeBtn.c @@ -49,7 +49,7 @@ DevicePtr ptr; if ((ptr = LookupPointerDevice())==NULL) return; - GetSpritePosition(&x,&y); + GetSpritePosition(inputInfo.pointer, &x,&y); ev.u.u.type = event; ev.u.u.detail = button; ev.u.keyButtonPointer.time = GetTimeInMillis(); diff --git a/xkb/ddxFakeMtn.c b/xkb/ddxFakeMtn.c index a19819fd7..3dd733b32 100644 --- a/xkb/ddxFakeMtn.c +++ b/xkb/ddxFakeMtn.c @@ -53,7 +53,7 @@ XkbDDXFakePointerMotion(unsigned flags,int x,int y) int oldX,oldY; ScreenPtr pScreen, oldScreen; - GetSpritePosition(&oldX, &oldY); + GetSpritePosition(inputInfo.pointer, &oldX, &oldY); pScreen = oldScreen = GetSpriteWindow()->drawable.pScreen; #ifdef PANORAMIX diff --git a/xkb/xkbActions.c b/xkb/xkbActions.c index e0bf89c7b..7b074b53f 100644 --- a/xkb/xkbActions.c +++ b/xkb/xkbActions.c @@ -875,7 +875,7 @@ xkbDeviceInfoPtr xkbPrivPtr = XKBDEVICEINFO(xkbi->device); if ((filter->keycode!=0)&&(filter->keycode!=keycode)) return 1; - GetSpritePosition(&x,&y); + GetSpritePosition(inputInfo.pointer, &x,&y); ev.u.keyButtonPointer.time = GetTimeInMillis(); ev.u.keyButtonPointer.rootX = x; ev.u.keyButtonPointer.rootY = y; |