xfixes: Remove the CursorCurrent array

We're not wrapping all the ways a cursor can be destroyed, so this array
ends up with stale data. Rather than try harder to wrap more code paths,
just look up the cursor when we need it.

Signed-off-by: Adam Jackson <ajax@redhat.com>
This commit is contained in:
Adam Jackson 2017-06-08 16:23:12 -04:00
parent 3db7707df3
commit aa6651f83c

View File

@ -61,7 +61,6 @@
static RESTYPE CursorClientType; static RESTYPE CursorClientType;
static RESTYPE CursorHideCountType; static RESTYPE CursorHideCountType;
static RESTYPE CursorWindowType; static RESTYPE CursorWindowType;
static CursorPtr CursorCurrent[MAXDEVICES];
static DevPrivateKeyRec CursorScreenPrivateKeyRec; static DevPrivateKeyRec CursorScreenPrivateKeyRec;
@ -132,10 +131,26 @@ typedef struct _CursorScreen {
Bool CursorVisible = FALSE; Bool CursorVisible = FALSE;
Bool EnableCursor = TRUE; Bool EnableCursor = TRUE;
static CursorPtr
CursorForDevice(DeviceIntPtr pDev)
{
if (pDev && pDev->spriteInfo && pDev->spriteInfo->sprite)
return pDev->spriteInfo->sprite->current;
return NULL;
}
static CursorPtr
CursorForClient(ClientPtr client)
{
return CursorForDevice(PickPointer(client));
}
static Bool static Bool
CursorDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor) CursorDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
{ {
CursorScreenPtr cs = GetCursorScreen(pScreen); CursorScreenPtr cs = GetCursorScreen(pScreen);
CursorPtr pOldCursor = CursorForDevice(pDev);
Bool ret; Bool ret;
DisplayCursorProcPtr backupProc; DisplayCursorProcPtr backupProc;
@ -150,11 +165,10 @@ CursorDisplayCursor(DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor)
ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor); ret = (*pScreen->DisplayCursor) (pDev, pScreen, pCursor);
} }
if (pCursor != CursorCurrent[pDev->id]) { if (pCursor != pOldCursor) {
CursorEventPtr e; CursorEventPtr e;
UpdateCurrentTimeIf(); UpdateCurrentTimeIf();
CursorCurrent[pDev->id] = pCursor;
for (e = cursorEvents; e; e = e->next) { for (e = cursorEvents; e; e = e->next) {
if ((e->eventMask & XFixesDisplayCursorNotifyMask)) { if ((e->eventMask & XFixesDisplayCursorNotifyMask)) {
xXFixesCursorNotifyEvent ev = { xXFixesCursorNotifyEvent ev = {
@ -351,7 +365,7 @@ ProcXFixesGetCursorImage(ClientPtr client)
int npixels, width, height, rc, x, y; int npixels, width, height, rc, x, y;
REQUEST_SIZE_MATCH(xXFixesGetCursorImageReq); REQUEST_SIZE_MATCH(xXFixesGetCursorImageReq);
pCursor = CursorCurrent[PickPointer(client)->id]; pCursor = CursorForClient(client);
if (!pCursor) if (!pCursor)
return BadCursor; return BadCursor;
rc = XaceHook(XACE_RESOURCE_ACCESS, client, pCursor->id, RT_CURSOR, rc = XaceHook(XACE_RESOURCE_ACCESS, client, pCursor->id, RT_CURSOR,
@ -500,7 +514,7 @@ ProcXFixesGetCursorImageAndName(ClientPtr client)
int rc, x, y; int rc, x, y;
REQUEST_SIZE_MATCH(xXFixesGetCursorImageAndNameReq); REQUEST_SIZE_MATCH(xXFixesGetCursorImageAndNameReq);
pCursor = CursorCurrent[PickPointer(client)->id]; pCursor = CursorForClient(client);
if (!pCursor) if (!pCursor)
return BadCursor; return BadCursor;
rc = XaceHook(XACE_RESOURCE_ACCESS, client, pCursor->id, RT_CURSOR, rc = XaceHook(XACE_RESOURCE_ACCESS, client, pCursor->id, RT_CURSOR,
@ -872,7 +886,7 @@ ProcXFixesHideCursor(ClientPtr client)
for (dev = inputInfo.devices; dev; dev = dev->next) { for (dev = inputInfo.devices; dev; dev = dev->next) {
if (IsMaster(dev) && IsPointerDevice(dev)) if (IsMaster(dev) && IsPointerDevice(dev))
CursorDisplayCursor(dev, pWin->drawable.pScreen, CursorDisplayCursor(dev, pWin->drawable.pScreen,
CursorCurrent[dev->id]); CursorForDevice(dev));
} }
} }
@ -967,7 +981,7 @@ CursorFreeHideCount(void *data, XID id)
deleteCursorHideCount(pChc, pChc->pScreen); deleteCursorHideCount(pChc, pChc->pScreen);
for (dev = inputInfo.devices; dev; dev = dev->next) { for (dev = inputInfo.devices; dev; dev = dev->next) {
if (IsMaster(dev) && IsPointerDevice(dev)) if (IsMaster(dev) && IsPointerDevice(dev))
CursorDisplayCursor(dev, pScreen, CursorCurrent[dev->id]); CursorDisplayCursor(dev, pScreen, CursorForDevice(dev));
} }
return 1; return 1;