From 912684b9049d4b0c5aa8a41166a1f56957756c85 Mon Sep 17 00:00:00 2001 From: gb Date: Wed, 17 Mar 2010 07:17:17 +0000 Subject: [PATCH] Don't show window by default during creation. --- gst-libs/gst/vaapi/gstvaapiwindow_x11.c | 40 ++++++++++++++++++++++----------- tests/test-windows.c | 7 +++--- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/gst-libs/gst/vaapi/gstvaapiwindow_x11.c b/gst-libs/gst/vaapi/gstvaapiwindow_x11.c index 632f79c..2b85b70 100644 --- a/gst-libs/gst/vaapi/gstvaapiwindow_x11.c +++ b/gst-libs/gst/vaapi/gstvaapiwindow_x11.c @@ -34,9 +34,10 @@ G_DEFINE_TYPE(GstVaapiWindowX11, gst_vaapi_window_x11, GST_VAAPI_TYPE_WINDOW); GstVaapiWindowX11Private)) struct _GstVaapiWindowX11Private { - gboolean create_window; GstVaapiDisplay *display; Window xid; + unsigned int create_window : 1; + unsigned int is_visible : 1; }; enum { @@ -52,10 +53,18 @@ gst_vaapi_window_x11_show(GstVaapiWindow *window) GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv; Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display); + if (priv->is_visible) + return TRUE; + x11_trap_errors(); XMapWindow(dpy, priv->xid); - x11_wait_event(dpy, priv->xid, MapNotify); - return x11_untrap_errors() == 0; + if (priv->create_window) + x11_wait_event(dpy, priv->xid, MapNotify); + if (x11_untrap_errors() != 0) + return FALSE; + + priv->is_visible = TRUE; + return TRUE; } static gboolean @@ -64,10 +73,18 @@ gst_vaapi_window_x11_hide(GstVaapiWindow *window) GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv; Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display); + if (!priv->is_visible) + return TRUE; + x11_trap_errors(); XUnmapWindow(dpy, priv->xid); - x11_wait_event(dpy, priv->xid, UnmapNotify); - return x11_untrap_errors() == 0; + if (priv->create_window) + x11_wait_event(dpy, priv->xid, UnmapNotify); + if (x11_untrap_errors() != 0) + return FALSE; + + priv->is_visible = FALSE; + return TRUE; } static gboolean @@ -82,13 +99,11 @@ gst_vaapi_window_x11_create(GstVaapiWindow *window, guint width, guint height) dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display); priv->xid = x11_create_window(dpy, width, height); - if (!gst_vaapi_window_x11_show(window)) + if (!priv->xid) return FALSE; - x11_trap_errors(); XRaiseWindow(dpy, priv->xid); - XSync(dpy, False); - return x11_untrap_errors() == 0; + return TRUE; } static void @@ -98,10 +113,8 @@ gst_vaapi_window_x11_destroy(GstVaapiWindow *window) Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display); if (priv->xid) { - if (priv->create_window) { - gst_vaapi_window_x11_hide(window); + if (priv->create_window) XDestroyWindow(dpy, priv->xid); - } priv->xid = None; } @@ -291,9 +304,10 @@ gst_vaapi_window_x11_init(GstVaapiWindowX11 *window) GstVaapiWindowX11Private *priv = GST_VAAPI_WINDOW_X11_GET_PRIVATE(window); window->priv = priv; - priv->create_window = TRUE; priv->display = NULL; priv->xid = None; + priv->create_window = TRUE; + priv->is_visible = FALSE; } GstVaapiWindow * diff --git a/tests/test-windows.c b/tests/test-windows.c index 07db884..e09fd77 100644 --- a/tests/test-windows.c +++ b/tests/test-windows.c @@ -212,6 +212,8 @@ main(int argc, char *argv[]) if (!window) g_error("could not create window"); + gst_vaapi_window_show(window); + if (!gst_vaapi_window_put_surface(window, surface, flags)) g_error("could not render surface"); @@ -243,13 +245,12 @@ main(int argc, char *argv[]) if (!win) g_error("could not create X window"); - XMapRaised(dpy, win); - XSync(dpy, False); - window = gst_vaapi_window_x11_new_with_xid(display, win); if (!window) g_error("could not create window"); + gst_vaapi_window_show(window); + if (!gst_vaapi_window_put_surface(window, surface, flags)) g_error("could not render surface"); -- 2.7.4