Blame SOURCES/0001-media-keys-Mark-screen-cast-as-stopped-if-it-was-sig.patch

c8dcf2
From a8115378fd876bfd4c3871428cdc16134ed484b1 Mon Sep 17 00:00:00 2001
c8dcf2
From: =?UTF-8?q?Jonas=20=C3=85dahl?= <jadahl@gmail.com>
c8dcf2
Date: Tue, 5 Jan 2021 11:11:18 +0100
c8dcf2
Subject: [PATCH] media-keys: Mark screen cast as stopped if it was signalled
c8dcf2
 as such
c8dcf2
c8dcf2
gnome-shell now sends a 'Stopped' signal if it was stopped without
c8dcf2
gsd-media-keys itself being the stopper.
c8dcf2
---
c8dcf2
 plugins/media-keys/gsd-media-keys-manager.c | 52 +++++++++++++++++++--
c8dcf2
 1 file changed, 49 insertions(+), 3 deletions(-)
c8dcf2
c8dcf2
diff --git a/plugins/media-keys/gsd-media-keys-manager.c b/plugins/media-keys/gsd-media-keys-manager.c
c8dcf2
index 4d251f08..a526d5cf 100644
c8dcf2
--- a/plugins/media-keys/gsd-media-keys-manager.c
c8dcf2
+++ b/plugins/media-keys/gsd-media-keys-manager.c
c8dcf2
@@ -210,6 +210,7 @@ struct GsdMediaKeysManagerPrivate
c8dcf2
         guint            screencast_timeout_id;
c8dcf2
         gboolean         screencast_recording;
c8dcf2
         GCancellable    *screencast_cancellable;
c8dcf2
+        guint            screencast_stopped_signal_id;
c8dcf2
 
c8dcf2
         /* Rotation */
c8dcf2
         guint            iio_sensor_watch_id;
c8dcf2
@@ -2346,20 +2347,26 @@ do_rfkill_action (GsdMediaKeysManager *manager,
c8dcf2
 }
c8dcf2
 
c8dcf2
 static void
c8dcf2
-screencast_stop (GsdMediaKeysManager *manager)
c8dcf2
+screencast_stopped (GsdMediaKeysManager *manager)
c8dcf2
 {
c8dcf2
         if (manager->priv->screencast_timeout_id > 0) {
c8dcf2
                 g_source_remove (manager->priv->screencast_timeout_id);
c8dcf2
                 manager->priv->screencast_timeout_id = 0;
c8dcf2
         }
c8dcf2
 
c8dcf2
+        manager->priv->screencast_recording = FALSE;
c8dcf2
+}
c8dcf2
+
c8dcf2
+static void
c8dcf2
+screencast_stop (GsdMediaKeysManager *manager)
c8dcf2
+{
c8dcf2
+        screencast_stopped (manager);
c8dcf2
+
c8dcf2
         g_dbus_proxy_call (manager->priv->screencast_proxy,
c8dcf2
                            "StopScreencast", NULL,
c8dcf2
                            G_DBUS_CALL_FLAGS_NONE, -1,
c8dcf2
                            manager->priv->screencast_cancellable,
c8dcf2
                            NULL, NULL);
c8dcf2
-
c8dcf2
-        manager->priv->screencast_recording = FALSE;
c8dcf2
 }
c8dcf2
 
c8dcf2
 static gboolean
c8dcf2
@@ -2835,6 +2842,21 @@ initialize_volume_handler (GsdMediaKeysManager *manager)
c8dcf2
         gnome_settings_profile_end ("gvc_mixer_control_new");
c8dcf2
 }
c8dcf2
 
c8dcf2
+
c8dcf2
+static void
c8dcf2
+on_screencast_stopped (GDBusConnection *connection,
c8dcf2
+                       const gchar     *sender_name,
c8dcf2
+                       const gchar     *object_path,
c8dcf2
+                       const gchar     *interface_name,
c8dcf2
+                       const gchar     *signal_name,
c8dcf2
+                       GVariant        *parameters,
c8dcf2
+                       gpointer         data)
c8dcf2
+{
c8dcf2
+        GsdMediaKeysManager *manager = data;
c8dcf2
+
c8dcf2
+        screencast_stopped (manager);
c8dcf2
+}
c8dcf2
+
c8dcf2
 static void
c8dcf2
 on_screencast_proxy_ready (GObject      *source,
c8dcf2
                            GAsyncResult *result,
c8dcf2
@@ -2850,7 +2872,20 @@ on_screencast_proxy_ready (GObject      *source,
c8dcf2
                 if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
c8dcf2
                         g_warning ("Failed to create proxy for screencast: %s", error->message);
c8dcf2
                 g_error_free (error);
c8dcf2
+                return;
c8dcf2
         }
c8dcf2
+
c8dcf2
+        manager->priv->screencast_stopped_signal_id =
c8dcf2
+                g_dbus_connection_signal_subscribe (manager->priv->connection,
c8dcf2
+                                                    SHELL_DBUS_NAME ".Screencast",
c8dcf2
+                                                    SHELL_DBUS_NAME ".Screencast",
c8dcf2
+                                                    "Stopped",
c8dcf2
+                                                    SHELL_DBUS_PATH "/Screencast",
c8dcf2
+                                                    NULL,
c8dcf2
+                                                    G_DBUS_SIGNAL_FLAGS_NONE,
c8dcf2
+                                                    on_screencast_stopped,
c8dcf2
+                                                    manager,
c8dcf2
+                                                    NULL);
c8dcf2
 }
c8dcf2
 
c8dcf2
 static void
c8dcf2
@@ -2901,6 +2936,11 @@ shell_presence_changed (GsdMediaKeysManager *manager)
c8dcf2
                                           on_screencast_proxy_ready, manager);
c8dcf2
                 g_free (name_owner);
c8dcf2
         } else {
c8dcf2
+                if (manager->priv->screencast_stopped_signal_id)
c8dcf2
+                        g_dbus_connection_signal_unsubscribe (manager->priv->connection,
c8dcf2
+                                                              manager->priv->screencast_stopped_signal_id);
c8dcf2
+                manager->priv->screencast_stopped_signal_id = 0;
c8dcf2
+
c8dcf2
                 g_ptr_array_set_size (manager->priv->keys, 0);
c8dcf2
                 g_clear_object (&manager->priv->key_grabber);
c8dcf2
                 g_clear_object (&manager->priv->screencast_proxy);
c8dcf2
@@ -3091,6 +3131,12 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager)
c8dcf2
                 priv->reenable_power_button_timer_id = 0;
c8dcf2
         }
c8dcf2
 
c8dcf2
+        if (priv->screencast_stopped_signal_id) {
c8dcf2
+                g_dbus_connection_signal_unsubscribe (priv->connection,
c8dcf2
+                                                      priv->screencast_stopped_signal_id);
c8dcf2
+                priv->screencast_stopped_signal_id = 0;
c8dcf2
+        }
c8dcf2
+
c8dcf2
         g_clear_pointer (&manager->priv->ca, ca_context_destroy);
c8dcf2
 
c8dcf2
 #if HAVE_GUDEV
c8dcf2
-- 
c8dcf2
2.27.0
c8dcf2