mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-18 12:15:19 +00:00
waylandsink: support fullscreen
Add the fullscreen property that makes the sink displayed all across the output. https://bugzilla.gnome.org/show_bug.cgi?id=688190
This commit is contained in:
parent
8a16531b6a
commit
f777c66dcc
4 changed files with 49 additions and 5 deletions
|
@ -61,7 +61,8 @@ enum
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_DISPLAY
|
PROP_DISPLAY,
|
||||||
|
PROP_FULLSCREEN
|
||||||
};
|
};
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY (gstwayland_debug);
|
GST_DEBUG_CATEGORY (gstwayland_debug);
|
||||||
|
@ -202,6 +203,11 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
|
||||||
g_param_spec_string ("display", "Wayland Display name", "Wayland "
|
g_param_spec_string ("display", "Wayland Display name", "Wayland "
|
||||||
"display name to connect to, if not supplied via the GstContext",
|
"display name to connect to, if not supplied via the GstContext",
|
||||||
NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
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
|
static void
|
||||||
|
@ -211,6 +217,18 @@ gst_wayland_sink_init (GstWaylandSink * sink)
|
||||||
g_mutex_init (&sink->render_lock);
|
g_mutex_init (&sink->render_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
static void
|
||||||
gst_wayland_sink_get_property (GObject * object,
|
gst_wayland_sink_get_property (GObject * object,
|
||||||
guint prop_id, GValue * value, GParamSpec * pspec)
|
guint prop_id, GValue * value, GParamSpec * pspec)
|
||||||
|
@ -223,6 +241,11 @@ gst_wayland_sink_get_property (GObject * object,
|
||||||
g_value_set_string (value, sink->display_name);
|
g_value_set_string (value, sink->display_name);
|
||||||
GST_OBJECT_UNLOCK (sink);
|
GST_OBJECT_UNLOCK (sink);
|
||||||
break;
|
break;
|
||||||
|
case PROP_FULLSCREEN:
|
||||||
|
GST_OBJECT_LOCK (sink);
|
||||||
|
g_value_set_boolean (value, sink->fullscreen);
|
||||||
|
GST_OBJECT_UNLOCK (sink);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -241,6 +264,11 @@ gst_wayland_sink_set_property (GObject * object,
|
||||||
sink->display_name = g_value_dup_string (value);
|
sink->display_name = g_value_dup_string (value);
|
||||||
GST_OBJECT_UNLOCK (sink);
|
GST_OBJECT_UNLOCK (sink);
|
||||||
break;
|
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:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -659,7 +687,7 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer)
|
||||||
if (!sink->window) {
|
if (!sink->window) {
|
||||||
/* if we were not provided a window, create one ourselves */
|
/* if we were not provided a window, create one ourselves */
|
||||||
sink->window = gst_wl_window_new_toplevel (sink->display,
|
sink->window = gst_wl_window_new_toplevel (sink->display,
|
||||||
&sink->video_info, &sink->render_lock);
|
&sink->video_info, sink->fullscreen, &sink->render_lock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,6 +60,7 @@ struct _GstWaylandSink
|
||||||
|
|
||||||
gboolean video_info_changed;
|
gboolean video_info_changed;
|
||||||
GstVideoInfo video_info;
|
GstVideoInfo video_info;
|
||||||
|
gboolean fullscreen;
|
||||||
|
|
||||||
gchar *display_name;
|
gchar *display_name;
|
||||||
|
|
||||||
|
|
|
@ -150,9 +150,22 @@ gst_wl_window_new_internal (GstWlDisplay * display, GMutex * render_lock)
|
||||||
return window;
|
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 *
|
GstWlWindow *
|
||||||
gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info,
|
gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info,
|
||||||
GMutex * render_lock)
|
gboolean fullscreen, GMutex * render_lock)
|
||||||
{
|
{
|
||||||
GstWlWindow *window;
|
GstWlWindow *window;
|
||||||
gint width;
|
gint width;
|
||||||
|
@ -166,7 +179,7 @@ gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info,
|
||||||
if (window->shell_surface) {
|
if (window->shell_surface) {
|
||||||
wl_shell_surface_add_listener (window->shell_surface,
|
wl_shell_surface_add_listener (window->shell_surface,
|
||||||
&shell_surface_listener, window);
|
&shell_surface_listener, window);
|
||||||
wl_shell_surface_set_toplevel (window->shell_surface);
|
gst_wl_window_ensure_fullscreen (window, fullscreen);
|
||||||
} else {
|
} else {
|
||||||
GST_ERROR ("Unable to get wl_shell_surface");
|
GST_ERROR ("Unable to get wl_shell_surface");
|
||||||
|
|
||||||
|
|
|
@ -74,8 +74,10 @@ struct _GstWlWindowClass
|
||||||
|
|
||||||
GType gst_wl_window_get_type (void);
|
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,
|
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,
|
GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display,
|
||||||
struct wl_surface * parent, GMutex * render_lock);
|
struct wl_surface * parent, GMutex * render_lock);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue