Clean up DeviceIntPtr, prepare for Server 1.4 ABI. Move sprite-related

information into a new SpriteInfoRec, remove isMPDev flag.
This commit is contained in:
Peter Hutterer 2007-03-25 15:00:03 +09:30
parent e54311395e
commit 5f9c10e8da
9 changed files with 111 additions and 112 deletions

View File

@ -101,7 +101,7 @@ ProcXQueryDevicePointer(register ClientPtr client)
if (pDev->valuator->motionHintWindow) if (pDev->valuator->motionHintWindow)
MaybeStopHint(pDev, client); MaybeStopHint(pDev, client);
pSprite = pDev->pSprite; pSprite = pDev->spriteInfo->sprite;
rep.repType = X_Reply; rep.repType = X_Reply;
rep.RepType = X_QueryDevicePointer; rep.RepType = X_QueryDevicePointer;
rep.length = 0; rep.length = 0;
@ -111,7 +111,7 @@ ProcXQueryDevicePointer(register ClientPtr client)
rep.rootX = pSprite->hot.x; rep.rootX = pSprite->hot.x;
rep.rootY = pSprite->hot.y; rep.rootY = pSprite->hot.y;
rep.child = None; rep.child = None;
rep.shared = (pDev->isMPDev) ? xFalse : xTrue; rep.shared = (pDev->spriteInfo->spriteOwner) ? xFalse : xTrue;
if (pSprite->hot.pScreen == pWin->drawable.pScreen) if (pSprite->hot.pScreen == pWin->drawable.pScreen)
{ {

View File

@ -102,7 +102,7 @@ ProcXWarpDevicePointer(register ClientPtr client)
} }
} }
pSprite = pDev->pSprite; pSprite = pDev->spriteInfo->sprite;
x = pSprite->hotPhys.x; x = pSprite->hotPhys.x;
y = pSprite->hotPhys.y; y = pSprite->hotPhys.y;

View File

@ -147,6 +147,13 @@ AddInputDevice(DeviceProc deviceProc, Bool autoStart)
dev->inited = FALSE; dev->inited = FALSE;
dev->enabled = FALSE; dev->enabled = FALSE;
/* sprite defaults */
dev->spriteInfo = (SpriteInfoPtr)xcalloc(sizeof(SpriteInfoRec), 1);
if (!dev->spriteInfo)
return (DeviceIntPtr)NULL;
dev->spriteInfo->sprite = NULL;
dev->spriteInfo->spriteOwner = FALSE;
for (prev = &inputInfo.off_devices; *prev; prev = &(*prev)->next) for (prev = &inputInfo.off_devices; *prev; prev = &(*prev)->next)
; ;
*prev = dev; *prev = dev;
@ -173,7 +180,7 @@ EnableDevice(DeviceIntPtr dev)
dev->enabled = TRUE; dev->enabled = TRUE;
*prev = dev->next; *prev = dev->next;
if (IsPointerDevice(dev) && dev->isMPDev) if (IsPointerDevice(dev) && dev->spriteInfo->spriteOwner)
InitializeSprite(dev, GetCurrentRootWindow()); InitializeSprite(dev, GetCurrentRootWindow());
else else
PairDevices(NULL, inputInfo.pointer, dev); PairDevices(NULL, inputInfo.pointer, dev);
@ -360,7 +367,7 @@ InitCoreDevices()
dev->coreGrab.ActivateGrab = ActivateKeyboardGrab; dev->coreGrab.ActivateGrab = ActivateKeyboardGrab;
dev->coreGrab.DeactivateGrab = DeactivateKeyboardGrab; dev->coreGrab.DeactivateGrab = DeactivateKeyboardGrab;
dev->coreEvents = FALSE; dev->coreEvents = FALSE;
dev->spriteOwner = FALSE; dev->spriteInfo->spriteOwner = FALSE;
if (!AllocateDevicePrivate(dev, CoreDevicePrivatesIndex)) if (!AllocateDevicePrivate(dev, CoreDevicePrivatesIndex))
FatalError("Couldn't allocate keyboard devPrivates\n"); FatalError("Couldn't allocate keyboard devPrivates\n");
dev->devPrivates[CoreDevicePrivatesIndex].ptr = NULL; dev->devPrivates[CoreDevicePrivatesIndex].ptr = NULL;
@ -542,7 +549,7 @@ CloseDevice(DeviceIntPtr dev)
#endif #endif
if (DevHasCursor(dev)) if (DevHasCursor(dev))
xfree((pointer)dev->pSprite); xfree((pointer)dev->spriteInfo->sprite);
/* a client may have the device set as client pointer */ /* a client may have the device set as client pointer */
for (j = 0; j < currentMaxClients; j++) for (j = 0; j < currentMaxClients; j++)
@ -556,6 +563,7 @@ CloseDevice(DeviceIntPtr dev)
xfree(dev->coreGrab.sync.event); xfree(dev->coreGrab.sync.event);
xfree(dev->deviceGrab.sync.event); xfree(dev->deviceGrab.sync.event);
xfree(dev->spriteInfo);
xfree(dev); xfree(dev);
} }
@ -2009,14 +2017,14 @@ PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd)
else if (pairingClient != client) else if (pairingClient != client)
return BadAccess; return BadAccess;
if (kbd->spriteOwner) if (kbd->spriteInfo->spriteOwner)
{ {
xfree(kbd->pSprite); xfree(kbd->spriteInfo->sprite);
kbd->pSprite = NULL; kbd->spriteInfo->sprite = NULL;
kbd->spriteOwner = FALSE; kbd->spriteInfo->spriteOwner = FALSE;
} }
kbd->pSprite = ptr->pSprite; kbd->spriteInfo->sprite = ptr->spriteInfo->sprite;
return Success; return Success;
} }
@ -2029,7 +2037,8 @@ GetPairedPointer(DeviceIntPtr kbd)
DeviceIntPtr ptr = inputInfo.devices; DeviceIntPtr ptr = inputInfo.devices;
while(ptr) while(ptr)
{ {
if (ptr->pSprite == kbd->pSprite && ptr->spriteOwner) if (ptr->spriteInfo->sprite == kbd->spriteInfo->sprite &&
ptr->spriteInfo->spriteOwner)
{ {
return ptr; return ptr;
} }
@ -2053,7 +2062,7 @@ GetPairedKeyboard(DeviceIntPtr ptr)
{ {
if (ptr != dev && if (ptr != dev &&
IsKeyboardDevice(dev) && IsKeyboardDevice(dev) &&
ptr->pSprite == dev->pSprite) ptr->spriteInfo->sprite == dev->spriteInfo->sprite)
return dev; return dev;
dev = dev->next; dev = dev->next;
} }
@ -2109,7 +2118,7 @@ GuessFreePointerDevice()
while(it) while(it)
{ {
/* found device with a sprite? */ /* found device with a sprite? */
if (it->spriteOwner) if (it->spriteInfo->spriteOwner)
{ {
lastRealPtr = it; lastRealPtr = it;
@ -2117,7 +2126,8 @@ GuessFreePointerDevice()
while(it2) while(it2)
{ {
/* something paired with it? */ /* something paired with it? */
if (it != it2 && it2->pSprite == it->pSprite) if (it != it2 &&
it2->spriteInfo->sprite == it->spriteInfo->sprite)
break; break;
it2 = it2->next; it2 = it2->next;

View File

@ -247,7 +247,7 @@ static int spriteTraceGood;
_X_EXPORT Bool _X_EXPORT Bool
DevHasCursor(DeviceIntPtr pDev) DevHasCursor(DeviceIntPtr pDev)
{ {
return (pDev != inputInfo.pointer && pDev->spriteOwner); return (pDev != inputInfo.pointer && pDev->spriteInfo->spriteOwner);
} }
/* /*
@ -346,7 +346,7 @@ static void PostNewCursor(DeviceIntPtr pDev);
#define SyntheticMotion(dev, x, y) \ #define SyntheticMotion(dev, x, y) \
PostSyntheticMotion(dev, x, y, noPanoramiXExtension ? 0 : \ PostSyntheticMotion(dev, x, y, noPanoramiXExtension ? 0 : \
dev->pSprite->screen->myNum, \ dev->spriteInfo->sprite->screen->myNum, \
syncEvents.playingEvents ? \ syncEvents.playingEvents ? \
syncEvents.time.milliseconds : \ syncEvents.time.milliseconds : \
currentTime.milliseconds); currentTime.milliseconds);
@ -361,7 +361,7 @@ XineramaSetCursorPosition(
ScreenPtr pScreen; ScreenPtr pScreen;
BoxRec box; BoxRec box;
int i; int i;
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
/* x,y are in Screen 0 coordinates. We need to decide what Screen /* x,y are in Screen 0 coordinates. We need to decide what Screen
to send the message too and what the coordinates relative to to send the message too and what the coordinates relative to
@ -399,7 +399,7 @@ XineramaSetCursorPosition(
static void static void
XineramaConstrainCursor(DeviceIntPtr pDev) XineramaConstrainCursor(DeviceIntPtr pDev)
{ {
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
ScreenPtr pScreen; ScreenPtr pScreen;
BoxRec newBox; BoxRec newBox;
@ -423,7 +423,7 @@ XineramaCheckPhysLimits(
Bool generateEvents Bool generateEvents
){ ){
HotSpot new; HotSpot new;
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
if (!cursor) if (!cursor)
return; return;
@ -463,7 +463,7 @@ XineramaCheckPhysLimits(
static Bool static Bool
XineramaSetWindowPntrs(DeviceIntPtr pDev, WindowPtr pWin) XineramaSetWindowPntrs(DeviceIntPtr pDev, WindowPtr pWin)
{ {
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
if(pWin == WindowTable[0]) { if(pWin == WindowTable[0]) {
memcpy(pSprite->windows, WindowTable, memcpy(pSprite->windows, WindowTable,
@ -492,7 +492,7 @@ XineramaCheckVirtualMotion(
QdEventPtr qe, QdEventPtr qe,
WindowPtr pWin) WindowPtr pWin)
{ {
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
if (qe) if (qe)
{ {
@ -564,7 +564,7 @@ static Bool
XineramaCheckMotion(xEvent *xE, DeviceIntPtr pDev) XineramaCheckMotion(xEvent *xE, DeviceIntPtr pDev)
{ {
WindowPtr prevSpriteWin; WindowPtr prevSpriteWin;
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
prevSpriteWin = pSprite->win; prevSpriteWin = pSprite->win;
@ -629,7 +629,7 @@ XineramaConfineCursorToWindow(DeviceIntPtr pDev,
WindowPtr pWin, WindowPtr pWin,
Bool generateEvents) Bool generateEvents)
{ {
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
if (syncEvents.playingEvents) if (syncEvents.playingEvents)
{ {
@ -683,7 +683,7 @@ XineramaConfineCursorToWindow(DeviceIntPtr pDev,
static void static void
XineramaChangeToCursor(DeviceIntPtr pDev, CursorPtr cursor) XineramaChangeToCursor(DeviceIntPtr pDev, CursorPtr cursor)
{ {
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
if (cursor != pSprite->current) if (cursor != pSprite->current)
{ {
@ -723,7 +723,7 @@ ConfineToShape(DeviceIntPtr pDev, RegionPtr shape, int *px, int *py)
BoxRec box; BoxRec box;
int x = *px, y = *py; int x = *px, y = *py;
int incx = 1, incy = 1; int incx = 1, incy = 1;
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
if (POINT_IN_REGION(pSprite->hot.pScreen, shape, x, y, &box)) if (POINT_IN_REGION(pSprite->hot.pScreen, shape, x, y, &box))
return; return;
@ -764,7 +764,7 @@ CheckPhysLimits(
ScreenPtr pScreen) ScreenPtr pScreen)
{ {
HotSpot new; HotSpot new;
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
if (!cursor) if (!cursor)
return; return;
@ -809,7 +809,7 @@ CheckVirtualMotion(
QdEventPtr qe, QdEventPtr qe,
WindowPtr pWin) WindowPtr pWin)
{ {
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
#ifdef PANORAMIX #ifdef PANORAMIX
if(!noPanoramiXExtension) { if(!noPanoramiXExtension) {
@ -865,7 +865,7 @@ static void
ConfineCursorToWindow(DeviceIntPtr pDev, WindowPtr pWin, Bool generateEvents, Bool confineToScreen) ConfineCursorToWindow(DeviceIntPtr pDev, WindowPtr pWin, Bool generateEvents, Bool confineToScreen)
{ {
ScreenPtr pScreen = pWin->drawable.pScreen; ScreenPtr pScreen = pWin->drawable.pScreen;
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
#ifdef PANORAMIX #ifdef PANORAMIX
if(!noPanoramiXExtension) { if(!noPanoramiXExtension) {
@ -894,13 +894,13 @@ ConfineCursorToWindow(DeviceIntPtr pDev, WindowPtr pWin, Bool generateEvents, Bo
_X_EXPORT Bool _X_EXPORT Bool
PointerConfinedToScreen(DeviceIntPtr pDev) PointerConfinedToScreen(DeviceIntPtr pDev)
{ {
return pDev->pSprite->confined; return pDev->spriteInfo->sprite->confined;
} }
static void static void
ChangeToCursor(DeviceIntPtr pDev, CursorPtr cursor) ChangeToCursor(DeviceIntPtr pDev, CursorPtr cursor)
{ {
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
#ifdef PANORAMIX #ifdef PANORAMIX
if(!noPanoramiXExtension) { if(!noPanoramiXExtension) {
@ -938,7 +938,7 @@ PostNewCursor(DeviceIntPtr pDev)
{ {
WindowPtr win; WindowPtr win;
GrabPtr grab = pDev->coreGrab.grab; GrabPtr grab = pDev->coreGrab.grab;
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
CursorPtr pCursor; CursorPtr pCursor;
if (syncEvents.playingEvents) if (syncEvents.playingEvents)
@ -982,19 +982,19 @@ GetCurrentRootWindow()
_X_EXPORT WindowPtr _X_EXPORT WindowPtr
GetSpriteWindow(DeviceIntPtr pDev) GetSpriteWindow(DeviceIntPtr pDev)
{ {
return pDev->pSprite->win; return pDev->spriteInfo->sprite->win;
} }
_X_EXPORT CursorPtr _X_EXPORT CursorPtr
GetSpriteCursor(DeviceIntPtr pDev) GetSpriteCursor(DeviceIntPtr pDev)
{ {
return pDev->pSprite->current; return pDev->spriteInfo->sprite->current;
} }
_X_EXPORT void _X_EXPORT void
GetSpritePosition(DeviceIntPtr pDev, int *px, int *py) GetSpritePosition(DeviceIntPtr pDev, int *px, int *py)
{ {
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
*px = pSprite->hotPhys.x; *px = pSprite->hotPhys.x;
*py = pSprite->hotPhys.y; *py = pSprite->hotPhys.y;
} }
@ -1004,7 +1004,7 @@ _X_EXPORT int
XineramaGetCursorScreen(DeviceIntPtr pDev) XineramaGetCursorScreen(DeviceIntPtr pDev)
{ {
if(!noPanoramiXExtension) { if(!noPanoramiXExtension) {
return pDev->pSprite->screen->myNum; return pDev->spriteInfo->sprite->screen->myNum;
} else { } else {
return 0; return 0;
} }
@ -1049,7 +1049,7 @@ EnqueueEvent(xEvent *xE, DeviceIntPtr device, int count)
QdEventPtr tail = *syncEvents.pendtail; QdEventPtr tail = *syncEvents.pendtail;
QdEventPtr qe; QdEventPtr qe;
xEvent *qxE; xEvent *qxE;
SpritePtr pSprite = device->pSprite; SpritePtr pSprite = device->spriteInfo->sprite;
NoticeTime(xE); NoticeTime(xE);
@ -1146,10 +1146,10 @@ PlayReleasedEvents(void)
if(!noPanoramiXExtension) { if(!noPanoramiXExtension) {
qe->event->u.keyButtonPointer.rootX += qe->event->u.keyButtonPointer.rootX +=
panoramiXdataPtr[0].x - panoramiXdataPtr[0].x -
panoramiXdataPtr[pDev->pSprite->screen->myNum].x; panoramiXdataPtr[pDev->spriteInfo->sprite->screen->myNum].x;
qe->event->u.keyButtonPointer.rootY += qe->event->u.keyButtonPointer.rootY +=
panoramiXdataPtr[0].y - panoramiXdataPtr[0].y -
panoramiXdataPtr[pDev->pSprite->screen->myNum].y; panoramiXdataPtr[pDev->spriteInfo->sprite->screen->myNum].y;
} }
#endif #endif
(*qe->device->public.processInputProc)(qe->event, qe->device, (*qe->device->public.processInputProc)(qe->event, qe->device,
@ -1241,14 +1241,14 @@ playmore:
if ((grab = dev->coreGrab.grab) && grab->confineTo) if ((grab = dev->coreGrab.grab) && grab->confineTo)
{ {
if (grab->confineTo->drawable.pScreen != if (grab->confineTo->drawable.pScreen !=
dev->pSprite->hotPhys.pScreen) dev->spriteInfo->sprite->hotPhys.pScreen)
dev->pSprite->hotPhys.x = dev->spriteInfo->sprite->hotPhys.x =
dev->pSprite->hotPhys.y = 0; dev->spriteInfo->sprite->hotPhys.y = 0;
ConfineCursorToWindow(dev, grab->confineTo, TRUE, TRUE); ConfineCursorToWindow(dev, grab->confineTo, TRUE, TRUE);
} }
else else
ConfineCursorToWindow(dev, ConfineCursorToWindow(dev,
WindowTable[dev->pSprite->hotPhys.pScreen->myNum], WindowTable[dev->spriteInfo->sprite->hotPhys.pScreen->myNum],
TRUE, FALSE); TRUE, FALSE);
PostNewCursor(dev); PostNewCursor(dev);
} }
@ -1270,13 +1270,13 @@ ScreenRestructured (ScreenPtr pScreen)
if ((grab = pDev->coreGrab.grab) && grab->confineTo) if ((grab = pDev->coreGrab.grab) && grab->confineTo)
{ {
if (grab->confineTo->drawable.pScreen if (grab->confineTo->drawable.pScreen
!= pDev->pSprite->hotPhys.pScreen) != pDev->spriteInfo->sprite->hotPhys.pScreen)
pDev->pSprite->hotPhys.x = pDev->pSprite->hotPhys.y = 0; pDev->spriteInfo->sprite->hotPhys.x = pDev->spriteInfo->sprite->hotPhys.y = 0;
ConfineCursorToWindow(pDev, grab->confineTo, TRUE, TRUE); ConfineCursorToWindow(pDev, grab->confineTo, TRUE, TRUE);
} }
else else
ConfineCursorToWindow(pDev, ConfineCursorToWindow(pDev,
WindowTable[pDev->pSprite->hotPhys.pScreen->myNum], WindowTable[pDev->spriteInfo->sprite->hotPhys.pScreen->myNum],
TRUE, FALSE); TRUE, FALSE);
} }
} }
@ -1322,13 +1322,14 @@ ActivatePointerGrab(DeviceIntPtr mouse, GrabPtr grab,
{ {
WindowPtr oldWin = (mouse->coreGrab.grab) ? WindowPtr oldWin = (mouse->coreGrab.grab) ?
mouse->coreGrab.grab->window mouse->coreGrab.grab->window
: mouse->pSprite->win; : mouse->spriteInfo->sprite->win;
if (grab->confineTo) if (grab->confineTo)
{ {
if (grab->confineTo->drawable.pScreen if (grab->confineTo->drawable.pScreen
!= mouse->pSprite->hotPhys.pScreen) != mouse->spriteInfo->sprite->hotPhys.pScreen)
mouse->pSprite->hotPhys.x = mouse->pSprite->hotPhys.y = 0; mouse->spriteInfo->sprite->hotPhys.x =
mouse->spriteInfo->sprite->hotPhys.y = 0;
ConfineCursorToWindow(mouse, grab->confineTo, FALSE, TRUE); ConfineCursorToWindow(mouse, grab->confineTo, FALSE, TRUE);
} }
DoEnterLeaveEvents(mouse, oldWin, grab->window, NotifyGrab); DoEnterLeaveEvents(mouse, oldWin, grab->window, NotifyGrab);
@ -1362,7 +1363,7 @@ DeactivatePointerGrab(DeviceIntPtr mouse)
dev->coreGrab.sync.other = NullGrab; dev->coreGrab.sync.other = NullGrab;
} }
DoEnterLeaveEvents(mouse, grab->window, DoEnterLeaveEvents(mouse, grab->window,
mouse->pSprite->win, NotifyUngrab); mouse->spriteInfo->sprite->win, NotifyUngrab);
if (grab->confineTo) if (grab->confineTo)
ConfineCursorToWindow(mouse, ROOT, FALSE, FALSE); ConfineCursorToWindow(mouse, ROOT, FALSE, FALSE);
PostNewCursor(mouse); PostNewCursor(mouse);
@ -1381,7 +1382,7 @@ ActivateKeyboardGrab(DeviceIntPtr keybd, GrabPtr grab, TimeStamp time, Bool pass
else if (keybd->focus) else if (keybd->focus)
oldWin = keybd->focus->win; oldWin = keybd->focus->win;
else else
oldWin = keybd->pSprite->win; oldWin = keybd->spriteInfo->sprite->win;
if (oldWin == FollowKeyboardWin) if (oldWin == FollowKeyboardWin)
oldWin = inputInfo.keyboard->focus->win; oldWin = inputInfo.keyboard->focus->win;
if (keybd->valuator) if (keybd->valuator)
@ -1403,7 +1404,7 @@ DeactivateKeyboardGrab(DeviceIntPtr keybd)
GrabPtr grab = keybd->coreGrab.grab; GrabPtr grab = keybd->coreGrab.grab;
DeviceIntPtr dev; DeviceIntPtr dev;
WindowPtr focusWin = keybd->focus ? keybd->focus->win WindowPtr focusWin = keybd->focus ? keybd->focus->win
: keybd->pSprite->win; : keybd->spriteInfo->sprite->win;
if (focusWin == FollowKeyboardWin) if (focusWin == FollowKeyboardWin)
focusWin = inputInfo.keyboard->focus->win; focusWin = inputInfo.keyboard->focus->win;
@ -1883,7 +1884,7 @@ FixUpEventFromWindow(
Window child, Window child,
Bool calcChild) Bool calcChild)
{ {
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
if (calcChild) if (calcChild)
{ {
@ -2039,7 +2040,7 @@ static Bool
PointInBorderSize(WindowPtr pWin, int x, int y) PointInBorderSize(WindowPtr pWin, int x, int y)
{ {
BoxRec box; BoxRec box;
SpritePtr pSprite = inputInfo.pointer->pSprite; SpritePtr pSprite = inputInfo.pointer->spriteInfo->sprite;
if(POINT_IN_REGION(pWin->drawable.pScreen, &pWin->borderSize, x, y, &box)) if(POINT_IN_REGION(pWin->drawable.pScreen, &pWin->borderSize, x, y, &box))
return TRUE; return TRUE;
@ -2114,7 +2115,7 @@ Bool
CheckMotion(xEvent *xE, DeviceIntPtr pDev) CheckMotion(xEvent *xE, DeviceIntPtr pDev)
{ {
WindowPtr prevSpriteWin; WindowPtr prevSpriteWin;
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
prevSpriteWin = pSprite->win; prevSpriteWin = pSprite->win;
@ -2219,7 +2220,7 @@ void ReinitializeRootWindow(WindowPtr win, int xoff, int yoff)
{ {
if (DevHasCursor(pDev)) if (DevHasCursor(pDev))
{ {
pSprite = pDev->pSprite; pSprite = pDev->spriteInfo->sprite;
pSprite->hot.x -= xoff; pSprite->hot.x -= xoff;
pSprite->hot.y -= yoff; pSprite->hot.y -= yoff;
@ -2280,15 +2281,15 @@ InitializeSprite(DeviceIntPtr pDev, WindowPtr pWin)
SpritePtr pSprite; SpritePtr pSprite;
ScreenPtr pScreen; ScreenPtr pScreen;
if (!pDev->pSprite) if (!pDev->spriteInfo->sprite)
{ {
pDev->pSprite = (SpritePtr)xcalloc(1, sizeof(SpriteRec)); pDev->spriteInfo->sprite = (SpritePtr)xcalloc(1, sizeof(SpriteRec));
if (!pDev->pSprite) if (!pDev->spriteInfo->sprite)
FatalError("InitializeSprite: failed to allocate sprite struct"); FatalError("InitializeSprite: failed to allocate sprite struct");
} }
pSprite = pDev->pSprite; pSprite = pDev->spriteInfo->sprite;
pDev->spriteOwner = TRUE; pDev->spriteInfo->spriteOwner = TRUE;
pScreen = (pWin) ? pWin->drawable.pScreen : (ScreenPtr)NULL; pScreen = (pWin) ? pWin->drawable.pScreen : (ScreenPtr)NULL;
pSprite->hot.pScreen = pScreen; pSprite->hot.pScreen = pScreen;
@ -2363,7 +2364,7 @@ WindowHasNewCursor(WindowPtr pWin)
_X_EXPORT void _X_EXPORT void
NewCurrentScreen(DeviceIntPtr pDev, ScreenPtr newScreen, int x, int y) NewCurrentScreen(DeviceIntPtr pDev, ScreenPtr newScreen, int x, int y)
{ {
SpritePtr pSprite = pDev->pSprite; SpritePtr pSprite = pDev->spriteInfo->sprite;
pSprite->hotPhys.x = x; pSprite->hotPhys.x = x;
pSprite->hotPhys.y = y; pSprite->hotPhys.y = y;
@ -2423,7 +2424,7 @@ XineramaPointInWindowIsVisible(
yoff = y + panoramiXdataPtr[0].y; yoff = y + panoramiXdataPtr[0].y;
for(i = 1; i < PanoramiXNumScreens; i++) { for(i = 1; i < PanoramiXNumScreens; i++) {
pWin = inputInfo.pointer->pSprite->windows[i]; pWin = inputInfo.pointer->spriteInfo->sprite->windows[i];
pScreen = pWin->drawable.pScreen; pScreen = pWin->drawable.pScreen;
x = xoff - panoramiXdataPtr[i].x; x = xoff - panoramiXdataPtr[i].x;
y = yoff - panoramiXdataPtr[i].y; y = yoff - panoramiXdataPtr[i].y;
@ -2446,7 +2447,7 @@ XineramaWarpPointer(ClientPtr client)
{ {
WindowPtr dest = NULL; WindowPtr dest = NULL;
int x, y, rc; int x, y, rc;
SpritePtr pSprite = PickPointer(client)->pSprite; SpritePtr pSprite = PickPointer(client)->spriteInfo->sprite;
REQUEST(xWarpPointerReq); REQUEST(xWarpPointerReq);
@ -2521,7 +2522,7 @@ ProcWarpPointer(ClientPtr client)
WindowPtr dest = NULL; WindowPtr dest = NULL;
int x, y, rc; int x, y, rc;
ScreenPtr newScreen; ScreenPtr newScreen;
SpritePtr pSprite = PickPointer(client)->pSprite; SpritePtr pSprite = PickPointer(client)->spriteInfo->sprite;
REQUEST(xWarpPointerReq); REQUEST(xWarpPointerReq);
@ -2609,7 +2610,7 @@ ProcWarpPointer(ClientPtr client)
static Bool static Bool
BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin) BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin)
{ {
if(REGION_NOTEMPTY(pDev->pSprite->hotPhys.pScreen, &pWin->borderSize)) if(REGION_NOTEMPTY(pDev->spriteInfo->sprite->hotPhys.pScreen, &pWin->borderSize))
return TRUE; return TRUE;
#ifdef PANORAMIX #ifdef PANORAMIX
@ -2617,8 +2618,8 @@ BorderSizeNotEmpty(DeviceIntPtr pDev, WindowPtr pWin)
int i; int i;
for(i = 1; i < PanoramiXNumScreens; i++) { for(i = 1; i < PanoramiXNumScreens; i++) {
if(REGION_NOTEMPTY(pDev->pSprite->screen, if(REGION_NOTEMPTY(pDev->spriteInfo->sprite->screen,
&pDev->pSprite->windows[i]->borderSize)) &pDev->spriteInfo->sprite->windows[i]->borderSize))
return TRUE; return TRUE;
} }
} }
@ -2817,7 +2818,7 @@ DeliverGrabbedEvent(xEvent *xE, DeviceIntPtr thisDev,
int deliveries = 0; int deliveries = 0;
DeviceIntPtr dev; DeviceIntPtr dev;
xEvent *dxE; xEvent *dxE;
SpritePtr pSprite = thisDev->pSprite; SpritePtr pSprite = thisDev->spriteInfo->sprite;
if (xE->u.u.type & EXTENSION_EVENT_BASE) if (xE->u.u.type & EXTENSION_EVENT_BASE)
grabinfo = &thisDev->deviceGrab; grabinfo = &thisDev->deviceGrab;
@ -2988,8 +2989,8 @@ drawable.id:0;
))) )))
#endif #endif
XE_KBPTR.state = (keyc->state | GetPairedPointer(keybd)->button->state); XE_KBPTR.state = (keyc->state | GetPairedPointer(keybd)->button->state);
XE_KBPTR.rootX = keybd->pSprite->hot.x; XE_KBPTR.rootX = keybd->spriteInfo->sprite->hot.x;
XE_KBPTR.rootY = keybd->pSprite->hot.y; XE_KBPTR.rootY = keybd->spriteInfo->sprite->hot.y;
key = xE->u.u.detail; key = xE->u.u.detail;
kptr = &keyc->down[key >> 3]; kptr = &keyc->down[key >> 3];
bit = 1 << (key & 7); bit = 1 << (key & 7);
@ -3065,7 +3066,7 @@ drawable.id:0;
if (grab) if (grab)
DeliverGrabbedEvent(xE, keybd, deactivateGrab, count); DeliverGrabbedEvent(xE, keybd, deactivateGrab, count);
else else
DeliverFocusedEvent(keybd, xE, keybd->pSprite->win, count); DeliverFocusedEvent(keybd, xE, keybd->spriteInfo->sprite->win, count);
if (deactivateGrab) if (deactivateGrab)
(*grabinfo->DeactivateGrab)(keybd); (*grabinfo->DeactivateGrab)(keybd);
@ -3117,7 +3118,7 @@ ProcessPointerEvent (xEvent *xE, DeviceIntPtr mouse, int count)
GrabPtr grab = mouse->coreGrab.grab; GrabPtr grab = mouse->coreGrab.grab;
Bool deactivateGrab = FALSE; Bool deactivateGrab = FALSE;
ButtonClassPtr butc = mouse->button; ButtonClassPtr butc = mouse->button;
SpritePtr pSprite = mouse->pSprite; SpritePtr pSprite = mouse->spriteInfo->sprite;
#ifdef XKB #ifdef XKB
XkbSrvInfoPtr xkbi= inputInfo.keyboard->key->xkbInfo; XkbSrvInfoPtr xkbi= inputInfo.keyboard->key->xkbInfo;
@ -3468,8 +3469,8 @@ EnterLeaveEvent(
event.u.u.type = type; event.u.u.type = type;
event.u.u.detail = detail; event.u.u.detail = detail;
event.u.enterLeave.time = currentTime.milliseconds; event.u.enterLeave.time = currentTime.milliseconds;
event.u.enterLeave.rootX = pDev->pSprite->hot.x; event.u.enterLeave.rootX = pDev->spriteInfo->sprite->hot.x;
event.u.enterLeave.rootY = pDev->pSprite->hot.y; event.u.enterLeave.rootY = pDev->spriteInfo->sprite->hot.y;
/* Counts on the same initial structure of crossing & button events! */ /* Counts on the same initial structure of crossing & button events! */
FixUpEventFromWindow(mouse, &event, pWin, None, FALSE); FixUpEventFromWindow(mouse, &event, pWin, None, FALSE);
/* Enter/Leave events always set child */ /* Enter/Leave events always set child */
@ -3696,7 +3697,7 @@ DoFocusEvents(DeviceIntPtr dev, WindowPtr fromWin, WindowPtr toWin, int mode)
int out, in; /* for holding details for to/from int out, in; /* for holding details for to/from
PointerRoot/None */ PointerRoot/None */
int i; int i;
SpritePtr pSprite = dev->pSprite; SpritePtr pSprite = dev->spriteInfo->sprite;
if (fromWin == toWin) if (fromWin == toWin)
return; return;
@ -4224,7 +4225,7 @@ ProcQueryPointer(ClientPtr client)
xQueryPointerReply rep; xQueryPointerReply rep;
WindowPtr pWin, t; WindowPtr pWin, t;
DeviceIntPtr mouse = PickPointer(client); DeviceIntPtr mouse = PickPointer(client);
SpritePtr pSprite = mouse->pSprite; SpritePtr pSprite = mouse->spriteInfo->sprite;
int rc; int rc;
REQUEST(xResourceReq); REQUEST(xResourceReq);
@ -4343,7 +4344,7 @@ ProcSendEvent(ClientPtr client)
{ {
WindowPtr pWin; WindowPtr pWin;
WindowPtr effectiveFocus = NullWindow; /* only set if dest==InputFocus */ WindowPtr effectiveFocus = NullWindow; /* only set if dest==InputFocus */
SpritePtr pSprite = PickPointer(client)->pSprite; SpritePtr pSprite = PickPointer(client)->spriteInfo->sprite;
REQUEST(xSendEventReq); REQUEST(xSendEventReq);
REQUEST_SIZE_MATCH(xSendEventReq); REQUEST_SIZE_MATCH(xSendEventReq);
@ -4771,7 +4772,7 @@ ProcRecolorCursor(ClientPtr client)
int nscr; int nscr;
ScreenPtr pscr; ScreenPtr pscr;
Bool displayed; Bool displayed;
SpritePtr pSprite = PickPointer(client)->pSprite; SpritePtr pSprite = PickPointer(client)->spriteInfo->sprite;
REQUEST(xRecolorCursorReq); REQUEST(xRecolorCursorReq);
REQUEST_SIZE_MATCH(xRecolorCursorReq); REQUEST_SIZE_MATCH(xRecolorCursorReq);
@ -4914,7 +4915,7 @@ PickPointer(ClientPtr client)
DeviceIntPtr it = inputInfo.devices; DeviceIntPtr it = inputInfo.devices;
while (it) while (it)
{ {
if (it != inputInfo.pointer && it->spriteOwner) if (it != inputInfo.pointer && it->spriteInfo->spriteOwner)
{ {
client->clientPtr = it; client->clientPtr = it;
break; break;
@ -4947,7 +4948,7 @@ PickKeyboard(ClientPtr client)
{ {
if (ptr != kbd && if (ptr != kbd &&
IsKeyboardDevice(kbd) && IsKeyboardDevice(kbd) &&
ptr->pSprite == kbd->pSprite) ptr->spriteInfo->sprite == kbd->spriteInfo->sprite)
return kbd; return kbd;
kbd = kbd->next; kbd = kbd->next;
} }

View File

@ -505,7 +505,7 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
if ((type == ButtonPress || type == ButtonRelease) && !pDev->button) if ((type == ButtonPress || type == ButtonRelease) && !pDev->button)
return 0; return 0;
if (!coreOnly && (pDev->coreEvents || pDev->isMPDev)) if (!coreOnly && (pDev->coreEvents))
num_events = 2; num_events = 2;
else else
num_events = 1; num_events = 1;
@ -529,10 +529,7 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
ms = GetTimeInMillis(); ms = GetTimeInMillis();
if (!pDev->coreEvents || pDev->isMPDev)
pointer = pDev; pointer = pDev;
else
pointer = inputInfo.pointer;
/* Set x and y based on whether this is absolute or relative, and /* Set x and y based on whether this is absolute or relative, and
* accelerate if we need to. */ * accelerate if we need to. */
@ -585,11 +582,6 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
updateMotionHistory(pDev, ms, first_valuator, num_valuators, valuators); updateMotionHistory(pDev, ms, first_valuator, num_valuators, valuators);
if (pDev->coreEvents && !pDev->isMPDev) {
/* set the virtual core pointer's coordinates */
inputInfo.pointer->valuator->lastx = x;
inputInfo.pointer->valuator->lasty = y;
}
pDev->valuator->lastx = x; pDev->valuator->lastx = x;
pDev->valuator->lasty = y; pDev->valuator->lasty = y;
@ -623,8 +615,7 @@ GetPointerEvents(xEvent *events, DeviceIntPtr pDev, int type, int buttons,
} }
} }
/* MPX devices always send core events */ if (coreOnly || pDev->coreEvents) {
if (coreOnly || pDev->coreEvents || pDev->isMPDev) {
events->u.u.type = type; events->u.u.type = type;
events->u.keyButtonPointer.time = ms; events->u.keyButtonPointer.time = ms;
events->u.keyButtonPointer.rootX = x; events->u.keyButtonPointer.rootX = x;

View File

@ -171,7 +171,7 @@ xf86ActivateDevice(LocalDevicePtr local)
local->dev = dev; local->dev = dev;
dev->coreEvents = local->flags & XI86_ALWAYS_CORE; dev->coreEvents = local->flags & XI86_ALWAYS_CORE;
dev->isMPDev = !(local->flags & XI86_SHARED_POINTER); dev->spriteInfo->spriteOwner = !(local->flags & XI86_SHARED_POINTER);
#ifdef XKB #ifdef XKB
if (!IsPointerDevice(dev)) if (!IsPointerDevice(dev))

View File

@ -322,6 +322,15 @@ typedef struct _GrabInfoRec {
} sync; } sync;
} GrabInfoRec, *GrabInfoPtr; } GrabInfoRec, *GrabInfoPtr;
typedef struct _SpriteInfoRec {
/* sprite must always point to a valid sprite. For devices sharing the
* sprite, let sprite point to a paired spriteOwner's sprite. */
SpritePtr sprite; /* sprite information */
Bool spriteOwner; /* True if device owns the sprite */
DeviceIntPtr paired; /* the real owner of the sprite or
NULL if spriteOwner is TRUE*/
} SpriteInfoRec, *SpriteInfoPtr;
typedef struct _DeviceIntRec { typedef struct _DeviceIntRec {
DeviceRec public; DeviceRec public;
DeviceIntPtr next; DeviceIntPtr next;
@ -358,13 +367,7 @@ typedef struct _DeviceIntRec {
DevUnion *devPrivates; DevUnion *devPrivates;
int nPrivates; int nPrivates;
DeviceUnwrapProc unwrapProc; DeviceUnwrapProc unwrapProc;
Bool isMPDev; /* TRUE if multipointer device */ SpriteInfoPtr spriteInfo;
/* Each device has a sprite. However, keyboards and shared pointers do
not in fact own a sprite but rather have their pointer set to the
sprite of another device. pSprite always has to point to a valid
sprite. spriteOwner indicates whether it is the device's sprite. */
SpritePtr pSprite; /* sprite information */
Bool spriteOwner; /* FALSE if shared sprite, see above*/
} DeviceIntRec; } DeviceIntRec;
typedef struct { typedef struct {

View File

@ -115,7 +115,7 @@ mieqEnqueue(DeviceIntPtr pDev, xEvent *e)
&laste->event[0]; &laste->event[0];
/* avoid merging events from different devices */ /* avoid merging events from different devices */
if (e->u.u.type == MotionNotify && pDev->isMPDev) if (e->u.u.type == MotionNotify)
isMotion = pDev->id; isMotion = pDev->id;
else if (e->u.u.type == MotionNotify) else if (e->u.u.type == MotionNotify)
isMotion = inputInfo.pointer->id; isMotion = inputInfo.pointer->id;
@ -235,10 +235,7 @@ mieqProcessInputEvents()
else if (e->event[0].u.u.type == MotionNotify || else if (e->event[0].u.u.type == MotionNotify ||
e->event[0].u.u.type == ButtonPress || e->event[0].u.u.type == ButtonPress ||
e->event[0].u.u.type == ButtonRelease) { e->event[0].u.u.type == ButtonRelease) {
if (!e->pDev->isMPDev)
SwitchCorePointer(e->pDev);
dev = inputInfo.pointer; dev = inputInfo.pointer;
} }
else { else {
dev = e->pDev; dev = e->pDev;
@ -252,8 +249,7 @@ mieqProcessInputEvents()
} }
/* Update the sprite now. Next event may be from different device. */ /* Update the sprite now. Next event may be from different device. */
if (e->event[0].u.u.type == MotionNotify && if (e->event[0].u.u.type == MotionNotify && e->pDev->coreEvents)
(e->pDev->isMPDev || e->pDev->coreEvents))
{ {
miPointerUpdateSprite(e->pDev); miPointerUpdateSprite(e->pDev);
} }

View File

@ -346,8 +346,7 @@ miPointerUpdateSprite (DeviceIntPtr pDev)
int x, y, devx, devy; int x, y, devx, devy;
miPointerPtr pPointer; miPointerPtr pPointer;
if (!pDev || pDev == inputInfo.pointer || if (!pDev || pDev == inputInfo.pointer || !pDev->coreEvents)
!(pDev->coreEvents || pDev->isMPDev))
return; return;
pPointer = MIPOINTER(pDev); pPointer = MIPOINTER(pDev);
@ -481,8 +480,7 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y, unsigned long time)
if (!pScreen) if (!pScreen)
return; /* called before ready */ return; /* called before ready */
if (!pDev || if (!pDev || !(pDev->coreEvents || pDev == inputInfo.pointer))
!(pDev->coreEvents || pDev == inputInfo.pointer || pDev->isMPDev))
return; return;
if (*x < 0 || *x >= pScreen->width || *y < 0 || *y >= pScreen->height) if (*x < 0 || *x >= pScreen->width || *y < 0 || *y >= pScreen->height)
@ -574,7 +572,7 @@ miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
SetupScreen(pScreen); SetupScreen(pScreen);
if (pDev && (pDev->coreEvents || pDev == inputInfo.pointer || pDev->isMPDev) if (pDev && (pDev->coreEvents || pDev == inputInfo.pointer)
&& !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen) && !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen)
{ {
pPointer->devx = x; pPointer->devx = x;