xfree86: shadowfb: 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:47:23 +02:00
parent da21e09c2d
commit b97b378af4

View File

@ -5,37 +5,36 @@
Written by Mark Vojkovich (mvojkovi@ucsd.edu) Written by Mark Vojkovich (mvojkovi@ucsd.edu)
Pre-fb-write callbacks and RENDER support - Nolan Leake (nolan@vmware.com) Pre-fb-write callbacks and RENDER support - Nolan Leake (nolan@vmware.com)
*/ */
#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h> #include <xorg-config.h>
#endif
#include <X11/X.h> #include <X11/X.h>
#include <X11/Xproto.h> #include <X11/Xproto.h>
#include <X11/fonts/font.h>
#include <X11/fonts/fontstruct.h>
#include "dix/screen_hooks_priv.h"
#include "misc.h" #include "misc.h"
#include "pixmapstr.h" #include "pixmapstr.h"
#include "input.h" #include "input.h"
#include <X11/fonts/font.h>
#include "mi.h" #include "mi.h"
#include "scrnintstr.h" #include "scrnintstr.h"
#include "windowstr.h" #include "windowstr.h"
#include "gcstruct.h" #include "gcstruct.h"
#include "dixfontstr.h" #include "dixfontstr.h"
#include <X11/fonts/fontstruct.h>
#include "xf86.h" #include "xf86.h"
#include "xf86str.h" #include "xf86str.h"
#include "shadowfb.h" #include "shadowfb.h"
#include "picturestr.h" #include "picturestr.h"
static Bool ShadowCloseScreen(ScreenPtr pScreen); static void ShadowCloseScreen(CallbackListPtr *, ScreenPtr pScreen, void *unused);
static Bool ShadowCreateRootWindow(WindowPtr pWin); static Bool ShadowCreateRootWindow(WindowPtr pWin);
typedef struct { typedef struct {
ScrnInfoPtr pScrn; ScrnInfoPtr pScrn;
RefreshAreaFuncPtr preRefresh; RefreshAreaFuncPtr preRefresh;
RefreshAreaFuncPtr postRefresh; RefreshAreaFuncPtr postRefresh;
CloseScreenProcPtr CloseScreen;
CreateWindowProcPtr CreateWindow; CreateWindowProcPtr CreateWindow;
} ShadowScreenRec, *ShadowScreenPtr; } ShadowScreenRec, *ShadowScreenPtr;
@ -70,10 +69,9 @@ ShadowFBInit2(ScreenPtr pScreen,
pPriv->preRefresh = preRefreshArea; pPriv->preRefresh = preRefreshArea;
pPriv->postRefresh = postRefreshArea; pPriv->postRefresh = postRefreshArea;
pPriv->CloseScreen = pScreen->CloseScreen; dixScreenHookClose(pScreen, ShadowCloseScreen);
pPriv->CreateWindow = pScreen->CreateWindow;
pScreen->CloseScreen = ShadowCloseScreen; pPriv->CreateWindow = pScreen->CreateWindow;
pScreen->CreateWindow = ShadowCreateRootWindow; pScreen->CreateWindow = ShadowCreateRootWindow;
return TRUE; return TRUE;
@ -158,14 +156,14 @@ ShadowCreateRootWindow(WindowPtr pWin)
return ret; return ret;
} }
static Bool static void ShadowCloseScreen(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused)
ShadowCloseScreen(ScreenPtr pScreen)
{ {
ShadowScreenPtr pPriv = shadowfbGetScreenPrivate(pScreen); dixScreenUnhookClose(pScreen, ShadowCloseScreen);
pScreen->CloseScreen = pPriv->CloseScreen; ShadowScreenPtr pPriv = shadowfbGetScreenPrivate(pScreen);
if (!pPriv)
return;
free(pPriv); free(pPriv);
dixSetPrivate(&pScreen->devPrivates, &ShadowScreenKeyRec, NULL);
return (*pScreen->CloseScreen) (pScreen);
} }