xfree86: cursor: use CloseScreen hook

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

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2025-04-29 17:41:50 +02:00
parent 866afe931a
commit da21e09c2d

View File

@ -4,6 +4,7 @@
#endif #endif
#include "dix/cursor_priv.h" #include "dix/cursor_priv.h"
#include "dix/screen_hooks_priv.h"
#include "mi/mipointer_priv.h" #include "mi/mipointer_priv.h"
#include "xf86.h" #include "xf86.h"
@ -46,7 +47,7 @@ static miPointerSpriteFuncRec xf86CursorSpriteFuncs = {
static void xf86CursorInstallColormap(ColormapPtr); static void xf86CursorInstallColormap(ColormapPtr);
static void xf86CursorRecolorCursor(DeviceIntPtr pDev, ScreenPtr, CursorPtr, static void xf86CursorRecolorCursor(DeviceIntPtr pDev, ScreenPtr, CursorPtr,
Bool); Bool);
static Bool xf86CursorCloseScreen(ScreenPtr); static void xf86CursorCloseScreen(CallbackListPtr *, ScreenPtr, void *);
static void xf86CursorQueryBestSize(int, unsigned short *, unsigned short *, static void xf86CursorQueryBestSize(int, unsigned short *, unsigned short *,
ScreenPtr); ScreenPtr);
@ -85,8 +86,7 @@ xf86InitCursor(ScreenPtr pScreen, xf86CursorInfoPtr infoPtr)
ScreenPriv->PalettedCursor = FALSE; ScreenPriv->PalettedCursor = FALSE;
ScreenPriv->pInstalledMap = NULL; ScreenPriv->pInstalledMap = NULL;
ScreenPriv->CloseScreen = pScreen->CloseScreen; dixScreenHookClose(pScreen, xf86CursorCloseScreen);
pScreen->CloseScreen = xf86CursorCloseScreen;
ScreenPriv->QueryBestSize = pScreen->QueryBestSize; ScreenPriv->QueryBestSize = pScreen->QueryBestSize;
pScreen->QueryBestSize = xf86CursorQueryBestSize; pScreen->QueryBestSize = xf86CursorQueryBestSize;
ScreenPriv->RecolorCursor = pScreen->RecolorCursor; ScreenPriv->RecolorCursor = pScreen->RecolorCursor;
@ -124,10 +124,15 @@ xf86InitCursor(ScreenPtr pScreen, xf86CursorInfoPtr infoPtr)
/***** Screen functions *****/ /***** Screen functions *****/
static Bool static void xf86CursorCloseScreen(CallbackListPtr *pcbl,
xf86CursorCloseScreen(ScreenPtr pScreen) ScreenPtr pScreen, void *unused)
{ {
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
if (!pScrn)
return;
dixScreenUnhookClose(pScreen, xf86CursorCloseScreen);
miPointerScreenPtr PointPriv = miPointerScreenPtr PointPriv =
(miPointerScreenPtr) dixLookupPrivate(&pScreen->devPrivates, (miPointerScreenPtr) dixLookupPrivate(&pScreen->devPrivates,
miPointerScreenKey); miPointerScreenKey);
@ -141,7 +146,6 @@ xf86CursorCloseScreen(ScreenPtr pScreen)
if (ScreenPriv->CurrentCursor) if (ScreenPriv->CurrentCursor)
FreeCursor(ScreenPriv->CurrentCursor, None); FreeCursor(ScreenPriv->CurrentCursor, None);
pScreen->CloseScreen = ScreenPriv->CloseScreen;
pScreen->QueryBestSize = ScreenPriv->QueryBestSize; pScreen->QueryBestSize = ScreenPriv->QueryBestSize;
pScreen->RecolorCursor = ScreenPriv->RecolorCursor; pScreen->RecolorCursor = ScreenPriv->RecolorCursor;
if (ScreenPriv->InstallColormap) if (ScreenPriv->InstallColormap)
@ -155,8 +159,7 @@ xf86CursorCloseScreen(ScreenPtr pScreen)
free(ScreenPriv->transparentData); free(ScreenPriv->transparentData);
free(ScreenPriv); free(ScreenPriv);
dixSetPrivate(&pScreen->devPrivates, xf86CursorScreenKey, NULL);
return (*pScreen->CloseScreen) (pScreen);
} }
static void static void