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:
parent
074fa9b0ba
commit
e16a50281b
12
exa/exa.c
12
exa/exa.c
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue