[PATCH 3/3] render: set anim cursor state for pointer enable devices only
Tiago Vignatti
tiago.vignatti at nokia.com
Tue May 4 10:07:05 PDT 2010
remove MAXDEVICES dependency \o/
Signed-off-by: Tiago Vignatti <tiago.vignatti at nokia.com>
---
dix/devices.c | 3 ++
render/animcur.c | 91 +++++++++++++++++++++++++++++++++-----------------
render/picturestr.h | 3 ++
3 files changed, 66 insertions(+), 31 deletions(-)
diff --git a/dix/devices.c b/dix/devices.c
index 1386491..16a8d92 100644
--- a/dix/devices.c
+++ b/dix/devices.c
@@ -342,6 +342,9 @@ EnableDevice(DeviceIntPtr dev, BOOL sendevent)
RecalculateMasterButtons(dev);
+ /* allocate animated cursor is a device is capable */
+ AnimCursorAlloc(dev);
+
return TRUE;
}
diff --git a/render/animcur.c b/render/animcur.c
index eb74b1a..ede1dbb 100644
--- a/render/animcur.c
+++ b/render/animcur.c
@@ -77,8 +77,6 @@ typedef struct _AnimCurState {
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];
@@ -99,6 +97,22 @@ static DevPrivateKey AnimCurScreenPrivateKey = &AnimCurScreenPrivateKeyIndex;
#define Wrap(as,s,elt,func) (((as)->elt = (s)->elt), (s)->elt = func)
#define Unwrap(as,s,elt) ((s)->elt = (as)->elt)
+static int AnimCurStatePrivateKeyIndex;
+static DevPrivateKey AnimCurStatePrivateKey = &AnimCurStatePrivateKeyIndex;
+
+static inline AnimCurStatePtr
+GetAnimCurState (DeviceIntPtr d)
+{
+ return ((AnimCurStatePtr) dixLookupPrivate(&(d)->devPrivates,
+ AnimCurStatePrivateKey));
+}
+
+static inline void
+SetAnimCurState (DeviceIntPtr d, AnimCurStatePtr c)
+{
+ dixSetPrivate(&(d)->devPrivates, AnimCurStatePrivateKey, c);
+}
+
static Bool
AnimCurCloseScreen (int index, ScreenPtr pScreen)
@@ -167,14 +181,14 @@ AnimCurScreenBlockHandler (int screenNum,
for (dev = inputInfo.devices; dev; dev = dev->next)
{
- if (IsPointerDevice(dev) && pScreen == animCurState[dev->id].pScreen)
+ if (IsPointerDevice(dev) && pScreen == GetAnimCurState(dev)->pScreen)
{
if (!now) now = GetTimeInMillis ();
- if ((INT32) (now - animCurState[dev->id].time) >= 0)
+ if ((INT32) (now - GetAnimCurState(dev)->time) >= 0)
{
- AnimCurPtr ac = GetAnimCur(animCurState[dev->id].pCursor);
- int elt = (animCurState[dev->id].elt + 1) % ac->nelt;
+ AnimCurPtr ac = GetAnimCur(GetAnimCurState(dev)->pCursor);
+ int elt = (GetAnimCurState(dev)->elt + 1) % ac->nelt;
DisplayCursorProcPtr DisplayCursor;
/*
@@ -190,12 +204,14 @@ AnimCurScreenBlockHandler (int screenNum,
as->DisplayCursor = pScreen->DisplayCursor;
pScreen->DisplayCursor = DisplayCursor;
- animCurState[dev->id].elt = elt;
- animCurState[dev->id].time = now + ac->elts[elt].delay;
+ AnimCurStatePtr animCurState = GetAnimCurState(dev);
+ animCurState->elt = elt;
+ animCurState->time = now + ac->elts[elt].delay;
+ SetAnimCurState(dev, animCurState);
}
- if (soonest > animCurState[dev->id].time)
- soonest = animCurState[dev->id].time;
+ if (soonest > GetAnimCurState(dev)->time)
+ soonest = GetAnimCurState(dev)->time;
}
}
@@ -218,7 +234,7 @@ AnimCurDisplayCursor (DeviceIntPtr pDev,
Unwrap (as, pScreen, DisplayCursor);
if (IsAnimCur(pCursor))
{
- if (pCursor != animCurState[pDev->id].pCursor)
+ if (pCursor != GetAnimCurState(pDev)->pCursor)
{
AnimCurPtr ac = GetAnimCur(pCursor);
@@ -226,10 +242,12 @@ AnimCurDisplayCursor (DeviceIntPtr pDev,
(pDev, pScreen, ac->elts[0].pCursor);
if (ret)
{
- animCurState[pDev->id].elt = 0;
- animCurState[pDev->id].time = GetTimeInMillis () + ac->elts[0].delay;
- animCurState[pDev->id].pCursor = pCursor;
- animCurState[pDev->id].pScreen = pScreen;
+ AnimCurStatePtr animCurState = GetAnimCurState(pDev);
+ animCurState->elt = 0;
+ animCurState->time = GetTimeInMillis () + ac->elts[0].delay;
+ animCurState->pCursor = pCursor;
+ animCurState->pScreen = pScreen;
+ SetAnimCurState(pDev, animCurState);
}
}
else
@@ -237,8 +255,6 @@ AnimCurDisplayCursor (DeviceIntPtr pDev,
}
else
{
- animCurState[pDev->id].pCursor = 0;
- animCurState[pDev->id].pScreen = 0;
ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
}
Wrap (as, pScreen, DisplayCursor, AnimCurDisplayCursor);
@@ -256,8 +272,11 @@ AnimCurSetCursorPosition (DeviceIntPtr pDev,
Bool ret;
Unwrap (as, pScreen, SetCursorPosition);
- if (animCurState[pDev->id].pCursor)
- animCurState[pDev->id].pScreen = pScreen;
+ if ((AnimCurGeneration == serverGeneration) && GetAnimCurState(pDev)->pCursor) {
+ AnimCurStatePtr animCurState = GetAnimCurState(pDev);
+ animCurState->pScreen = pScreen;
+ SetAnimCurState(pDev, animCurState);
+ }
ret = (*pScreen->SetCursorPosition) (pDev, pScreen, x, y, generateEvent);
Wrap (as, pScreen, SetCursorPosition, AnimCurSetCursorPosition);
return ret;
@@ -322,29 +341,39 @@ AnimCurRecolorCursor (DeviceIntPtr pDev,
for (i = 0; i < ac->nelt; i++)
(*pScreen->RecolorCursor) (pDev, pScreen, ac->elts[i].pCursor,
displayed &&
- animCurState[pDev->id].elt == i);
+ GetAnimCurState(pDev)->elt == i);
}
else
(*pScreen->RecolorCursor) (pDev, pScreen, pCursor, displayed);
Wrap (as, pScreen, RecolorCursor, AnimCurRecolorCursor);
}
+void
+AnimCursorAlloc(DeviceIntPtr dev)
+{
+
+ if (IsPointerDevice(dev)) {
+ AnimCurStatePtr animCurState;
+
+ animCurState = xalloc (sizeof(AnimCurStateRec));
+ if (!animCurState)
+ FatalError("Unable to allocate animated cursors\n");
+
+ animCurState->pCursor = 0;
+ animCurState->pScreen = 0;
+ animCurState->elt = 0;
+ animCurState->time = 0;
+ SetAnimCurState(dev, animCurState);
+ }
+
+ AnimCurGeneration = serverGeneration;
+}
+
Bool
AnimCurInit (ScreenPtr pScreen)
{
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) xalloc (sizeof (AnimCurScreenRec));
if (!as)
return FALSE;
diff --git a/render/picturestr.h b/render/picturestr.h
index 6a8d76d..b45f603 100644
--- a/render/picturestr.h
+++ b/render/picturestr.h
@@ -623,6 +623,9 @@ extern _X_EXPORT void RenderExtensionInit (void);
Bool
AnimCurInit (ScreenPtr pScreen);
+Bool
+AnimCurAlloc (DeviceIntPtr dev);
+
int
AnimCursorCreate (CursorPtr *cursors, CARD32 *deltas, int ncursor, CursorPtr *ppCursor, ClientPtr client, XID cid);
--
1.6.0.4
More information about the xorg-devel
mailing list