diff options
author | Rob Bradford <rob@linux.intel.com> | 2012-10-04 17:39:52 +0100 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-10-05 12:02:47 +0200 |
commit | b5409e6b78a9786a5edf9126350095d36f5c0973 (patch) | |
tree | 739d78230160abfe5f19c5a7e210b28b4e3f31db /gst-libs/gst/vaapi | |
parent | add4f3a298769ffbb99a0fcd1da5cb34c283cd2b (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>
Diffstat (limited to 'gst-libs/gst/vaapi')
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapiwindow_wayland.c | 57 |
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 |