render: set anim cursor state for pointer enabled devices only

The structure containing the state of animated cursor was amended within
SpriteInfoRec, removing all previously privates logic to keep such state.

API change: It was removed MAXDEVICES dependency \o/

Signed-off-by: Tiago Vignatti <tiago.vignatti@nokia.com>
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
Reviewed-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Tiago Vignatti 2010-05-18 13:53:29 +03:00
parent c3ba199aa6
commit 66d5ecc5fd
2 changed files with 26 additions and 41 deletions

View File

@ -477,6 +477,14 @@ typedef struct _SpriteInfoRec {
DeviceIntPtr paired; /* The paired device. Keyboard if DeviceIntPtr paired; /* The paired device. Keyboard if
spriteOwner is TRUE, otherwise the spriteOwner is TRUE, otherwise the
pointer that owns the sprite. */ pointer that owns the sprite. */
/* keep states for animated cursor */
struct {
CursorPtr pCursor;
ScreenPtr pScreen;
int elt;
CARD32 time;
} anim;
} SpriteInfoRec, *SpriteInfoPtr; } SpriteInfoRec, *SpriteInfoPtr;
/* device types */ /* device types */

View File

@ -70,24 +70,12 @@ typedef struct _AnimScrPriv {
RecolorCursorProcPtr RecolorCursor; RecolorCursorProcPtr RecolorCursor;
} AnimCurScreenRec, *AnimCurScreenPtr; } AnimCurScreenRec, *AnimCurScreenPtr;
typedef struct _AnimCurState {
CursorPtr pCursor;
ScreenPtr pScreen;
int elt;
CARD32 time;
} AnimCurStateRec, *AnimCurStatePtr;
/* What a waste. But we need an API change to alloc it per device only. */
static AnimCurStateRec animCurState[MAXDEVICES];
static unsigned char empty[4]; static unsigned char empty[4];
static CursorBits animCursorBits = { static CursorBits animCursorBits = {
empty, empty, 2, 1, 1, 0, 0, 1 empty, empty, 2, 1, 1, 0, 0, 1
}; };
static int AnimCurGeneration;
static int AnimCurScreenPrivateKeyIndex; static int AnimCurScreenPrivateKeyIndex;
static DevPrivateKey AnimCurScreenPrivateKey = &AnimCurScreenPrivateKeyIndex; static DevPrivateKey AnimCurScreenPrivateKey = &AnimCurScreenPrivateKeyIndex;
@ -167,14 +155,14 @@ AnimCurScreenBlockHandler (int screenNum,
for (dev = inputInfo.devices; dev; dev = dev->next) for (dev = inputInfo.devices; dev; dev = dev->next)
{ {
if (IsPointerDevice(dev) && pScreen == animCurState[dev->id].pScreen) if (IsPointerDevice(dev) && pScreen == dev->spriteInfo->anim.pScreen)
{ {
if (!now) now = GetTimeInMillis (); if (!now) now = GetTimeInMillis ();
if ((INT32) (now - animCurState[dev->id].time) >= 0) if ((INT32) (now - dev->spriteInfo->anim.time) >= 0)
{ {
AnimCurPtr ac = GetAnimCur(animCurState[dev->id].pCursor); AnimCurPtr ac = GetAnimCur(dev->spriteInfo->anim.pCursor);
int elt = (animCurState[dev->id].elt + 1) % ac->nelt; int elt = (dev->spriteInfo->anim.elt + 1) % ac->nelt;
DisplayCursorProcPtr DisplayCursor; DisplayCursorProcPtr DisplayCursor;
/* /*
@ -190,12 +178,12 @@ AnimCurScreenBlockHandler (int screenNum,
as->DisplayCursor = pScreen->DisplayCursor; as->DisplayCursor = pScreen->DisplayCursor;
pScreen->DisplayCursor = DisplayCursor; pScreen->DisplayCursor = DisplayCursor;
animCurState[dev->id].elt = elt; dev->spriteInfo->anim.elt = elt;
animCurState[dev->id].time = now + ac->elts[elt].delay; dev->spriteInfo->anim.time = now + ac->elts[elt].delay;
} }
if (soonest > animCurState[dev->id].time) if (soonest > dev->spriteInfo->anim.time)
soonest = animCurState[dev->id].time; soonest = dev->spriteInfo->anim.time;
} }
} }
@ -218,7 +206,7 @@ AnimCurDisplayCursor (DeviceIntPtr pDev,
Unwrap (as, pScreen, DisplayCursor); Unwrap (as, pScreen, DisplayCursor);
if (IsAnimCur(pCursor)) if (IsAnimCur(pCursor))
{ {
if (pCursor != animCurState[pDev->id].pCursor) if (pCursor != pDev->spriteInfo->anim.pCursor)
{ {
AnimCurPtr ac = GetAnimCur(pCursor); AnimCurPtr ac = GetAnimCur(pCursor);
@ -226,10 +214,10 @@ AnimCurDisplayCursor (DeviceIntPtr pDev,
(pDev, pScreen, ac->elts[0].pCursor); (pDev, pScreen, ac->elts[0].pCursor);
if (ret) if (ret)
{ {
animCurState[pDev->id].elt = 0; pDev->spriteInfo->anim.elt = 0;
animCurState[pDev->id].time = GetTimeInMillis () + ac->elts[0].delay; pDev->spriteInfo->anim.time = GetTimeInMillis () + ac->elts[0].delay;
animCurState[pDev->id].pCursor = pCursor; pDev->spriteInfo->anim.pCursor = pCursor;
animCurState[pDev->id].pScreen = pScreen; pDev->spriteInfo->anim.pScreen = pScreen;
} }
} }
else else
@ -237,8 +225,8 @@ AnimCurDisplayCursor (DeviceIntPtr pDev,
} }
else else
{ {
animCurState[pDev->id].pCursor = 0; pDev->spriteInfo->anim.pCursor = 0;
animCurState[pDev->id].pScreen = 0; pDev->spriteInfo->anim.pScreen = 0;
ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor); ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
} }
Wrap (as, pScreen, DisplayCursor, AnimCurDisplayCursor); Wrap (as, pScreen, DisplayCursor, AnimCurDisplayCursor);
@ -256,8 +244,8 @@ AnimCurSetCursorPosition (DeviceIntPtr pDev,
Bool ret; Bool ret;
Unwrap (as, pScreen, SetCursorPosition); Unwrap (as, pScreen, SetCursorPosition);
if (animCurState[pDev->id].pCursor) if (pDev->spriteInfo->anim.pCursor)
animCurState[pDev->id].pScreen = pScreen; pDev->spriteInfo->anim.pScreen = pScreen;
ret = (*pScreen->SetCursorPosition) (pDev, pScreen, x, y, generateEvent); ret = (*pScreen->SetCursorPosition) (pDev, pScreen, x, y, generateEvent);
Wrap (as, pScreen, SetCursorPosition, AnimCurSetCursorPosition); Wrap (as, pScreen, SetCursorPosition, AnimCurSetCursorPosition);
return ret; return ret;
@ -322,7 +310,7 @@ AnimCurRecolorCursor (DeviceIntPtr pDev,
for (i = 0; i < ac->nelt; i++) for (i = 0; i < ac->nelt; i++)
(*pScreen->RecolorCursor) (pDev, pScreen, ac->elts[i].pCursor, (*pScreen->RecolorCursor) (pDev, pScreen, ac->elts[i].pCursor,
displayed && displayed &&
animCurState[pDev->id].elt == i); pDev->spriteInfo->anim.elt == i);
} }
else else
(*pScreen->RecolorCursor) (pDev, pScreen, pCursor, displayed); (*pScreen->RecolorCursor) (pDev, pScreen, pCursor, displayed);
@ -334,17 +322,6 @@ AnimCurInit (ScreenPtr pScreen)
{ {
AnimCurScreenPtr as; AnimCurScreenPtr as;
if (AnimCurGeneration != serverGeneration)
{
int i;
AnimCurGeneration = serverGeneration;
for (i = 0; i < MAXDEVICES; i++) {
animCurState[i].pCursor = 0;
animCurState[i].pScreen = 0;
animCurState[i].elt = 0;
animCurState[i].time = 0;
}
}
as = (AnimCurScreenPtr) malloc(sizeof (AnimCurScreenRec)); as = (AnimCurScreenPtr) malloc(sizeof (AnimCurScreenRec));
if (!as) if (!as)
return FALSE; return FALSE;