damage: use PixmapDestroy hook

Wrapping ScreenRec's function pointers is problematic for many reasons,
so use the new pixmap destroy notify hook instead.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-10-04 17:12:46 +02:00
parent 8264e0ae21
commit 60dd47abda
2 changed files with 9 additions and 22 deletions

View File

@ -1485,28 +1485,16 @@ damageInsertDamage(DamagePtr * pPrev, DamagePtr pDamage)
*pPrev = pDamage; *pPrev = pDamage;
} }
static Bool static void damagePixmapDestroy(CallbackListPtr *pcbl, ScreenPtr pScreen, PixmapPtr pPixmap)
damageDestroyPixmap(PixmapPtr pPixmap)
{ {
ScreenPtr pScreen = pPixmap->drawable.pScreen; DamagePtr *pPrev = getPixmapDamageRef(pPixmap);
DamagePtr pDamage;
damageScrPriv(pScreen); while ((pDamage = *pPrev)) {
damageRemoveDamage(pPrev, pDamage);
if (pPixmap->refcnt == 1) { if (!pDamage->isWindow)
DamagePtr *pPrev = getPixmapDamageRef(pPixmap); DamageDestroy(pDamage);
DamagePtr pDamage;
while ((pDamage = *pPrev)) {
damageRemoveDamage(pPrev, pDamage);
if (!pDamage->isWindow)
DamageDestroy(pDamage);
}
} }
unwrap(pScrPriv, pScreen, DestroyPixmap);
if (pScreen->DestroyPixmap)
pScreen->DestroyPixmap(pPixmap);
wrap(pScrPriv, pScreen, DestroyPixmap, damageDestroyPixmap);
return TRUE;
} }
static void static void
@ -1591,12 +1579,12 @@ static void damageCloseScreen(CallbackListPtr *pcbl, ScreenPtr pScreen, void *un
{ {
dixScreenUnhookClose(pScreen, damageCloseScreen); dixScreenUnhookClose(pScreen, damageCloseScreen);
dixScreenUnhookWindowDestroy(pScreen, damageWindowDestroy); dixScreenUnhookWindowDestroy(pScreen, damageWindowDestroy);
dixScreenUnhookPixmapDestroy(pScreen, damagePixmapDestroy);
damageScrPriv(pScreen); damageScrPriv(pScreen);
if (!pScrPriv) if (!pScrPriv)
return; return;
unwrap(pScrPriv, pScreen, DestroyPixmap);
unwrap(pScrPriv, pScreen, CreateGC); unwrap(pScrPriv, pScreen, CreateGC);
unwrap(pScrPriv, pScreen, CopyWindow); unwrap(pScrPriv, pScreen, CopyWindow);
@ -1690,8 +1678,8 @@ DamageSetup(ScreenPtr pScreen)
dixScreenHookClose(pScreen, damageCloseScreen); dixScreenHookClose(pScreen, damageCloseScreen);
dixScreenHookWindowDestroy(pScreen, damageWindowDestroy); dixScreenHookWindowDestroy(pScreen, damageWindowDestroy);
dixScreenHookPixmapDestroy(pScreen, damagePixmapDestroy);
wrap(pScrPriv, pScreen, DestroyPixmap, damageDestroyPixmap);
wrap(pScrPriv, pScreen, CreateGC, damageCreateGC); wrap(pScrPriv, pScreen, CreateGC, damageCreateGC);
wrap(pScrPriv, pScreen, SetWindowPixmap, damageSetWindowPixmap); wrap(pScrPriv, pScreen, SetWindowPixmap, damageSetWindowPixmap);
wrap(pScrPriv, pScreen, CopyWindow, damageCopyWindow); wrap(pScrPriv, pScreen, CopyWindow, damageCopyWindow);

View File

@ -62,7 +62,6 @@ typedef struct _damageScrPriv {
CopyWindowProcPtr CopyWindow; CopyWindowProcPtr CopyWindow;
CreateGCProcPtr CreateGC; CreateGCProcPtr CreateGC;
DestroyPixmapProcPtr DestroyPixmap;
SetWindowPixmapProcPtr SetWindowPixmap; SetWindowPixmapProcPtr SetWindowPixmap;
CompositeProcPtr Composite; CompositeProcPtr Composite;
GlyphsProcPtr Glyphs; GlyphsProcPtr Glyphs;