From 33d3a65646d0333605d7f1c552ef080645203c00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 29 Nov 2022 16:33:34 +0100 Subject: [PATCH] ui/main: Allow not inhibiting animations sometimes When we're running in e.g. CI, or in a virtual machine without hardware acceleration, and we actually want to enable animations despite the potential performance implications, change the AnimationsSettings to only inhibit if we're a XVNC instance or not hardware accelerated if --force-animations wasn't passed. Still inhibit animations if there is a remote desktop session that explicitly disables animations. Part-of: --- js/ui/main.js | 69 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/js/ui/main.js b/js/ui/main.js index b6f54da9e..ad9470bf8 100644 --- a/js/ui/main.js +++ b/js/ui/main.js @@ -919,43 +919,62 @@ function showRestartMessage(message) { var AnimationsSettings = class { constructor() { - let backend = global.backend; - if (!backend.is_rendering_hardware_accelerated()) { - St.Settings.get().inhibit_animations(); - return; - } - - let isXvnc = Shell.util_has_x11_display_extension( - global.display, 'VNC-EXTENSION'); - if (isXvnc) { - St.Settings.get().inhibit_animations(); - return; - } - - let remoteAccessController = backend.get_remote_access_controller(); - if (!remoteAccessController) - return; - + this._animationsEnabled = true; this._handles = new Set(); - remoteAccessController.connect('new-handle', - (_, handle) => this._onNewRemoteAccessHandle(handle)); + + global.connect('notify::force-animations', + this._syncAnimationsEnabled.bind(this)); + this._syncAnimationsEnabled(); + + const backend = global.backend; + const remoteAccessController = backend.get_remote_access_controller(); + if (remoteAccessController) { + remoteAccessController.connect('new-handle', + (_, handle) => this._onNewRemoteAccessHandle(handle)); + } + } + + _shouldEnableAnimations() { + if (this._handles.size > 0) + return false; + + if (global.force_animations) + return true; + + const backend = global.backend; + if (!backend.is_rendering_hardware_accelerated()) + return false; + + if (Shell.util_has_x11_display_extension( + global.display, 'VNC-EXTENSION')) + return false; + + return true; + } + + _syncAnimationsEnabled() { + const shouldEnableAnimations = this._shouldEnableAnimations(); + if (this._animationsEnabled === shouldEnableAnimations) + return; + + const settings = St.Settings.get(); + if (shouldEnableAnimations) + settings.uninhibit_animations(); + else + settings.inhibit_animations(); } _onRemoteAccessHandleStopped(handle) { - let settings = St.Settings.get(); - - settings.uninhibit_animations(); this._handles.delete(handle); + this._syncAnimationsEnabled(); } _onNewRemoteAccessHandle(handle) { if (!handle.get_disable_animations()) return; - let settings = St.Settings.get(); - - settings.inhibit_animations(); this._handles.add(handle); + this._syncAnimationsEnabled(); handle.connect('stopped', this._onRemoteAccessHandleStopped.bind(this)); } };