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:
parent
c927d13ed8
commit
710079a334
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue