From e16a50281bf972b376f1c3b09216799e1fd26ecf Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Fri, 25 Apr 2025 19:31:51 +0200 Subject: [PATCH] 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 --- exa/exa.c | 12 ++++++------ exa/exa_priv.h | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/exa/exa.c b/exa/exa.c index 161a7d417..d6820ee64 100644 --- a/exa/exa.c +++ b/exa/exa.c @@ -32,6 +32,8 @@ #include +#include "dix/screen_hooks_priv.h" + #include "exa_priv.h" #include "exa.h" @@ -734,12 +736,13 @@ ExaWakeupHandler(ScreenPtr pScreen, int result) * exaCloseScreen() unwraps its wrapped screen functions and tears down EXA's * screen private, before calling down to the next CloseSccreen. */ -static Bool -exaCloseScreen(ScreenPtr pScreen) +static void exaCloseScreen(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused) { ExaScreenPriv(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); + dixScreenUnhookClose(pScreen, exaCloseScreen); + if (ps && ps->Glyphs == exaGlyphs) exaGlyphsFini(pScreen); @@ -748,7 +751,6 @@ exaCloseScreen(ScreenPtr pScreen) if (pScreen->WakeupHandler == ExaWakeupHandler) unwrap(pExaScr, pScreen, WakeupHandler); unwrap(pExaScr, pScreen, CreateGC); - unwrap(pExaScr, pScreen, CloseScreen); unwrap(pExaScr, pScreen, GetImage); unwrap(pExaScr, pScreen, GetSpans); if (pExaScr->SavedCreatePixmap) @@ -776,8 +778,6 @@ exaCloseScreen(ScreenPtr pScreen) } free(pExaScr); - - return (*pScreen->CloseScreen) (pScreen); } /** @@ -917,7 +917,7 @@ exaDriverInit(ScreenPtr pScreen, ExaDriverPtr pScreenInfo) !(pExaScr->info->flags & EXA_HANDLES_PIXMAPS)) wrap(pExaScr, pScreen, WakeupHandler, ExaWakeupHandler); wrap(pExaScr, pScreen, CreateGC, exaCreateGC); - wrap(pExaScr, pScreen, CloseScreen, exaCloseScreen); + dixScreenHookClose(pScreen, exaCloseScreen); wrap(pExaScr, pScreen, GetImage, exaGetImage); wrap(pExaScr, pScreen, GetSpans, ExaCheckGetSpans); wrap(pExaScr, pScreen, CopyWindow, exaCopyWindow); diff --git a/exa/exa_priv.h b/exa/exa_priv.h index f9e166c66..943241aac 100644 --- a/exa/exa_priv.h +++ b/exa/exa_priv.h @@ -152,7 +152,6 @@ typedef struct { ScreenBlockHandlerProcPtr SavedBlockHandler; ScreenWakeupHandlerProcPtr SavedWakeupHandler; CreateGCProcPtr SavedCreateGC; - CloseScreenProcPtr SavedCloseScreen; GetImageProcPtr SavedGetImage; GetSpansProcPtr SavedGetSpans; CreatePixmapProcPtr SavedCreatePixmap;