[Libva] [PATCH 1/2] wayland: Support windowed mode

Rob Bradford robert.bradford at intel.com
Thu Oct 4 09:39:52 PDT 2012


From: Rob Bradford <rob at linux.intel.com>

Rather than always making the surface fullscreen instead implement the
set_fullscreen vfunc on GstVaapiWindow and then set the shell surface
fullscreen on not depending on that.
---
 gst-libs/gst/vaapi/gstvaapiwindow_wayland.c | 57 ++++++++++++++++++++++-------
 1 file changed, 43 insertions(+), 14 deletions(-)

diff --git a/gst-libs/gst/vaapi/gstvaapiwindow_wayland.c b/gst-libs/gst/vaapi/gstvaapiwindow_wayland.c
index 2607c64..ce78717 100644
--- a/gst-libs/gst/vaapi/gstvaapiwindow_wayland.c
+++ b/gst-libs/gst/vaapi/gstvaapiwindow_wayland.c
@@ -51,6 +51,8 @@ struct _GstVaapiWindowWaylandPrivate {
     struct wl_buffer           *buffer;
     struct wl_region           *opaque_region;
     guint                       redraw_pending  : 1;
+    guint                       fullscreen_on_show  : 1;
+    guint                       is_shown  : 1;
 };
 
 static gboolean
@@ -94,6 +96,33 @@ static const struct wl_shell_surface_listener shell_surface_listener = {
 };
 
 static gboolean
+gst_vaapi_window_wayland_set_fullscreen(GstVaapiWindow *window, gboolean fullscreen)
+{
+    GstVaapiWindowWaylandPrivate * const priv =
+        GST_VAAPI_WINDOW_WAYLAND(window)->priv;
+
+    if (!priv->is_shown) {
+        priv->fullscreen_on_show = fullscreen;
+        return TRUE;
+    }
+
+    if (fullscreen) {
+        wl_shell_surface_set_fullscreen(
+            priv->shell_surface,
+            WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE,
+            0,
+            NULL
+        );
+    } else {
+        wl_shell_surface_set_toplevel(
+            priv->shell_surface
+        );
+    }
+
+    return TRUE;
+}
+
+static gboolean
 gst_vaapi_window_wayland_create(
     GstVaapiWindow *window,
     guint          *width,
@@ -122,14 +151,13 @@ gst_vaapi_window_wayland_create(
     wl_shell_surface_add_listener(priv->shell_surface,
                                   &shell_surface_listener, priv);
     wl_shell_surface_set_toplevel(priv->shell_surface);
-    wl_shell_surface_set_fullscreen(
-        priv->shell_surface,
-        WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE,
-        0,
-        NULL
-    );
+
+    if (priv->fullscreen_on_show)
+        gst_vaapi_window_wayland_set_fullscreen(window, TRUE);
 
     priv->redraw_pending = FALSE;
+    priv->is_shown = TRUE;
+
     return TRUE;
 }
 
@@ -300,15 +328,16 @@ gst_vaapi_window_wayland_class_init(GstVaapiWindowWaylandClass * klass)
 
     g_type_class_add_private(klass, sizeof(GstVaapiWindowWaylandPrivate));
 
-    object_class->finalize      = gst_vaapi_window_wayland_finalize;
-    object_class->constructed   = gst_vaapi_window_wayland_constructed;
+    object_class->finalize       = gst_vaapi_window_wayland_finalize;
+    object_class->constructed    = gst_vaapi_window_wayland_constructed;
 
-    window_class->create        = gst_vaapi_window_wayland_create;
-    window_class->destroy       = gst_vaapi_window_wayland_destroy;
-    window_class->show          = gst_vaapi_window_wayland_show;
-    window_class->hide          = gst_vaapi_window_wayland_hide;
-    window_class->render        = gst_vaapi_window_wayland_render;
-    window_class->resize        = gst_vaapi_window_wayland_resize;
+    window_class->create         = gst_vaapi_window_wayland_create;
+    window_class->destroy        = gst_vaapi_window_wayland_destroy;
+    window_class->show           = gst_vaapi_window_wayland_show;
+    window_class->hide           = gst_vaapi_window_wayland_hide;
+    window_class->render         = gst_vaapi_window_wayland_render;
+    window_class->resize         = gst_vaapi_window_wayland_resize;
+    window_class->set_fullscreen = gst_vaapi_window_wayland_set_fullscreen;
 }
 
 static void
-- 
1.7.11.2



More information about the Libva mailing list