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 <X11/extensions/Xv.h>
|
||||||
|
|
||||||
|
#include "dix/screen_hooks_priv.h"
|
||||||
#include "Xext/xvdix_priv.h"
|
#include "Xext/xvdix_priv.h"
|
||||||
|
|
||||||
#include "glamor_priv.h"
|
#include "glamor_priv.h"
|
||||||
|
@ -50,8 +51,6 @@ static DevPrivateKeyRec xwlXvScreenPrivateKeyRec;
|
||||||
typedef struct {
|
typedef struct {
|
||||||
XvAdaptorPtr glxv_adaptor; /* We have only one adaptor, glamor Xv */
|
XvAdaptorPtr glxv_adaptor; /* We have only one adaptor, glamor Xv */
|
||||||
glamor_port_private *port_privates;
|
glamor_port_private *port_privates;
|
||||||
|
|
||||||
CloseScreenProcPtr CloseScreen;
|
|
||||||
} xwlXvScreenRec, *xwlXvScreenPtr;
|
} xwlXvScreenRec, *xwlXvScreenPtr;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -374,23 +373,24 @@ failed:
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static Bool
|
static void xwl_glamor_xv_close_screen(CallbackListPtr *pcbl,
|
||||||
xwl_glamor_xv_close_screen(ScreenPtr pScreen)
|
ScreenPtr pScreen, void *unused)
|
||||||
{
|
{
|
||||||
xwlXvScreenPtr xwlXvScreen;
|
dixScreenUnhookClose(pScreen, xwl_glamor_xv_close_screen);
|
||||||
|
|
||||||
|
xwlXvScreenPtr xwlXvScreen;
|
||||||
xwlXvScreen = dixLookupPrivate(&(pScreen)->devPrivates,
|
xwlXvScreen = dixLookupPrivate(&(pScreen)->devPrivates,
|
||||||
xwlXvScreenPrivateKey);
|
xwlXvScreenPrivateKey);
|
||||||
|
|
||||||
|
if (!xwlXvScreen)
|
||||||
|
return;
|
||||||
|
|
||||||
if (xwlXvScreen->glxv_adaptor) {
|
if (xwlXvScreen->glxv_adaptor) {
|
||||||
XvFreeAdaptor(xwlXvScreen->glxv_adaptor);
|
XvFreeAdaptor(xwlXvScreen->glxv_adaptor);
|
||||||
free(xwlXvScreen->glxv_adaptor);
|
free(xwlXvScreen->glxv_adaptor);
|
||||||
}
|
}
|
||||||
free(xwlXvScreen->port_privates);
|
free(xwlXvScreen->port_privates);
|
||||||
|
dixSetPrivate(&(pScreen)->devPrivates, xwlXvScreenPrivateKey, NULL);
|
||||||
pScreen->CloseScreen = xwlXvScreen->CloseScreen;
|
|
||||||
|
|
||||||
return pScreen->CloseScreen(pScreen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
|
@ -407,8 +407,8 @@ xwl_glamor_xv_init(ScreenPtr pScreen)
|
||||||
|
|
||||||
xwlXvScreen->port_privates = NULL;
|
xwlXvScreen->port_privates = NULL;
|
||||||
xwlXvScreen->glxv_adaptor = 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);
|
glamor_xv_core_init(pScreen);
|
||||||
|
|
||||||
|
|
|
@ -236,8 +236,8 @@ xwl_root_window_finalized_callback(CallbackListPtr *pcbl,
|
||||||
DeleteCallback(&RootWindowFinalizeCallback, xwl_root_window_finalized_callback, screen);
|
DeleteCallback(&RootWindowFinalizeCallback, xwl_root_window_finalized_callback, screen);
|
||||||
}
|
}
|
||||||
|
|
||||||
Bool
|
static void xwl_close_screen(CallbackListPtr *pcbl,
|
||||||
xwl_close_screen(ScreenPtr screen)
|
ScreenPtr screen, void *unused)
|
||||||
{
|
{
|
||||||
struct xwl_screen *xwl_screen = xwl_screen_get(screen);
|
struct xwl_screen *xwl_screen = xwl_screen_get(screen);
|
||||||
struct xwl_output *xwl_output, *next_xwl_output;
|
struct xwl_output *xwl_output, *next_xwl_output;
|
||||||
|
@ -246,6 +246,7 @@ xwl_close_screen(ScreenPtr screen)
|
||||||
#ifdef XWL_HAS_GLAMOR
|
#ifdef XWL_HAS_GLAMOR
|
||||||
xwl_dmabuf_feedback_destroy(&xwl_screen->default_feedback);
|
xwl_dmabuf_feedback_destroy(&xwl_screen->default_feedback);
|
||||||
#endif
|
#endif
|
||||||
|
dixScreenUnhookClose(screen, xwl_close_screen);
|
||||||
DeleteCallback(&PropertyStateCallback, xwl_property_callback, screen);
|
DeleteCallback(&PropertyStateCallback, xwl_property_callback, screen);
|
||||||
XaceDeleteCallback(XACE_PROPERTY_ACCESS, xwl_access_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);
|
wl_display_disconnect(xwl_screen->display);
|
||||||
|
|
||||||
screen->CloseScreen = xwl_screen->CloseScreen;
|
|
||||||
|
|
||||||
free(xwl_screen);
|
free(xwl_screen);
|
||||||
|
|
||||||
return screen->CloseScreen(screen);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct xwl_seat *
|
static struct xwl_seat *
|
||||||
|
@ -1138,9 +1135,7 @@ xwl_screen_init(ScreenPtr pScreen, int argc, char **argv)
|
||||||
pScreen->UnrealizeWindow = xwl_unrealize_window;
|
pScreen->UnrealizeWindow = xwl_unrealize_window;
|
||||||
|
|
||||||
dixScreenHookWindowDestroy(pScreen, xwl_window_destroy);
|
dixScreenHookWindowDestroy(pScreen, xwl_window_destroy);
|
||||||
|
dixScreenHookClose(pScreen, xwl_close_screen);
|
||||||
xwl_screen->CloseScreen = pScreen->CloseScreen;
|
|
||||||
pScreen->CloseScreen = xwl_close_screen;
|
|
||||||
|
|
||||||
xwl_screen->ChangeWindowAttributes = pScreen->ChangeWindowAttributes;
|
xwl_screen->ChangeWindowAttributes = pScreen->ChangeWindowAttributes;
|
||||||
pScreen->ChangeWindowAttributes = xwl_change_window_attributes;
|
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_width(struct xwl_screen *xwl_screen);
|
||||||
int xwl_screen_get_height(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);
|
Bool xwl_screen_init(ScreenPtr pScreen, int argc, char **argv);
|
||||||
void xwl_sync_events (struct xwl_screen *xwl_screen);
|
void xwl_sync_events (struct xwl_screen *xwl_screen);
|
||||||
void xwl_screen_roundtrip (struct xwl_screen *xwl_screen);
|
void xwl_screen_roundtrip (struct xwl_screen *xwl_screen);
|
||||||
|
|
Loading…
Reference in New Issue