screenshot: Split out disabling cast button

Screencasts can be disabled for various reasons:

 1. the service is not available (missing plugin etc.)
 2. screencasts are not allowed by the session mode
    (lock screen etc.)
 3. the UI is invoked in screenshot-only mode (portal)

Currently each of those conditions is handled in a different
code path, which means that later conditions can re-enable
the button.

There's also an inconsistency whether disabling the button
is done via visibility or reactivity, which still allows
toggling the hidden button via shortcuts (although a hidden
button means that screencasts aren't supported at all, so
nothing will be recorded in that case).

Address this by updating the button from a dedicated function.

Fixes: 671df28a50 ("screenshot: Only handle mode-switch shortcut when
supported")

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/7358
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3155>
This commit is contained in:
Florian Müllner 2024-01-30 19:56:42 +01:00
parent fa81335fe8
commit d54e17d3d5

View File

@ -1083,6 +1083,7 @@ export const ScreenshotUI = GObject.registerClass({
this._screencastInProgress = false;
this._screencastSupported = false;
this._currentMode = UIMode.SCREENSHOT;
this._screencastProxy = new ScreencastProxy(
Gio.DBus.session,
@ -1095,7 +1096,7 @@ export const ScreenshotUI = GObject.registerClass({
}
this._screencastSupported = this._screencastProxy.ScreencastSupported;
this._castButton.visible = this._screencastSupported;
this._syncCastButton();
});
this._screencastProxy.connectSignal('Error',
@ -1447,7 +1448,15 @@ export const ScreenshotUI = GObject.registerClass({
_sessionUpdated() {
this.close(true);
this._castButton.reactive = Main.sessionMode.allowScreencast;
}
_syncCastButton() {
const visible = this._screencastSupported;
const reactive = visible &&
this._currentMode !== UIMode.SCREENSHOT_ONLY &&
Main.sessionMode.allowScreencast;
this._castButton.set({visible, reactive});
}
_syncWindowButtonSensitivity() {
@ -1549,8 +1558,9 @@ export const ScreenshotUI = GObject.registerClass({
if (mode === UIMode.SCREENCAST && !this._screencastSupported)
return;
this._currentMode = mode;
this._castButton.checked = mode === UIMode.SCREENCAST;
this._castButton.reactive = mode !== UIMode.SCREENSHOT_ONLY;
this._syncCastButton();
if (!this.visible) {
// Screenshot UI is opening from completely closed state