From df64f7e34d01a03957d78317ef9a1cf6d6b95055 Mon Sep 17 00:00:00 2001
From: Marius Vlad <marius.vlad@collabora.com>
Date: Wed, 9 Aug 2023 14:34:19 +0300
Subject: [PATCH] Added appid and title support

Bug-AGL: SPEC-4870
Signed-off-by: Marius Vlad <marius.vlad@collabora.com>
---
 ext/wayland/gstwaylandsink.c | 43 ++++++++++++++++++++++++++++++++++--
 ext/wayland/gstwaylandsink.h |  2 ++
 ext/wayland/wlwindow.c       | 10 ++++++++-
 ext/wayland/wlwindow.h       |  2 +-
 4 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
index 4918154..f743cf2 100644
--- a/ext/wayland/gstwaylandsink.c
+++ b/ext/wayland/gstwaylandsink.c
@@ -66,7 +66,9 @@ enum
   PROP_DISPLAY,
   PROP_FULLSCREEN,
   PROP_USE_SUBSURFACE,
-  PROP_SUPPRESS_INTERLACE
+  PROP_SUPPRESS_INTERLACE,
+  PROP_APP_ID,
+  PROP_TITLE
 };
 
 #define DEFAULT_USE_SUBSURFACE          TRUE
@@ -229,6 +231,16 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass)
           DEFAULT_SUPPRESS_INTERLACE,
           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));
+
   gst_type_mark_as_plugin_api (GST_TYPE_WAYLAND_VIDEO, 0);
 }
 
@@ -266,6 +278,16 @@ gst_wayland_sink_get_property (GObject * object,
       g_value_set_string (value, sink->display_name);
       GST_OBJECT_UNLOCK (sink);
       break;
+    case PROP_APP_ID:
+      GST_OBJECT_LOCK (sink);
+      g_value_set_string (value, sink->app_id);
+      GST_OBJECT_UNLOCK (sink);
+      break;
+    case PROP_TITLE:
+      GST_OBJECT_LOCK (sink);
+      g_value_set_string (value, sink->title);
+      GST_OBJECT_UNLOCK (sink);
+      break;
     case PROP_FULLSCREEN:
       GST_OBJECT_LOCK (sink);
       g_value_set_boolean (value, sink->fullscreen);
@@ -298,6 +320,16 @@ gst_wayland_sink_set_property (GObject * object,
       sink->display_name = g_value_dup_string (value);
       GST_OBJECT_UNLOCK (sink);
       break;
+    case PROP_APP_ID:
+      GST_OBJECT_LOCK (sink);
+      sink->app_id = g_value_dup_string (value);
+      GST_OBJECT_UNLOCK (sink);
+      break;
+    case PROP_TITLE:
+      GST_OBJECT_LOCK (sink);
+      sink->title = 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));
@@ -331,12 +363,18 @@ gst_wayland_sink_finalize (GObject * object)
     gst_buffer_unref (sink->last_buffer);
   if (sink->display)
     g_object_unref (sink->display);
+  if (sink->title)
+    g_object_unref (sink->title);
+  if (sink->app_id)
+    g_object_unref (sink->app_id);
   if (sink->window)
     g_object_unref (sink->window);
   if (sink->pool)
     gst_object_unref (sink->pool);
 
   g_free (sink->display_name);
+  g_free (sink->title);
+  g_free (sink->app_id);
 
   g_mutex_clear (&sink->display_lock);
   g_mutex_clear (&sink->render_lock);
@@ -768,7 +806,8 @@ 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->fullscreen, &sink->render_lock);
+          &sink->video_info, sink->fullscreen, sink->app_id, sink->title,
+	  &sink->render_lock);
       g_signal_connect_object (sink->window, "closed",
           G_CALLBACK (on_window_closed), sink, 0);
     }
diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h
index 46ea538..e6c94ae 100644
--- a/ext/wayland/gstwaylandsink.h
+++ b/ext/wayland/gstwaylandsink.h
@@ -64,6 +64,8 @@ struct _GstWaylandSink
   gboolean fullscreen;
 
   gchar *display_name;
+  gchar *app_id;
+  gchar *title;
 
   gboolean redraw_pending;
   GMutex render_lock;
diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c
index 3aace87..16faec8 100644
--- a/ext/wayland/wlwindow.c
+++ b/ext/wayland/wlwindow.c
@@ -255,7 +255,7 @@ gst_wl_window_ensure_fullscreen (GstWlWindow * window, 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 *window;
 
@@ -288,6 +288,14 @@ gst_wl_window_new_toplevel (GstWlDisplay * display, const GstVideoInfo * info,
 
     /* Finally, commit the xdg_surface state as toplevel */
     window->configured = FALSE;
+    if (app_id)
+	    xdg_toplevel_set_app_id (window->xdg_toplevel, app_id);
+    else
+	    xdg_toplevel_set_app_id (window->xdg_toplevel, "ext.wayland.waylandsink");
+    if (title)
+	    xdg_toplevel_set_title (window->xdg_toplevel, title);
+    else
+	    xdg_toplevel_set_title (window->xdg_toplevel, "ext.wayland.waylandsink");
     wl_surface_commit (window->area_surface);
     wl_display_flush (display->display);
 
diff --git a/ext/wayland/wlwindow.h b/ext/wayland/wlwindow.h
index 034a5a5..6b525c8 100644
--- a/ext/wayland/wlwindow.h
+++ b/ext/wayland/wlwindow.h
@@ -84,7 +84,7 @@ 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, gboolean fullscreen, GMutex * render_lock);
+        const GstVideoInfo * info, gboolean fullscreen, gchar * app_id, gchar *title, GMutex * render_lock);
 GstWlWindow *gst_wl_window_new_in_surface (GstWlDisplay * display,
         struct wl_surface * parent, GMutex * render_lock);
 
-- 
2.35.1

