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.
This commit is contained in:
Peter Hutterer 2006-11-21 18:15:04 +10:30 committed by Peter Hutterer
parent fd8b9a6eae
commit 9db851c22d
12 changed files with 658 additions and 501 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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) {

File diff suppressed because it is too large Load Diff

View File

@ -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*/);

View File

@ -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))
{

View File

@ -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 (*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 (pointer->x == *x && pointer->y == *y && pointer->pScreen == pScreen)
return;
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;
}

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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

View File

@ -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;