From b8bbab864a1367ac47bcc0998b4c07d20020965a Mon Sep 17 00:00:00 2001
From: Marius Vlad <marius.vlad@collabora.com>
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 <marius.vlad@collabora.com>
---
 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

