Don't show window by default during creation.
authorgb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Wed, 17 Mar 2010 07:17:17 +0000 (07:17 +0000)
committergb <gb@5584edef-b1fe-4b99-b61b-dd2bab72e969>
Wed, 17 Mar 2010 07:17:17 +0000 (07:17 +0000)
gst-libs/gst/vaapi/gstvaapiwindow_x11.c
tests/test-windows.c

index 632f79c..2b85b70 100644 (file)
@@ -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 *
index 07db884..e09fd77 100644 (file)
@@ -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");