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: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2533>
This commit is contained in:
Florian Müllner 2022-11-06 11:56:41 +01:00 committed by Marge Bot
parent 9bc24cd271
commit a2acecb491

View File

@ -271,11 +271,14 @@ var ScreencastService = class extends ServiceImplementation {
constructor() { constructor() {
super(ScreencastIface, '/org/gnome/Shell/Screencast'); super(ScreencastIface, '/org/gnome/Shell/Screencast');
this.hold(); // gstreamer initializing can take a bit
this._canScreencast = ScreencastService.canScreencast(); this._canScreencast = ScreencastService.canScreencast();
Gst.init(null); Gst.init(null);
Gtk.init(); Gtk.init();
this.release();
this._recorders = new Map(); this._recorders = new Map();
this._senders = new Map(); this._senders = new Map();