xfree86: dri: 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 15:53:49 +02:00
parent b60581e393
commit 0a50759af4
3 changed files with 5 additions and 30 deletions

View File

@ -46,7 +46,6 @@ typedef struct dri3_dmabuf_format {
typedef struct dri3_screen_priv { typedef struct dri3_screen_priv {
CloseScreenProcPtr CloseScreen; CloseScreenProcPtr CloseScreen;
ConfigNotifyProcPtr ConfigNotify; ConfigNotifyProcPtr ConfigNotify;
DestroyWindowProcPtr DestroyWindow;
Bool formats_cached; Bool formats_cached;
CARD32 num_formats; CARD32 num_formats;

View File

@ -48,6 +48,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include <X11/Xproto.h> #include <X11/Xproto.h>
#include "dix/dix_priv.h" #include "dix/dix_priv.h"
#include "dix/screen_hooks_priv.h"
#include "xf86.h" #include "xf86.h"
#include "xf86drm.h" #include "xf86drm.h"
@ -644,7 +645,7 @@ DRIScreenInit(ScreenPtr pScreen, DRIInfoPtr pDRIInfo, int *pDRMFD)
return TRUE; return TRUE;
} }
static Bool DRIDestroyWindow(WindowPtr pWin); static void DRIWindowDestroy(CallbackListPtr *pcbl, ScreenPtr pScreen, WindowPtr pWin);
Bool Bool
DRIFinishScreenInit(ScreenPtr pScreen) DRIFinishScreenInit(ScreenPtr pScreen)
@ -660,8 +661,7 @@ DRIFinishScreenInit(ScreenPtr pScreen)
pScreen->WindowExposures = pDRIInfo->wrap.WindowExposures; pScreen->WindowExposures = pDRIInfo->wrap.WindowExposures;
} }
pDRIPriv->DestroyWindow = pScreen->DestroyWindow; dixScreenHookWindowDestroy(pScreen, DRIWindowDestroy);
pScreen->DestroyWindow = DRIDestroyWindow;
pDRIPriv->xf86_crtc_notify = xf86_wrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify = xf86_wrap_crtc_notify(pScreen,
dri_crtc_notify); dri_crtc_notify);
@ -708,11 +708,8 @@ DRICloseScreen(ScreenPtr pScreen)
pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures; pScreen->WindowExposures = pDRIPriv->wrap.WindowExposures;
pDRIPriv->wrap.WindowExposures = NULL; pDRIPriv->wrap.WindowExposures = NULL;
} }
if (pDRIPriv->DestroyWindow) {
pScreen->DestroyWindow = pDRIPriv->DestroyWindow;
pDRIPriv->DestroyWindow = NULL;
}
dixScreenUnhookWindowDestroy(pScreen, DRIWindowDestroy);
xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify); xf86_unwrap_crtc_notify(pScreen, pDRIPriv->xf86_crtc_notify);
if (pDRIInfo->wrap.CopyWindow) { if (pDRIInfo->wrap.CopyWindow) {
@ -1990,29 +1987,9 @@ DRITreeTraversal(WindowPtr pWin, void *data)
return WT_WALKCHILDREN; return WT_WALKCHILDREN;
} }
static Bool static void DRIWindowDestroy(CallbackListPtr *pcbl, ScreenPtr pScreen, WindowPtr pWin)
DRIDestroyWindow(WindowPtr pWin)
{ {
ScreenPtr pScreen = pWin->drawable.pScreen;
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
Bool retval = TRUE;
DRIDrawablePrivDestroy(pWin); DRIDrawablePrivDestroy(pWin);
/* call lower wrapped functions */
if (pDRIPriv->DestroyWindow) {
/* unwrap */
pScreen->DestroyWindow = pDRIPriv->DestroyWindow;
/* call lower layers */
retval = (*pScreen->DestroyWindow) (pWin);
/* rewrap */
pDRIPriv->DestroyWindow = pScreen->DestroyWindow;
pScreen->DestroyWindow = DRIDestroyWindow;
}
return retval;
} }
void void

View File

@ -86,7 +86,6 @@ typedef struct _DRIScreenPrivRec {
DrawablePtr fullscreen; /* pointer to fullscreen drawable */ DrawablePtr fullscreen; /* pointer to fullscreen drawable */
drm_clip_rect_t fullscreen_rect; /* fake rect for fullscreen mode */ drm_clip_rect_t fullscreen_rect; /* fake rect for fullscreen mode */
DRIWrappedFuncsRec wrap; DRIWrappedFuncsRec wrap;
DestroyWindowProcPtr DestroyWindow;
DrawablePtr DRIDrawables[SAREA_MAX_DRAWABLES]; DrawablePtr DRIDrawables[SAREA_MAX_DRAWABLES];
DRIContextPrivPtr dummyCtxPriv; /* Pointer to dummy context */ DRIContextPrivPtr dummyCtxPriv; /* Pointer to dummy context */
Bool createDummyCtx; Bool createDummyCtx;