mi: fix some macros to allow multiple cursors for master devices.

Macros defaulted to inputInfo.pointe rfor devices that weren't spriteOwners.
Changed to take the device's master device now.

This includes sticking in a number of checks and warnings that cursor
rendering won't be called for floating devices.
This commit is contained in:
Peter Hutterer 2007-10-17 09:52:30 +09:30
parent 1d9ebbac8c
commit de70cfdbe6
3 changed files with 94 additions and 16 deletions

View File

@ -85,7 +85,7 @@ typedef struct {
#define MIDCBUFFER(dev) \ #define MIDCBUFFER(dev) \
((DevHasCursor(dev)) ? \ ((DevHasCursor(dev)) ? \
(miDCBufferPtr)dev->devPrivates[miDCSpriteIndex].ptr :\ (miDCBufferPtr)dev->devPrivates[miDCSpriteIndex].ptr :\
(miDCBufferPtr)inputInfo.pointer->devPrivates[miDCSpriteIndex].ptr) (miDCBufferPtr)dev->u.master->devPrivates[miDCSpriteIndex].ptr)
/* /*
* The core pointer buffer will point to the index of the virtual core pointer * The core pointer buffer will point to the index of the virtual core pointer

View File

@ -59,7 +59,7 @@ static int miPointerPrivatesIndex = 0;
#define MIPOINTER(dev) \ #define MIPOINTER(dev) \
((DevHasCursor((dev))) ? \ ((DevHasCursor((dev))) ? \
(miPointerPtr) dev->devPrivates[miPointerPrivatesIndex].ptr : \ (miPointerPtr) dev->devPrivates[miPointerPrivatesIndex].ptr : \
(miPointerPtr) inputInfo.pointer->devPrivates[miPointerPrivatesIndex].ptr) (miPointerPtr) dev->u.master->devPrivates[miPointerPrivatesIndex].ptr)
static Bool miPointerRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen, static Bool miPointerRealizeCursor(DeviceIntPtr pDev, ScreenPtr pScreen,
CursorPtr pCursor); CursorPtr pCursor);
@ -210,7 +210,12 @@ miPointerDisplayCursor (pDev, pScreen, pCursor)
ScreenPtr pScreen; ScreenPtr pScreen;
CursorPtr pCursor; CursorPtr pCursor;
{ {
miPointerPtr pPointer = MIPOINTER(pDev); miPointerPtr pPointer;
if (!pDev->isMaster && !pDev->u.master)
return FALSE;
pPointer = MIPOINTER(pDev);
pPointer->pCursor = pCursor; pPointer->pCursor = pCursor;
pPointer->pScreen = pScreen; pPointer->pScreen = pScreen;
@ -233,7 +238,12 @@ miPointerConstrainCursor (pDev, pScreen, pBox)
ScreenPtr pScreen; ScreenPtr pScreen;
BoxPtr pBox; BoxPtr pBox;
{ {
miPointerPtr pPointer = MIPOINTER(pDev); miPointerPtr pPointer;
if (!pDev->isMaster && !pDev->u.master)
return;
pPointer = MIPOINTER(pDev);
pPointer->limits = *pBox; pPointer->limits = *pBox;
pPointer->confined = PointerConfinedToScreen(pDev); pPointer->confined = PointerConfinedToScreen(pDev);
@ -347,7 +357,11 @@ miPointerWarpCursor (pDev, pScreen, x, y)
ScreenPtr pScreen; ScreenPtr pScreen;
int x, y; int x, y;
{ {
miPointerPtr pPointer = MIPOINTER(pDev); miPointerPtr pPointer;
if (!pDev->isMaster && !pDev->u.master)
return;
pPointer = MIPOINTER(pDev);
SetupScreen (pScreen); SetupScreen (pScreen);
if (pPointer->pScreen != pScreen) if (pPointer->pScreen != pScreen)
@ -399,7 +413,7 @@ miPointerUpdateSprite (DeviceIntPtr pDev)
int x, y, devx, devy; int x, y, devx, devy;
miPointerPtr pPointer; miPointerPtr pPointer;
if (!pDev || !pDev->coreEvents) if (!pDev || !pDev->coreEvents || (!pDev->isMaster && !pDev->u.master))
return; return;
pPointer = MIPOINTER(pDev); pPointer = MIPOINTER(pDev);
@ -488,7 +502,12 @@ miPointerSetScreen(DeviceIntPtr pDev, int screen_no, int x, int y)
{ {
miPointerScreenPtr pScreenPriv; miPointerScreenPtr pScreenPriv;
ScreenPtr pScreen; ScreenPtr pScreen;
miPointerPtr pPointer = MIPOINTER(pDev); miPointerPtr pPointer;
if (!pDev->isMaster && !pDev->u.master)
return;
pPointer = MIPOINTER(pDev);
pScreen = screenInfo.screens[screen_no]; pScreen = screenInfo.screens[screen_no];
pScreenPriv = GetScreenPrivate (pScreen); pScreenPriv = GetScreenPrivate (pScreen);
@ -508,8 +527,10 @@ miPointerCurrentScreen ()
_X_EXPORT ScreenPtr _X_EXPORT ScreenPtr
miPointerGetScreen(DeviceIntPtr pDev) miPointerGetScreen(DeviceIntPtr pDev)
{ {
miPointerPtr pPointer = MIPOINTER(pDev); if (!pDev->isMaster && !pDev->u.master)
return pPointer->pScreen; return NULL;
return MIPOINTER(pDev)->pScreen;
} }
/* Move the pointer to x, y on the current screen, update the sprite, and /* Move the pointer to x, y on the current screen, update the sprite, and
@ -526,9 +547,13 @@ static void
miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y, miPointerMoved (DeviceIntPtr pDev, ScreenPtr pScreen, int x, int y,
unsigned long time) unsigned long time)
{ {
miPointerPtr pPointer = MIPOINTER(pDev); miPointerPtr pPointer;
SetupScreen(pScreen); SetupScreen(pScreen);
if (!pDev->isMaster && !pDev->u.master)
return;
pPointer = MIPOINTER(pDev);
if (pDev && pDev->coreEvents if (pDev && pDev->coreEvents
&& !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen) && !pScreenPriv->waitForUpdate && pScreen == pPointer->pSpriteScreen)
@ -551,8 +576,12 @@ miPointerSetPosition(DeviceIntPtr pDev, int *x, int *y, unsigned long time)
ScreenPtr pScreen; ScreenPtr pScreen;
ScreenPtr newScreen; ScreenPtr newScreen;
miPointerPtr pPointer = MIPOINTER(pDev); miPointerPtr pPointer;
if (!pDev->isMaster && !pDev->u.master)
return;
pPointer = MIPOINTER(pDev);
pScreen = pPointer->pScreen; pScreen = pPointer->pScreen;
if (!pScreen) if (!pScreen)
return; /* called before ready */ return; /* called before ready */
@ -605,9 +634,14 @@ miPointerPosition (int *x, int *y)
_X_EXPORT void _X_EXPORT void
miPointerGetPosition(DeviceIntPtr pDev, int *x, int *y) miPointerGetPosition(DeviceIntPtr pDev, int *x, int *y)
{ {
miPointerPtr pPointer = MIPOINTER(pDev); if (!pDev->isMaster && !pDev->u.master)
*x = pPointer->x; {
*y = pPointer->y; ErrorF("[mi] miPointerGetPosition called for floating device.\n");
return;
}
*x = MIPOINTER(pDev)->x;
*y = MIPOINTER(pDev)->y;
} }
void void

View File

@ -77,7 +77,7 @@ static int miSpriteDevPrivatesIndex;
#define MISPRITE(dev) \ #define MISPRITE(dev) \
((DevHasCursor(dev)) ? \ ((DevHasCursor(dev)) ? \
(miCursorInfoPtr) dev->devPrivates[miSpriteDevPrivatesIndex].ptr : \ (miCursorInfoPtr) dev->devPrivates[miSpriteDevPrivatesIndex].ptr : \
(miCursorInfoPtr) inputInfo.pointer->devPrivates[miSpriteDevPrivatesIndex].ptr) (miCursorInfoPtr) dev->u.master->devPrivates[miSpriteDevPrivatesIndex].ptr)
/* /*
@ -759,6 +759,12 @@ miSpriteRealizeCursor (pDev, pScreen, pCursor)
miCursorInfoPtr pCursorInfo; miCursorInfoPtr pCursorInfo;
pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr; pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;
if (!pDev->isMaster && !pDev->u.master)
{
ErrorF("[mi] miSpriteRealizeCursor called for floating device.\n");
return FALSE;
}
pCursorInfo = MISPRITE(pDev); pCursorInfo = MISPRITE(pDev);
if (pCursor == pCursorInfo->pCursor) if (pCursor == pCursorInfo->pCursor)
@ -790,7 +796,14 @@ miSpriteSetCursor (pDev, pScreen, pCursor, x, y)
miSpriteScreenPtr pScreenPriv; miSpriteScreenPtr pScreenPriv;
pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr; pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;
miCursorInfoPtr pPointer = MISPRITE(pDev); miCursorInfoPtr pPointer;
if (!pDev->isMaster && !pDev->u.master)
{
ErrorF("[mi] miSpriteSetCursor called for floating device.\n");
return;
}
pPointer = MISPRITE(pDev);
if (!pCursor) if (!pCursor)
{ {
@ -905,6 +918,11 @@ miSpriteMoveCursor (pDev, pScreen, x, y)
CursorPtr pCursor; CursorPtr pCursor;
pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr; pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;
if (!pDev->isMaster && !pDev->u.master)
{
ErrorF("[mi] miSpriteMoveCursor called for floating device.\n");
return;
}
pCursor = MISPRITE(pDev)->pCursor; pCursor = MISPRITE(pDev)->pCursor;
miSpriteSetCursor (pDev, pScreen, pCursor, x, y); miSpriteSetCursor (pDev, pScreen, pCursor, x, y);
@ -972,6 +990,11 @@ miSpriteUndisplayCursor(pDev, pScreen)
DeviceIntPtr pDev; DeviceIntPtr pDev;
ScreenPtr pScreen; ScreenPtr pScreen;
{ {
if (!pDev->isMaster && !pDev->u.master)
{
ErrorF("[mi] miSpriteUndisplayCursor called for floating device.\n");
return;
}
if (MISPRITE(pDev)->isUp) if (MISPRITE(pDev)->isUp)
miSpriteRemoveCursor(pDev, pScreen); miSpriteRemoveCursor(pDev, pScreen);
} }
@ -989,6 +1012,11 @@ miSpriteRemoveCursor (pDev, pScreen)
miCursorInfoPtr pCursorInfo; miCursorInfoPtr pCursorInfo;
if (!pDev->isMaster && !pDev->u.master)
{
ErrorF("[mi] miSpriteRemoveCursor called for floating device.\n");
return;
}
DamageDrawInternal (pScreen, TRUE); DamageDrawInternal (pScreen, TRUE);
pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr; pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;
pCursorInfo = MISPRITE(pDev); pCursorInfo = MISPRITE(pDev);
@ -1026,6 +1054,11 @@ miSpriteSaveUnderCursor(pDev, pScreen)
CursorPtr pCursor; CursorPtr pCursor;
miCursorInfoPtr pCursorInfo; miCursorInfoPtr pCursorInfo;
if (!pDev->isMaster && !pDev->u.master)
{
ErrorF("[mi] miSpriteSaveUnderCursor called for floating device.\n");
return;
}
DamageDrawInternal (pScreen, TRUE); DamageDrawInternal (pScreen, TRUE);
pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr; pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;
pCursorInfo = MISPRITE(pDev); pCursorInfo = MISPRITE(pDev);
@ -1065,6 +1098,12 @@ miSpriteRestoreCursor (pDev, pScreen)
int x, y; int x, y;
CursorPtr pCursor; CursorPtr pCursor;
miCursorInfoPtr pCursorInfo; miCursorInfoPtr pCursorInfo;
if (!pDev->isMaster && !pDev->u.master)
{
ErrorF("[mi] miSpriteRestoreCursor called for floating device.\n");
return;
}
DamageDrawInternal (pScreen, TRUE); DamageDrawInternal (pScreen, TRUE);
pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr; pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;
@ -1106,6 +1145,11 @@ miSpriteComputeSaved (pDev, pScreen)
CursorPtr pCursor; CursorPtr pCursor;
miCursorInfoPtr pCursorInfo; miCursorInfoPtr pCursorInfo;
if (!pDev->isMaster && !pDev->u.master)
{
ErrorF("[mi] miSpriteComputeSaved called for floating device.\n");
return;
}
pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr; pScreenPriv = (miSpriteScreenPtr) pScreen->devPrivates[miSpriteScreenIndex].ptr;
pCursorInfo = MISPRITE(pDev); pCursorInfo = MISPRITE(pDev);