/** * realize the cursor for every screen. Do not change the refcnt, this will be * changed when ChangeToCursor actually changes the sprite. * * @return Success if all cursors realize on all screens, BadAlloc if realize * failed for a device on a given screen. */ static int RealizeCursorAllScreens(CursorPtr pCurs) { DeviceIntPtr pDev; ScreenPtr pscr; int nscr; for (nscr = 0; nscr < screenInfo.numScreens; nscr++) { pscr = screenInfo.screens[nscr]; for (pDev = inputInfo.devices; pDev; pDev = pDev->next) { if (DevHasCursor(pDev)) { if (!( *pscr->RealizeCursor)(pDev, pscr, pCurs)) { /* Realize failed for device pDev on screen pscr. * We have to assume that for all devices before, realize * worked. We need to rollback all devices so far on the * current screen and then all devices on previous * screens. */ DeviceIntPtr pDevIt = inputInfo.devices; /*dev iterator*/ while(pDevIt && pDevIt != pDev) { if (DevHasCursor(pDevIt)) ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs); pDevIt = pDevIt->next; } while (--nscr >= 0) { pscr = screenInfo.screens[nscr]; /* now unrealize all devices on previous screens */ pDevIt = inputInfo.devices; while (pDevIt) { if (DevHasCursor(pDevIt)) ( *pscr->UnrealizeCursor)(pDevIt, pscr, pCurs); pDevIt = pDevIt->next; } ( *pscr->UnrealizeCursor)(pDev, pscr, pCurs); } return BadAlloc; } } } } return Success; }
void miDCDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen) { miDCBufferPtr pBuffer; int i; if (DevHasCursor(pDev)) { for (i = 0; i < screenInfo.numScreens; i++) { pScreen = screenInfo.screens[i]; pBuffer = miGetDCDevice(pDev, pScreen); if (pBuffer) { if (pBuffer->pSourceGC) FreeGC(pBuffer->pSourceGC, (GContext) 0); if (pBuffer->pMaskGC) FreeGC(pBuffer->pMaskGC, (GContext) 0); if (pBuffer->pSaveGC) FreeGC(pBuffer->pSaveGC, (GContext) 0); if (pBuffer->pRestoreGC) FreeGC(pBuffer->pRestoreGC, (GContext) 0); #ifdef ARGB_CURSOR /* If a pRootPicture was allocated for a root window, it * is freed when that root window is destroyed, so don't * free it again here. */ #endif if (pBuffer->pSave) (*pScreen->DestroyPixmap)(pBuffer->pSave); free(pBuffer); dixSetScreenPrivate(&pDev->devPrivates, miDCDeviceKey, pScreen, NULL); } } } }
static Bool miPointerDisplayCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor) { miPointerPtr pPointer; /* return for keyboards */ if ((IsMaster(pDev) && !DevHasCursor(pDev)) || (!IsMaster(pDev) && pDev->u.master && !DevHasCursor(pDev->u.master))) return FALSE; pPointer = MIPOINTER(pDev); pPointer->pCursor = pCursor; pPointer->pScreen = pScreen; miPointerUpdateSprite(pDev); return TRUE; }
Bool miDCDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen) { miDCBufferPtr pBuffer; WindowPtr pWin; int i; if (!DevHasCursor(pDev)) return TRUE; for (i = 0; i < screenInfo.numScreens; i++) { pScreen = screenInfo.screens[i]; pBuffer = calloc(1, sizeof(miDCBufferRec)); if (!pBuffer) goto failure; dixSetScreenPrivate(&pDev->devPrivates, miDCDeviceKey, pScreen, pBuffer); pWin = pScreen->root; pBuffer->pSourceGC = miDCMakeGC(pWin); if (!pBuffer->pSourceGC) goto failure; pBuffer->pMaskGC = miDCMakeGC(pWin); if (!pBuffer->pMaskGC) goto failure; pBuffer->pSaveGC = miDCMakeGC(pWin); if (!pBuffer->pSaveGC) goto failure; pBuffer->pRestoreGC = miDCMakeGC(pWin); if (!pBuffer->pRestoreGC) goto failure; #ifdef ARGB_CURSOR pBuffer->pRootPicture = NULL; #endif /* (re)allocated lazily depending on the cursor size */ pBuffer->pSave = NULL; } return TRUE; failure: miDCDeviceCleanup(pDev, pScreen); return FALSE; }
static Bool miPointerCloseScreen (int index, ScreenPtr pScreen) { #if 0 miPointerPtr pPointer; DeviceIntPtr pDev; #endif SetupScreen(pScreen); #if 0 for (pDev = inputInfo.devices; pDev; pDev = pDev->next) { if (DevHasCursor(pDev)) { pPointer = MIPOINTER(pDev); if (pScreen == pPointer->pScreen) pPointer->pScreen = 0; if (pScreen == pPointer->pSpriteScreen) pPointer->pSpriteScreen = 0; } } if (MIPOINTER(inputInfo.pointer)->pScreen == pScreen) MIPOINTER(inputInfo.pointer)->pScreen = 0; if (MIPOINTER(inputInfo.pointer)->pSpriteScreen == pScreen) MIPOINTER(inputInfo.pointer)->pSpriteScreen = 0; #endif pScreen->CloseScreen = pScreenPriv->CloseScreen; free((pointer) pScreenPriv); FreeEventList(events, GetMaximumEventsNum()); events = NULL; return (*pScreen->CloseScreen) (index, pScreen); }