From 3851180cb02ab96d1ca18153fa3372bb46cdb691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sun, 6 Nov 2022 11:56:41 +0100 Subject: [PATCH 1/2] dbusService/screencast: Hold during gstreamer checks Some gstreamer plugins require a connection to the display server, so they block until the server is up and running. That's why we moved the check into the D-Bus service, so that the blocking would not lock up the compositor itself. However the block can still delay the service initialization so much that auto-shutdown hits immediately when returning from the constructor. If that happens, the proxy on the shell side is no longer backed by a remote object when the init callback runs, and all properties therefore resolve as `null`. As a result, gnome-shell thinks that screencasts aren't supported and hides the screencast button. Fix this by holding the service during the gstreamer checks, so that the auto-shutdown timeout only starts after the service is ready. https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6051 Part-of: (cherry picked from commit a2acecb491e53e889dd995d3db386aaa182e04a0) --- js/dbusServices/screencast/screencastService.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/js/dbusServices/screencast/screencastService.js b/js/dbusServices/screencast/screencastService.js index f7f36da886..a2bb23cfea 100644 --- a/js/dbusServices/screencast/screencastService.js +++ b/js/dbusServices/screencast/screencastService.js @@ -271,11 +271,14 @@ var ScreencastService = class extends ServiceImplementation { constructor() { super(ScreencastIface, '/org/gnome/Shell/Screencast'); + this.hold(); // gstreamer initializing can take a bit this._canScreencast = ScreencastService.canScreencast(); Gst.init(null); Gtk.init(); + this.release(); + this._recorders = new Map(); this._senders = new Map(); -- 2.38.1 From 41235b44ae02be26aa290c66d5a2a1ec9e458568 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Sun, 6 Nov 2022 13:06:44 +0100 Subject: [PATCH 2/2] screenshot: Cache ScreencastSupported property The screencast service shuts down when not in use, so it is almost certainly not running when handling the screencast shortcut. Instead of making sure the service is restarted, just cache the property when initializing the proxy. Part-of: (cherry picked from commit 144daf200c12f313c2cc7c01daef9e26e396a328) --- js/ui/screenshot.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js index a01fbe3c94..b2ea6fad2b 100644 --- a/js/ui/screenshot.js +++ b/js/ui/screenshot.js @@ -1017,6 +1017,7 @@ var ScreenshotUI = GObject.registerClass({ }); this._screencastInProgress = false; + this._screencastSupported = false; this._screencastProxy = new ScreencastProxy( Gio.DBus.session, @@ -1028,7 +1029,8 @@ var ScreenshotUI = GObject.registerClass({ return; } - this._castButton.visible = this._screencastProxy.ScreencastSupported; + this._screencastSupported = this._screencastProxy.ScreencastSupported; + this._castButton.visible = this._screencastSupported; }); this._lockdownSettings = new Gio.Settings({ schema_id: 'org.gnome.desktop.lockdown' }); @@ -1450,7 +1452,7 @@ var ScreenshotUI = GObject.registerClass({ if (this._screencastInProgress) return; - if (mode === UIMode.SCREENCAST && !this._screencastProxy.ScreencastSupported) + if (mode === UIMode.SCREENCAST && !this._screencastSupported) return; this._castButton.checked = mode === UIMode.SCREENCAST; -- 2.38.1