| From 9b74df9d87a52885a45d37fe43bb7cc1b7d3b1c4 Mon Sep 17 00:00:00 2001 |
| From: Fabien Dessenne <fabien.dessenne@st.com> |
| Date: Thu, 23 Feb 2017 11:48:13 +0100 |
| Subject: [PATCH] waylandsink: support fullscreen |
| |
| Add the fullscreen property that makes the sink displayed all across |
| the output. |
| |
| --- |
| ext/wayland/gstwaylandsink.c | 32 ++++++++++++++++++++++++++++++-- |
| ext/wayland/gstwaylandsink.h | 1 + |
| ext/wayland/wlwindow.c | 17 +++++++++++++++-- |
| ext/wayland/wlwindow.h | 4 +++- |
| 4 files changed, 49 insertions(+), 5 deletions(-) |
| |
| diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c |
| index 0d97419..d2ff52b 100644 |
| --- a/ext/wayland/gstwaylandsink.c |
| +++ b/ext/wayland/gstwaylandsink.c |
| @@ -61,7 +61,8 @@ enum |
| enum |
| { |
| PROP_0, |
| - PROP_DISPLAY |
| + PROP_DISPLAY, |
| + PROP_FULLSCREEN |
| }; |
| |
| GST_DEBUG_CATEGORY (gstwayland_debug); |
| @@ -163,6 +164,11 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass) |
| g_param_spec_string ("display", "Wayland Display name", "Wayland " |
| "display name to connect to, if not supplied via the GstContext", |
| NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); |
| + |
| + g_object_class_install_property (gobject_class, PROP_FULLSCREEN, |
| + g_param_spec_boolean ("fullscreen", "Fullscreen", |
| + "Whether the surface should be made fullscreen ", FALSE, |
| + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); |
| } |
| |
| static void |
| @@ -173,6 +179,18 @@ gst_wayland_sink_init (GstWaylandSink * sink) |
| } |
| |
| static void |
| +gst_wayland_sink_set_fullscreen (GstWaylandSink * sink, gboolean fullscreen) |
| +{ |
| + if (fullscreen == sink->fullscreen) |
| + return; |
| + |
| + g_mutex_lock (&sink->render_lock); |
| + sink->fullscreen = fullscreen; |
| + gst_wl_window_ensure_fullscreen (sink->window, fullscreen); |
| + g_mutex_unlock (&sink->render_lock); |
| +} |
| + |
| +static void |
| gst_wayland_sink_get_property (GObject * object, |
| guint prop_id, GValue * value, GParamSpec * pspec) |
| { |
| @@ -184,6 +202,11 @@ gst_wayland_sink_get_property (GObject * object, |
| g_value_set_string (value, sink->display_name); |
| GST_OBJECT_UNLOCK (sink); |
| break; |
| + case PROP_FULLSCREEN: |
| + GST_OBJECT_LOCK (sink); |
| + g_value_set_boolean (value, sink->fullscreen); |
| + GST_OBJECT_UNLOCK (sink); |
| + break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
| break; |
| @@ -202,6 +225,11 @@ gst_wayland_sink_set_property (GObject * object, |
| sink->display_name = g_value_dup_string (value); |
| GST_OBJECT_UNLOCK (sink); |
| break; |
| + case PROP_FULLSCREEN: |
| + GST_OBJECT_LOCK (sink); |
| + gst_wayland_sink_set_fullscreen (sink, g_value_get_boolean (value)); |
| + GST_OBJECT_UNLOCK (sink); |
| + break; |
| default: |
| G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); |
| break; |
| @@ -615,7 +643,7 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) |
| if (!sink->window) { |
| /* if we were not provided a window, create one ourselves */ |
| sink->window = gst_wl_window_new_toplevel (sink->display, |
| - &sink->video_info, &sink->render_lock); |
| + &sink->video_info, sink->fullscreen, &sink->render_lock); |
| } |
| } |
| |
| diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h |
| index 2704d00..be92fe7 100644 |
| --- a/ext/wayland/gstwaylandsink.h |
| +++ b/ext/wayland/gstwaylandsink.h |
| @@ -60,6 +60,7 @@ struct _GstWaylandSink |
| |
| gboolean video_info_changed; |
| GstVideoInfo video_info; |
| + gboolean fullscreen; |
| |
| gchar *display_name; |
| |
| diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c |
| index d08ed87..f0b63f7 100644 |
| --- a/ext/wayland/wlwindow.c |
| +++ b/ext/wayland/wlwindow.c |
| @@ -150,9 +150,22 @@ gst_wl_window_new_internal (GstWlDisplay * display, GMutex * render_lock) |
| return window; |
| } |
| |
| +void |
| +gst_wl_window_ensure_fullscreen (GstWlWindow * window, gboolean fullscreen) |
| +{ |
| + if (!window) |
| + return; |
| + |
| + if (fullscreen) |
| + wl_shell_surface_set_fullscreen (window->shell_surface, |
| + WL_SHELL_SURFACE_FULLSCREEN_METHOD_SCALE, 0, NULL); |
| + else |
| + wl_shell_surface_set_toplevel (window->shell_surface); |
| +} |
| + |
| GstWlWindow * |
| gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info, |
| - GMutex * render_lock) |
| + gboolean fullscreen, GMutex * render_lock) |
| { |
| GstWlWindow *window; |
| gint width; |
| @@ -166,7 +179,7 @@ gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info, |
| if (window->shell_surface) { |
| wl_shell_surface_add_listener (window->shell_surface, |
| &shell_surface_listener, window); |
| - wl_shell_surface_set_toplevel (window->shell_surface); |
| + gst_wl_window_ensure_fullscreen (window, fullscreen); |
| } else { |
| GST_ERROR ("Unable to get wl_shell_surface"); |
| |
| diff --git a/ext/wayland/wlwindow.h b/ext/wayland/wlwindow.h |
| index e247b4e..10b49fd 100644 |
| --- a/ext/wayland/wlwindow.h |
| +++ b/ext/wayland/wlwindow.h |
| @@ -74,8 +74,10 @@ struct _GstWlWindowClass |
| |
| GType gst_wl_window_get_type (void); |
| |
| +void gst_wl_window_ensure_fullscreen (GstWlWindow * window, |
| + gboolean fullscreen); |
| GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display, |
| - const GstVideoInfo * info, GMutex * render_lock); |
| + const GstVideoInfo * info, gboolean fullscreen, GMutex * render_lock); |
| GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display, |
| struct wl_surface * parent, GMutex * render_lock); |
| |
| -- |
| 2.7.4 |
| |