xfree86: exa: 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:13:45 +02:00
parent 0bfea99672
commit cc847cc43a

View File

@ -31,13 +31,14 @@
#include <string.h> #include <string.h>
#include "dix/screen_hooks_priv.h"
#include "exa_priv.h" #include "exa_priv.h"
#include "xf86str.h" #include "xf86str.h"
#include "xf86.h" #include "xf86.h"
typedef struct _ExaXorgScreenPrivRec { typedef struct _ExaXorgScreenPrivRec {
CloseScreenProcPtr SavedCloseScreen;
xf86EnableDisableFBAccessProc *SavedEnableDisableFBAccess; xf86EnableDisableFBAccessProc *SavedEnableDisableFBAccess;
OptionInfoPtr options; OptionInfoPtr options;
} ExaXorgScreenPrivRec, *ExaXorgScreenPrivPtr; } ExaXorgScreenPrivRec, *ExaXorgScreenPrivPtr;
@ -69,21 +70,22 @@ static const OptionInfoRec EXAOptions[] = {
OPTV_NONE, {0}, FALSE} OPTV_NONE, {0}, FALSE}
}; };
static Bool static void exaXorgCloseScreen(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused)
exaXorgCloseScreen(ScreenPtr pScreen)
{ {
ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
ExaXorgScreenPrivPtr pScreenPriv = (ExaXorgScreenPrivPtr) ExaXorgScreenPrivPtr pScreenPriv = (ExaXorgScreenPrivPtr)
dixLookupPrivate(&pScreen->devPrivates, exaXorgScreenPrivateKey); dixLookupPrivate(&pScreen->devPrivates, exaXorgScreenPrivateKey);
pScreen->CloseScreen = pScreenPriv->SavedCloseScreen; dixScreenUnhookClose(pScreen, exaXorgCloseScreen);
if (!pScrn)
return;
pScrn->EnableDisableFBAccess = pScreenPriv->SavedEnableDisableFBAccess; pScrn->EnableDisableFBAccess = pScreenPriv->SavedEnableDisableFBAccess;
free(pScreenPriv->options); free(pScreenPriv->options);
free(pScreenPriv); free(pScreenPriv);
dixSetPrivate(&pScreen->devPrivates, exaXorgScreenPrivateKey, NULL);
return pScreen->CloseScreen(pScreen);
} }
static void static void
@ -176,9 +178,7 @@ exaDDXDriverInit(ScreenPtr pScreen)
pScreenPriv->SavedEnableDisableFBAccess = pScrn->EnableDisableFBAccess; pScreenPriv->SavedEnableDisableFBAccess = pScrn->EnableDisableFBAccess;
pScrn->EnableDisableFBAccess = exaXorgEnableDisableFBAccess; pScrn->EnableDisableFBAccess = exaXorgEnableDisableFBAccess;
pScreenPriv->SavedCloseScreen = pScreen->CloseScreen; dixScreenHookClose(pScreen, exaXorgCloseScreen);
pScreen->CloseScreen = exaXorgCloseScreen;
} }
static XF86ModuleVersionInfo exaVersRec = { static XF86ModuleVersionInfo exaVersRec = {