summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRob Bradford <rob@linux.intel.com>2012-10-04 17:39:52 +0100
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-10-05 12:02:47 +0200
commitb5409e6b78a9786a5edf9126350095d36f5c0973 (patch)
tree739d78230160abfe5f19c5a7e210b28b4e3f31db
parentadd4f3a298769ffbb99a0fcd1da5cb34c283cd2b (diff)
wayland: add support for windowed mode.
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. Reviewed-by: Joe Konno <joe.konno@intel.com> Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
-rw-r--r--gst-libs/gst/vaapi/gstvaapiwindow_wayland.c57
1 files changed, 42 insertions, 15 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapiwindow_wayland.c b/gst-libs/gst/vaapi/gstvaapiwindow_wayland.c
index 2607c643..ac170ca3 100644
--- a/gst-libs/gst/vaapi/gstvaapiwindow_wayland.c
+++ b/gst-libs/gst/vaapi/gstvaapiwindow_wayland.c
@@ -50,7 +50,9 @@ struct _GstVaapiWindowWaylandPrivate {
struct wl_surface *surface;
struct wl_buffer *buffer;
struct wl_region *opaque_region;
- guint redraw_pending : 1;
+ guint redraw_pending : 1;
+ guint is_shown : 1;
+ guint fullscreen_on_show : 1;
};
static gboolean
@@ -94,6 +96,31 @@ 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_toplevel(priv->shell_surface);
+ else {
+ wl_shell_surface_set_fullscreen(
+ priv->shell_surface,
+ WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE,
+ 0,
+ NULL
+ );
+ }
+
+ return TRUE;
+}
+
+static gboolean
gst_vaapi_window_wayland_create(
GstVaapiWindow *window,
guint *width,
@@ -122,14 +149,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 +326,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