From 34579d71ccfaa432fd9069e1085f5ff4d7f18c8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 21 Apr 2020 17:25:23 +0200 Subject: [PATCH] remote-access-handle: Add 'is-recording' property Will be TRUE if it is a screen cast session where all streams have the 'is-recording' set to TRUE. For other screen casts or remote desktop sessions, it'll be FALSE. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1377 --- src/backends/meta-remote-access-controller.c | 70 ++++++++++++++++++++ src/backends/meta-screen-cast-session.c | 27 +++++++- 2 files changed, 96 insertions(+), 1 deletion(-) diff --git a/src/backends/meta-remote-access-controller.c b/src/backends/meta-remote-access-controller.c index d719b9d84..b2ac93d88 100644 --- a/src/backends/meta-remote-access-controller.c +++ b/src/backends/meta-remote-access-controller.c @@ -36,6 +36,17 @@ enum static int handle_signals[N_HANDLE_SIGNALS]; +enum +{ + PROP_0, + + PROP_IS_RECORDING, + + N_PROPS +}; + +static GParamSpec *obj_props[N_PROPS]; + enum { CONTROLLER_NEW_HANDLE, @@ -50,6 +61,8 @@ typedef struct _MetaRemoteAccessHandlePrivate gboolean has_stopped; gboolean disable_animations; + + gboolean is_recording; } MetaRemoteAccessHandlePrivate; G_DEFINE_TYPE_WITH_PRIVATE (MetaRemoteAccessHandle, @@ -177,6 +190,48 @@ meta_remote_access_controller_new (MetaRemoteDesktop *remote_desktop, return remote_access_controller; } +static void +meta_remote_access_handle_get_property (GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + MetaRemoteAccessHandle *handle = META_REMOTE_ACCESS_HANDLE (object); + MetaRemoteAccessHandlePrivate *priv = + meta_remote_access_handle_get_instance_private (handle); + + switch (prop_id) + { + case PROP_IS_RECORDING: + g_value_set_boolean (value, priv->is_recording); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +meta_remote_access_handle_set_property (GObject *object, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + MetaRemoteAccessHandle *handle = META_REMOTE_ACCESS_HANDLE (object); + MetaRemoteAccessHandlePrivate *priv = + meta_remote_access_handle_get_instance_private (handle); + + switch (prop_id) + { + case PROP_IS_RECORDING: + priv->is_recording = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + static void meta_remote_access_handle_init (MetaRemoteAccessHandle *handle) { @@ -185,6 +240,11 @@ meta_remote_access_handle_init (MetaRemoteAccessHandle *handle) static void meta_remote_access_handle_class_init (MetaRemoteAccessHandleClass *klass) { + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->get_property = meta_remote_access_handle_get_property; + object_class->set_property = meta_remote_access_handle_set_property; + handle_signals[HANDLE_STOPPED] = g_signal_new ("stopped", G_TYPE_FROM_CLASS (klass), @@ -192,6 +252,16 @@ meta_remote_access_handle_class_init (MetaRemoteAccessHandleClass *klass) 0, NULL, NULL, NULL, G_TYPE_NONE, 0); + + obj_props[PROP_IS_RECORDING] = + g_param_spec_boolean ("is-recording", + "is-recording", + "Is a screen recording", + FALSE, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_STRINGS); + g_object_class_install_properties (object_class, N_PROPS, obj_props); } static void diff --git a/src/backends/meta-screen-cast-session.c b/src/backends/meta-screen-cast-session.c index d89ef4690..10c37ee88 100644 --- a/src/backends/meta-screen-cast-session.c +++ b/src/backends/meta-screen-cast-session.c @@ -677,12 +677,37 @@ meta_screen_cast_session_class_init (MetaScreenCastSessionClass *klass) object_class->finalize = meta_screen_cast_session_finalize; } +static gboolean +meta_screen_cast_session_is_recording (MetaScreenCastSession *session) +{ + GList *l; + + if (!session->streams) + return FALSE; + + for (l = session->streams; l; l = l->next) + { + MetaScreenCastStream *stream = l->data; + MetaScreenCastFlag flags; + + flags = meta_screen_cast_stream_get_flags (stream); + if (!(flags & META_SCREEN_CAST_FLAG_IS_RECORDING)) + return FALSE; + } + + return TRUE; +} + static MetaScreenCastSessionHandle * meta_screen_cast_session_handle_new (MetaScreenCastSession *session) { MetaScreenCastSessionHandle *handle; + gboolean is_recording; - handle = g_object_new (META_TYPE_SCREEN_CAST_SESSION_HANDLE, NULL); + is_recording = meta_screen_cast_session_is_recording (session); + handle = g_object_new (META_TYPE_SCREEN_CAST_SESSION_HANDLE, + "is-recording", is_recording, + NULL); handle->session = session; return handle;