blob: c7465d0486eb1d88df3f2e90928ccb9687a10106 [file] [log] [blame]
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