(!1714) mi: overlay: use window destructor hook

Wrapping ScreenRec's function pointers is problematic for many reasons, so
use the new window destructor hook instead.

Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2024-09-23 17:42:04 +02:00
parent 527a0325d5
commit 1c8dc9e329
2 changed files with 6 additions and 19 deletions

View File

@ -46,7 +46,6 @@ typedef struct {
typedef struct {
CloseScreenProcPtr CloseScreen;
CreateWindowProcPtr CreateWindow;
DestroyWindowProcPtr DestroyWindow;
UnrealizeWindowProcPtr UnrealizeWindow;
RealizeWindowProcPtr RealizeWindow;
miOverlayTransFunc MakeTransparent;
@ -69,7 +68,7 @@ static Bool CollectUnderlayChildrenRegions(WindowPtr, RegionPtr);
static Bool miOverlayCloseScreen(ScreenPtr);
static Bool miOverlayCreateWindow(WindowPtr);
static Bool miOverlayDestroyWindow(WindowPtr);
static void miOverlayWindowDestroy(ScreenPtr pScreen, WindowPtr, void *arg);
static Bool miOverlayUnrealizeWindow(WindowPtr);
static Bool miOverlayRealizeWindow(WindowPtr);
static void miOverlayMarkWindow(WindowPtr);
@ -126,6 +125,7 @@ miInitOverlay(ScreenPtr pScreen,
return FALSE;
dixSetPrivate(&pScreen->devPrivates, miOverlayScreenKey, pScreenPriv);
dixScreenHookWindowDestroy(pScreen, miOverlayWindowDestroy, NULL);
pScreenPriv->InOverlay = inOverlayFunc;
pScreenPriv->MakeTransparent = transFunc;
@ -133,13 +133,11 @@ miInitOverlay(ScreenPtr pScreen,
pScreenPriv->CloseScreen = pScreen->CloseScreen;
pScreenPriv->CreateWindow = pScreen->CreateWindow;
pScreenPriv->DestroyWindow = pScreen->DestroyWindow;
pScreenPriv->UnrealizeWindow = pScreen->UnrealizeWindow;
pScreenPriv->RealizeWindow = pScreen->RealizeWindow;
pScreen->CloseScreen = miOverlayCloseScreen;
pScreen->CreateWindow = miOverlayCreateWindow;
pScreen->DestroyWindow = miOverlayDestroyWindow;
pScreen->UnrealizeWindow = miOverlayUnrealizeWindow;
pScreen->RealizeWindow = miOverlayRealizeWindow;
@ -164,10 +162,10 @@ static Bool
miOverlayCloseScreen(ScreenPtr pScreen)
{
miOverlayScreenPtr pScreenPriv = MIOVERLAY_GET_SCREEN_PRIVATE(pScreen);
dixScreenUnhookWindowDestroy(pScreen, miOverlayWindowDestroy, NULL);
pScreen->CloseScreen = pScreenPriv->CloseScreen;
pScreen->CreateWindow = pScreenPriv->CreateWindow;
pScreen->DestroyWindow = pScreenPriv->DestroyWindow;
pScreen->UnrealizeWindow = pScreenPriv->UnrealizeWindow;
pScreen->RealizeWindow = pScreenPriv->RealizeWindow;
@ -226,13 +224,10 @@ miOverlayCreateWindow(WindowPtr pWin)
return TRUE;
}
static Bool
miOverlayDestroyWindow(WindowPtr pWin)
static void
miOverlayWindowDestroy(ScreenPtr pScreen, WindowPtr pWin, void *arg)
{
ScreenPtr pScreen = pWin->drawable.pScreen;
miOverlayScreenPtr pScreenPriv = MIOVERLAY_GET_SCREEN_PRIVATE(pScreen);
miOverlayTreePtr pTree = MIOVERLAY_GET_WINDOW_TREE(pWin);
Bool result = TRUE;
if (pTree) {
if (pTree->prevSib)
@ -249,14 +244,6 @@ miOverlayDestroyWindow(WindowPtr pWin)
RegionUninit(&(pTree->clipList));
free(pTree);
}
if (pScreenPriv->DestroyWindow) {
pScreen->DestroyWindow = pScreenPriv->DestroyWindow;
result = (*pScreen->DestroyWindow) (pWin);
pScreen->DestroyWindow = miOverlayDestroyWindow;
}
return result;
}
static Bool

View File

@ -265,7 +265,7 @@ miScreenInit(ScreenPtr pScreen, void *pbits, /* pointer to screen bits */
pScreen->SaveScreen = miSaveScreen;
/* GetImage, GetSpans */
pScreen->SourceValidate = miSourceValidate;
/* CreateWindow, DestroyWindow, PositionWindow, ChangeWindowAttributes */
/* CreateWindow, PositionWindow, ChangeWindowAttributes */
/* RealizeWindow, UnrealizeWindow */
pScreen->ValidateTree = miValidateTree;
pScreen->PostValidateTree = (PostValidateTreeProcPtr) 0;