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

View File

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