From 710079a334475637d701e62e16bd0371c369a58f Mon Sep 17 00:00:00 2001 From: "Enrico Weigelt, metux IT consult" Date: Mon, 28 Apr 2025 19:28:30 +0200 Subject: [PATCH] xwayland: 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 --- hw/xwayland/xwayland-glamor-xv.c | 22 +++++++++++----------- hw/xwayland/xwayland-screen.c | 13 ++++--------- hw/xwayland/xwayland-screen.h | 1 - 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/hw/xwayland/xwayland-glamor-xv.c b/hw/xwayland/xwayland-glamor-xv.c index d0aaa02c7..85cc1dc68 100644 --- a/hw/xwayland/xwayland-glamor-xv.c +++ b/hw/xwayland/xwayland-glamor-xv.c @@ -34,6 +34,7 @@ #include +#include "dix/screen_hooks_priv.h" #include "Xext/xvdix_priv.h" #include "glamor_priv.h" @@ -50,8 +51,6 @@ static DevPrivateKeyRec xwlXvScreenPrivateKeyRec; typedef struct { XvAdaptorPtr glxv_adaptor; /* We have only one adaptor, glamor Xv */ glamor_port_private *port_privates; - - CloseScreenProcPtr CloseScreen; } xwlXvScreenRec, *xwlXvScreenPtr; typedef struct { @@ -374,23 +373,24 @@ failed: return FALSE; } -static Bool -xwl_glamor_xv_close_screen(ScreenPtr pScreen) +static void xwl_glamor_xv_close_screen(CallbackListPtr *pcbl, + ScreenPtr pScreen, void *unused) { - xwlXvScreenPtr xwlXvScreen; + dixScreenUnhookClose(pScreen, xwl_glamor_xv_close_screen); + xwlXvScreenPtr xwlXvScreen; xwlXvScreen = dixLookupPrivate(&(pScreen)->devPrivates, xwlXvScreenPrivateKey); + if (!xwlXvScreen) + return; + if (xwlXvScreen->glxv_adaptor) { XvFreeAdaptor(xwlXvScreen->glxv_adaptor); free(xwlXvScreen->glxv_adaptor); } free(xwlXvScreen->port_privates); - - pScreen->CloseScreen = xwlXvScreen->CloseScreen; - - return pScreen->CloseScreen(pScreen); + dixSetPrivate(&(pScreen)->devPrivates, xwlXvScreenPrivateKey, NULL); } Bool @@ -407,8 +407,8 @@ xwl_glamor_xv_init(ScreenPtr pScreen) xwlXvScreen->port_privates = NULL; xwlXvScreen->glxv_adaptor = NULL; - xwlXvScreen->CloseScreen = pScreen->CloseScreen; - pScreen->CloseScreen = xwl_glamor_xv_close_screen; + + dixScreenHookClose(pScreen, xwl_glamor_xv_close_screen); glamor_xv_core_init(pScreen); diff --git a/hw/xwayland/xwayland-screen.c b/hw/xwayland/xwayland-screen.c index a1cdc67cb..8b7fe93af 100644 --- a/hw/xwayland/xwayland-screen.c +++ b/hw/xwayland/xwayland-screen.c @@ -236,8 +236,8 @@ xwl_root_window_finalized_callback(CallbackListPtr *pcbl, DeleteCallback(&RootWindowFinalizeCallback, xwl_root_window_finalized_callback, screen); } -Bool -xwl_close_screen(ScreenPtr screen) +static void xwl_close_screen(CallbackListPtr *pcbl, + ScreenPtr screen, void *unused) { struct xwl_screen *xwl_screen = xwl_screen_get(screen); struct xwl_output *xwl_output, *next_xwl_output; @@ -246,6 +246,7 @@ xwl_close_screen(ScreenPtr screen) #ifdef XWL_HAS_GLAMOR xwl_dmabuf_feedback_destroy(&xwl_screen->default_feedback); #endif + dixScreenUnhookClose(screen, xwl_close_screen); DeleteCallback(&PropertyStateCallback, xwl_property_callback, screen); XaceDeleteCallback(XACE_PROPERTY_ACCESS, xwl_access_property_callback, screen); @@ -276,11 +277,7 @@ xwl_close_screen(ScreenPtr screen) wl_display_disconnect(xwl_screen->display); - screen->CloseScreen = xwl_screen->CloseScreen; - free(xwl_screen); - - return screen->CloseScreen(screen); } static struct xwl_seat * @@ -1138,9 +1135,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv) pScreen->UnrealizeWindow = xwl_unrealize_window; dixScreenHookWindowDestroy(pScreen, xwl_window_destroy); - - xwl_screen->CloseScreen = pScreen->CloseScreen; - pScreen->CloseScreen = xwl_close_screen; + dixScreenHookClose(pScreen, xwl_close_screen); xwl_screen->ChangeWindowAttributes = pScreen->ChangeWindowAttributes; pScreen->ChangeWindowAttributes = xwl_change_window_attributes; diff --git a/hw/xwayland/xwayland-screen.h b/hw/xwayland/xwayland-screen.h index 5674c93c8..6584c66e3 100644 --- a/hw/xwayland/xwayland-screen.h +++ b/hw/xwayland/xwayland-screen.h @@ -169,7 +169,6 @@ struct xwl_output *xwl_screen_get_fixed_or_first_output(struct xwl_screen *xwl_s int xwl_screen_get_width(struct xwl_screen *xwl_screen); int xwl_screen_get_height(struct xwl_screen *xwl_screen); -Bool xwl_close_screen(ScreenPtr screen); Bool xwl_screen_init(ScreenPtr pScreen, int argc, char **argv); void xwl_sync_events (struct xwl_screen *xwl_screen); void xwl_screen_roundtrip (struct xwl_screen *xwl_screen);