From c865ffdb24d1a945f36a1bf873fe0900cbbade14 Mon Sep 17 00:00:00 2001 From: Georges Basile Stavracas Neto Date: Thu, 11 Nov 2021 00:05:27 -0300 Subject: [PATCH] screencast: Pass stream ids The stream id is any string that can uniquely identify a stream within a screencast session. Add that to the list of stream properties. For now, only use a simple positional integer as id. --- src/gnomescreencast.c | 21 ++++++++++++++++++--- src/screencast.c | 5 ++++- src/screencast.h | 1 + src/screencastwidget.c | 4 ++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/gnomescreencast.c b/src/gnomescreencast.c index 3f8539c..482fcd0 100644 --- a/src/gnomescreencast.c +++ b/src/gnomescreencast.c @@ -59,6 +59,7 @@ typedef struct _GnomeScreenCastStream ScreenCastSourceType source_type; + uint32_t id; char *path; OrgGnomeMutterScreenCastStream *proxy; @@ -219,6 +220,7 @@ void gnome_screen_cast_session_add_stream_properties (GnomeScreenCastSession *gnome_screen_cast_session, GVariantBuilder *streams_builder) { + char id[64] = { 0, }; GList *streams; GList *l; @@ -234,6 +236,10 @@ gnome_screen_cast_session_add_stream_properties (GnomeScreenCastSession *gnome_s g_variant_builder_init (&stream_properties_builder, G_VARIANT_TYPE_VARDICT); + g_snprintf (id, G_N_ELEMENTS (id), "%u", stream->id); + g_variant_builder_add (&stream_properties_builder, "{sv}", + "id", + g_variant_new ("s", id)); g_variant_builder_add (&stream_properties_builder, "{sv}", "source_type", g_variant_new ("u", stream->source_type)); @@ -275,6 +281,7 @@ cursor_mode_to_gnome_cursor_mode (ScreenCastCursorMode cursor_mode) static gboolean gnome_screen_cast_session_record_window (GnomeScreenCastSession *gnome_screen_cast_session, + uint32_t id, Window *window, ScreenCastSelection *select, GError **error) @@ -327,6 +334,7 @@ gnome_screen_cast_session_record_window (GnomeScreenCastSession *gnome_screen_c stream->session = gnome_screen_cast_session; stream->path = g_strdup (stream_path); stream->proxy = stream_proxy; + stream->id = id; parameters = org_gnome_mutter_screen_cast_stream_get_parameters (stream->proxy); if (parameters) @@ -357,6 +365,7 @@ gnome_screen_cast_session_record_window (GnomeScreenCastSession *gnome_screen_c static gboolean gnome_screen_cast_session_record_monitor (GnomeScreenCastSession *gnome_screen_cast_session, + uint32_t id, Monitor *monitor, ScreenCastSelection *select, GError **error) @@ -409,6 +418,7 @@ gnome_screen_cast_session_record_monitor (GnomeScreenCastSession *gnome_screen_ stream->session = gnome_screen_cast_session; stream->path = g_strdup (stream_path); stream->proxy = stream_proxy; + stream->id = id; parameters = org_gnome_mutter_screen_cast_stream_get_parameters (stream->proxy); if (parameters) @@ -453,6 +463,7 @@ gnome_screen_cast_session_record_selections (GnomeScreenCastSession *gnome_scre { case SCREEN_CAST_SOURCE_TYPE_MONITOR: if (!gnome_screen_cast_session_record_monitor (gnome_screen_cast_session, + info->id, info->data.monitor, select, error)) @@ -460,6 +471,7 @@ gnome_screen_cast_session_record_selections (GnomeScreenCastSession *gnome_scre break; case SCREEN_CAST_SOURCE_TYPE_WINDOW: if (!gnome_screen_cast_session_record_window (gnome_screen_cast_session, + info->id, info->data.window, select, error)) diff --git a/src/screencast.c b/src/screencast.c index 55a3e5c..3be8337 100644 --- a/src/screencast.c +++ b/src/screencast.c @@ -162,7 +162,7 @@ serialize_streams_as_restore_data (ScreenCastSession *screen_cast_session, g_variant_builder_add (&impl_builder, "(uuv)", - i, + info->id, info->type, stream_variant); } @@ -502,6 +502,7 @@ restore_stream_from_data (ScreenCastSession *screen_cast_session) info = g_new0 (ScreenCastStreamInfo, 1); info->type = SCREEN_CAST_SOURCE_TYPE_MONITOR; info->data.monitor = monitor; + info->id = id; g_ptr_array_add (streams, info); } break; @@ -526,6 +527,7 @@ restore_stream_from_data (ScreenCastSession *screen_cast_session) info = g_new0 (ScreenCastStreamInfo, 1); info->type = SCREEN_CAST_SOURCE_TYPE_WINDOW; info->data.window = window; + info->id = id; g_ptr_array_add (streams, info); } break; diff --git a/src/screencast.h b/src/screencast.h index d78066e..3d64b4a 100644 --- a/src/screencast.h +++ b/src/screencast.h @@ -55,6 +55,7 @@ typedef struct _ScreenCastSelection typedef struct { ScreenCastSourceType type; + uint32_t id; union { Monitor *monitor; Window *window; diff --git a/src/screencastwidget.c b/src/screencastwidget.c index c100ad9..20df194 100644 --- a/src/screencastwidget.c +++ b/src/screencastwidget.c @@ -597,6 +597,7 @@ screen_cast_widget_get_selected_streams (ScreenCastWidget *self) g_autoptr(GPtrArray) streams = NULL; g_autoptr(GList) selected_monitor_rows = NULL; g_autoptr(GList) selected_window_rows = NULL; + uint32_t id = 0; GList *l; streams = g_ptr_array_new_with_free_func (g_free); @@ -620,6 +621,7 @@ screen_cast_widget_get_selected_streams (ScreenCastWidget *self) info = g_new0 (ScreenCastStreamInfo, 1); info->type = SCREEN_CAST_SOURCE_TYPE_MONITOR; info->data.monitor = monitor; + info->id = id++; g_ptr_array_add (streams, info); } @@ -634,6 +636,7 @@ screen_cast_widget_get_selected_streams (ScreenCastWidget *self) info = g_new0 (ScreenCastStreamInfo, 1); info->type = SCREEN_CAST_SOURCE_TYPE_WINDOW; info->data.window = window; + info->id = id++; g_ptr_array_add (streams, info); }