From b8bbab864a1367ac47bcc0998b4c07d20020965a Mon Sep 17 00:00:00 2001 From: Marius Vlad Date: Thu, 5 Oct 2023 18:23:52 +0300 Subject: [PATCH] ext/wayland: Add title/appid support Upstream-Status: Pending Bug-AGL: SPEC-4870 Signed-off-by: Marius Vlad --- ext/wayland/gstwaylandsink.c | 41 +++++++++++++++++++++++++++++- ext/wayland/gstwaylandsink.h | 2 ++ gst-libs/gst/wayland/gstwlwindow.c | 12 ++++++++- gst-libs/gst/wayland/gstwlwindow.h | 3 ++- 4 files changed, 55 insertions(+), 3 deletions(-) diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c index 2f116bf..69f4a00 100644 --- a/ext/wayland/gstwaylandsink.c +++ b/ext/wayland/gstwaylandsink.c @@ -61,6 +61,8 @@ enum PROP_DISPLAY, PROP_FULLSCREEN, PROP_ROTATE_METHOD, + PROP_APP_ID, + PROP_TITLE, PROP_LAST }; @@ -177,6 +179,16 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass) GST_TYPE_VIDEO_ORIENTATION_METHOD, GST_VIDEO_ORIENTATION_IDENTITY, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + g_object_class_install_property (gobject_class, PROP_APP_ID, + g_param_spec_string ("appid", "Top-level application id", "Wayland " + "appid, as xdg_shell::set_app_id", + NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_property (gobject_class, PROP_TITLE, + g_param_spec_string ("title", "Top-level title", "Wayland " + "title, xdg_shell::set_title", + NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + /** * waylandsink:render-rectangle: * @@ -266,6 +278,16 @@ gst_wayland_sink_get_property (GObject * object, g_value_set_enum (value, self->current_rotate_method); GST_OBJECT_UNLOCK (self); break; + case PROP_APP_ID: + GST_OBJECT_LOCK (self); + g_value_set_string (value, self->app_id); + GST_OBJECT_UNLOCK (self); + break; + case PROP_TITLE: + GST_OBJECT_LOCK (self); + g_value_set_string (value, self->title); + GST_OBJECT_UNLOCK (self); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -289,6 +311,16 @@ gst_wayland_sink_set_property (GObject * object, gst_wayland_sink_set_fullscreen (self, g_value_get_boolean (value)); GST_OBJECT_UNLOCK (self); break; + case PROP_APP_ID: + GST_OBJECT_LOCK (self); + self->app_id = g_value_dup_string (value); + GST_OBJECT_UNLOCK (self); + break; + case PROP_TITLE: + GST_OBJECT_LOCK (self); + self->title = g_value_dup_string (value); + GST_OBJECT_UNLOCK (self); + break; case PROP_ROTATE_METHOD: gst_wayland_sink_set_rotate_method (self, g_value_get_enum (value), FALSE); @@ -310,12 +342,18 @@ gst_wayland_sink_finalize (GObject * object) gst_buffer_unref (self->last_buffer); if (self->display) g_object_unref (self->display); + if (self->title) + g_object_unref (self->title); + if (self->app_id) + g_object_unref (self->app_id); if (self->window) g_object_unref (self->window); if (self->pool) gst_object_unref (self->pool); g_free (self->display_name); + g_free (self->title); + g_free (self->app_id); g_mutex_clear (&self->display_lock); g_mutex_clear (&self->render_lock); @@ -761,7 +799,8 @@ gst_wayland_sink_show_frame (GstVideoSink * vsink, GstBuffer * buffer) if (!self->window) { /* if we were not provided a window, create one ourselves */ self->window = gst_wl_window_new_toplevel (self->display, - &self->video_info, self->fullscreen, &self->render_lock); + &self->video_info, self->fullscreen, &self->app_id, &self->title, + &self->render_lock); g_signal_connect_object (self->window, "closed", G_CALLBACK (on_window_closed), self, 0); gst_wl_window_set_rotate_method (self->window, diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h index 3243d8c..6aee19d 100644 --- a/ext/wayland/gstwaylandsink.h +++ b/ext/wayland/gstwaylandsink.h @@ -58,6 +58,8 @@ struct _GstWaylandSink gboolean fullscreen; gchar *display_name; + gchar *app_id; + gchar *title; gboolean redraw_pending; GMutex render_lock; diff --git a/gst-libs/gst/wayland/gstwlwindow.c b/gst-libs/gst/wayland/gstwlwindow.c index 6004993..de0a81e 100644 --- a/gst-libs/gst/wayland/gstwlwindow.c +++ b/gst-libs/gst/wayland/gstwlwindow.c @@ -270,7 +270,7 @@ gst_wl_window_ensure_fullscreen (GstWlWindow * self, gboolean fullscreen) GstWlWindow * gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info, - gboolean fullscreen, GMutex * render_lock) + gboolean fullscreen, gchar *app_id, gchar *title, GMutex * render_lock) { GstWlWindow *self; GstWlWindowPrivate *priv; @@ -307,6 +307,16 @@ gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info, gst_wl_window_ensure_fullscreen (self, fullscreen); + if (app_id) + xdg_toplevel_set_app_id (priv->xdg_toplevel, app_id); + else + xdg_toplevel_set_app_id (priv->xdg_toplevel, "ext.wayland.waylandsink"); + if (title) + xdg_toplevel_set_title (priv->xdg_toplevel, title); + else + xdg_toplevel_set_title (priv->xdg_toplevel, "ext.wayland.waylandsink"); + + /* Finally, commit the xdg_surface state as toplevel */ priv->configured = FALSE; wl_surface_commit (priv->area_surface); diff --git a/gst-libs/gst/wayland/gstwlwindow.h b/gst-libs/gst/wayland/gstwlwindow.h index 06c4001..e102052 100644 --- a/gst-libs/gst/wayland/gstwlwindow.h +++ b/gst-libs/gst/wayland/gstwlwindow.h @@ -39,7 +39,8 @@ void gst_wl_window_ensure_fullscreen (GstWlWindow * self, GST_WL_API GstWlWindow *gst_wl_window_new_toplevel (GstWlDisplay * display, - const GstVideoInfo * info, gboolean fullscreen, GMutex * render_lock); + const GstVideoInfo * info, gboolean fullscreen, gchar * app_id, + gchar *title, GMutex * render_lock); GST_WL_API GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display, -- 2.35.1