From a9eb1e0a5aaf76a019547a0fd9865523c0564b23 Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Fri, 20 Sep 2024 20:30:33 +0200 Subject: [PATCH] (!1714) rootless: use window destructor hook Wrapping ScreenRec's function pointers is problematic for many reasons, so use the new window destructor hook instead. 2do: should check whether it's better to directly assign the screen procs, w/o any wrapping at all. Signed-off-by: Enrico Weigelt, metux IT consult --- miext/rootless/rootlessCommon.h | 1 - miext/rootless/rootlessScreen.c | 3 ++- miext/rootless/rootlessWindow.c | 18 ++++-------------- miext/rootless/rootlessWindow.h | 2 +- 4 files changed, 7 insertions(+), 17 deletions(-) diff --git a/miext/rootless/rootlessCommon.h b/miext/rootless/rootlessCommon.h index 40400b395..1e236bb9d 100644 --- a/miext/rootless/rootlessCommon.h +++ b/miext/rootless/rootlessCommon.h @@ -84,7 +84,6 @@ typedef struct _RootlessScreenRec { CloseScreenProcPtr CloseScreen; CreateWindowProcPtr CreateWindow; - DestroyWindowProcPtr DestroyWindow; RealizeWindowProcPtr RealizeWindow; UnrealizeWindowProcPtr UnrealizeWindow; MoveWindowProcPtr MoveWindow; diff --git a/miext/rootless/rootlessScreen.c b/miext/rootless/rootlessScreen.c index b57018242..3fe76d47a 100644 --- a/miext/rootless/rootlessScreen.c +++ b/miext/rootless/rootlessScreen.c @@ -649,6 +649,8 @@ RootlessWrap(ScreenPtr pScreen) { RootlessScreenRec *s = SCREENREC(pScreen); + dixScreenHookWindowDestroy(pScreen, RootlessWindowDestroy, NULL); + #define WRAP(a) \ if (pScreen->a) { \ s->a = pScreen->a; \ @@ -666,7 +668,6 @@ RootlessWrap(ScreenPtr pScreen) WRAP(GetImage); WRAP(SourceValidate); WRAP(CreateWindow); - WRAP(DestroyWindow); WRAP(RealizeWindow); WRAP(UnrealizeWindow); WRAP(MoveWindow); diff --git a/miext/rootless/rootlessWindow.c b/miext/rootless/rootlessWindow.c index 68df06c89..53a99f7e6 100644 --- a/miext/rootless/rootlessWindow.c +++ b/miext/rootless/rootlessWindow.c @@ -186,24 +186,14 @@ RootlessDestroyFrame(WindowPtr pWin, RootlessWindowPtr winRec) } /* - * RootlessDestroyWindow - * Destroy the physical window associated with the given window. + * @brief window destructor: remove physical window associated with given window */ -Bool -RootlessDestroyWindow(WindowPtr pWin) +void +RootlessWindowDestroy(ScreenPtr pScreen, WindowPtr pWin, void *arg) { RootlessWindowRec *winRec = WINREC(pWin); - Bool result; - - if (winRec != NULL) { + if (winRec != NULL) RootlessDestroyFrame(pWin, winRec); - } - - SCREEN_UNWRAP(pWin->drawable.pScreen, DestroyWindow); - result = pWin->drawable.pScreen->DestroyWindow(pWin); - SCREEN_WRAP(pWin->drawable.pScreen, DestroyWindow); - - return result; } static Bool diff --git a/miext/rootless/rootlessWindow.h b/miext/rootless/rootlessWindow.h index 4fd34d54d..64ee28a70 100644 --- a/miext/rootless/rootlessWindow.h +++ b/miext/rootless/rootlessWindow.h @@ -37,7 +37,7 @@ #include "rootlessCommon.h" Bool RootlessCreateWindow(WindowPtr pWin); -Bool RootlessDestroyWindow(WindowPtr pWin); +void RootlessWindowDestroy(ScreenPtr pScreen, WindowPtr pWin, void *arg); void RootlessSetShape(WindowPtr pWin, int kind);