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 <info@metux.net>
This commit is contained in:
Enrico Weigelt, metux IT consult 2025-04-28 19:28:30 +02:00
parent c927d13ed8
commit 710079a334
3 changed files with 15 additions and 21 deletions

View File

@ -34,6 +34,7 @@
#include <X11/extensions/Xv.h>
#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);

View File

@ -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;

View File

@ -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);