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-25 19:31:51 +02:00
parent 074fa9b0ba
commit e16a50281b
2 changed files with 6 additions and 7 deletions

View File

@ -32,6 +32,8 @@
#include <stdlib.h> #include <stdlib.h>
#include "dix/screen_hooks_priv.h"
#include "exa_priv.h" #include "exa_priv.h"
#include "exa.h" #include "exa.h"
@ -734,12 +736,13 @@ ExaWakeupHandler(ScreenPtr pScreen, int result)
* exaCloseScreen() unwraps its wrapped screen functions and tears down EXA's * exaCloseScreen() unwraps its wrapped screen functions and tears down EXA's
* screen private, before calling down to the next CloseSccreen. * screen private, before calling down to the next CloseSccreen.
*/ */
static Bool static void exaCloseScreen(CallbackListPtr *pcbl, ScreenPtr pScreen, void *unused)
exaCloseScreen(ScreenPtr pScreen)
{ {
ExaScreenPriv(pScreen); ExaScreenPriv(pScreen);
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
dixScreenUnhookClose(pScreen, exaCloseScreen);
if (ps && ps->Glyphs == exaGlyphs) if (ps && ps->Glyphs == exaGlyphs)
exaGlyphsFini(pScreen); exaGlyphsFini(pScreen);
@ -748,7 +751,6 @@ exaCloseScreen(ScreenPtr pScreen)
if (pScreen->WakeupHandler == ExaWakeupHandler) if (pScreen->WakeupHandler == ExaWakeupHandler)
unwrap(pExaScr, pScreen, WakeupHandler); unwrap(pExaScr, pScreen, WakeupHandler);
unwrap(pExaScr, pScreen, CreateGC); unwrap(pExaScr, pScreen, CreateGC);
unwrap(pExaScr, pScreen, CloseScreen);
unwrap(pExaScr, pScreen, GetImage); unwrap(pExaScr, pScreen, GetImage);
unwrap(pExaScr, pScreen, GetSpans); unwrap(pExaScr, pScreen, GetSpans);
if (pExaScr->SavedCreatePixmap) if (pExaScr->SavedCreatePixmap)
@ -776,8 +778,6 @@ exaCloseScreen(ScreenPtr pScreen)
} }
free(pExaScr); free(pExaScr);
return (*pScreen->CloseScreen) (pScreen);
} }
/** /**
@ -917,7 +917,7 @@ exaDriverInit(ScreenPtr pScreen, ExaDriverPtr pScreenInfo)
!(pExaScr->info->flags & EXA_HANDLES_PIXMAPS)) !(pExaScr->info->flags & EXA_HANDLES_PIXMAPS))
wrap(pExaScr, pScreen, WakeupHandler, ExaWakeupHandler); wrap(pExaScr, pScreen, WakeupHandler, ExaWakeupHandler);
wrap(pExaScr, pScreen, CreateGC, exaCreateGC); wrap(pExaScr, pScreen, CreateGC, exaCreateGC);
wrap(pExaScr, pScreen, CloseScreen, exaCloseScreen); dixScreenHookClose(pScreen, exaCloseScreen);
wrap(pExaScr, pScreen, GetImage, exaGetImage); wrap(pExaScr, pScreen, GetImage, exaGetImage);
wrap(pExaScr, pScreen, GetSpans, ExaCheckGetSpans); wrap(pExaScr, pScreen, GetSpans, ExaCheckGetSpans);
wrap(pExaScr, pScreen, CopyWindow, exaCopyWindow); wrap(pExaScr, pScreen, CopyWindow, exaCopyWindow);

View File

@ -152,7 +152,6 @@ typedef struct {
ScreenBlockHandlerProcPtr SavedBlockHandler; ScreenBlockHandlerProcPtr SavedBlockHandler;
ScreenWakeupHandlerProcPtr SavedWakeupHandler; ScreenWakeupHandlerProcPtr SavedWakeupHandler;
CreateGCProcPtr SavedCreateGC; CreateGCProcPtr SavedCreateGC;
CloseScreenProcPtr SavedCloseScreen;
GetImageProcPtr SavedGetImage; GetImageProcPtr SavedGetImage;
GetSpansProcPtr SavedGetSpans; GetSpansProcPtr SavedGetSpans;
CreatePixmapProcPtr SavedCreatePixmap; CreatePixmapProcPtr SavedCreatePixmap;