From d54e17d3d5391dd8980244e16a7dc315c97ef2bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Tue, 30 Jan 2024 19:56:42 +0100 Subject: [PATCH] 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: --- js/ui/screenshot.js | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/js/ui/screenshot.js b/js/ui/screenshot.js index e5b50604d..f204d383d 100644 --- a/js/ui/screenshot.js +++ b/js/ui/screenshot.js @@ -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