From b97b378af47f3f11e9d18985bc4f6d9cbefa4b88 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Tue, 29 Apr 2025 17:47:23 +0200 Subject: [PATCH] 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 --- hw/xfree86/shadowfb/shadowfb.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/hw/xfree86/shadowfb/shadowfb.c b/hw/xfree86/shadowfb/shadowfb.c index d2481ed8a..b0659afda 100644 --- a/hw/xfree86/shadowfb/shadowfb.c +++ b/hw/xfree86/shadowfb/shadowfb.c @@ -5,37 +5,36 @@ Written by Mark Vojkovich (mvojkovi@ucsd.edu) Pre-fb-write callbacks and RENDER support - Nolan Leake (nolan@vmware.com) */ - -#ifdef HAVE_XORG_CONFIG_H #include -#endif #include #include +#include +#include + +#include "dix/screen_hooks_priv.h" + #include "misc.h" #include "pixmapstr.h" #include "input.h" -#include #include "mi.h" #include "scrnintstr.h" #include "windowstr.h" #include "gcstruct.h" #include "dixfontstr.h" -#include #include "xf86.h" #include "xf86str.h" #include "shadowfb.h" #include "picturestr.h" -static Bool ShadowCloseScreen(ScreenPtr pScreen); +static void ShadowCloseScreen(CallbackListPtr *, ScreenPtr pScreen, void *unused); static Bool ShadowCreateRootWindow(WindowPtr pWin); typedef struct { ScrnInfoPtr pScrn; RefreshAreaFuncPtr preRefresh; RefreshAreaFuncPtr postRefresh; - CloseScreenProcPtr CloseScreen; CreateWindowProcPtr CreateWindow; } ShadowScreenRec, *ShadowScreenPtr; @@ -70,10 +69,9 @@ ShadowFBInit2(ScreenPtr pScreen, pPriv->preRefresh = preRefreshArea; pPriv->postRefresh = postRefreshArea; - pPriv->CloseScreen = pScreen->CloseScreen; - pPriv->CreateWindow = pScreen->CreateWindow; + dixScreenHookClose(pScreen, ShadowCloseScreen); - pScreen->CloseScreen = ShadowCloseScreen; + pPriv->CreateWindow = pScreen->CreateWindow; pScreen->CreateWindow = ShadowCreateRootWindow; return TRUE; @@ -158,14 +156,14 @@ ShadowCreateRootWindow(WindowPtr pWin) return ret; } -static Bool -ShadowCloseScreen(ScreenPtr pScreen) +static void ShadowCloseScreen(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused) { - ShadowScreenPtr pPriv = shadowfbGetScreenPrivate(pScreen); + dixScreenUnhookClose(pScreen, ShadowCloseScreen); - pScreen->CloseScreen = pPriv->CloseScreen; + ShadowScreenPtr pPriv = shadowfbGetScreenPrivate(pScreen); + if (!pPriv) + return; free(pPriv); - - return (*pScreen->CloseScreen) (pScreen); + dixSetPrivate(&pScreen->devPrivates, &ShadowScreenKeyRec, NULL); }