[mutter] remote-access-handle: Add 'is-recording' property



commit 34579d71ccfaa432fd9069e1085f5ff4d7f18c8f
Author: Jonas Ådahl <jadahl gmail com>
Date:   Tue Apr 21 17:25:23 2020 +0200

    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 d719b9d84d..b2ac93d888 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 d89ef4690b..10c37ee886 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;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]