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: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2560>
This commit is contained in:
Jonas Ådahl 2022-11-29 16:33:34 +01:00
parent 08d4addeef
commit 33d3a65646

View File

@ -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));
}
};