extensionSystem: Sort extensions before loading
When an extension is disabled, we "rebase" all extensions that were enabled afterwards, in case they override the same method. This can be fairly expensive, in particular when disabling many extensions at once, for instance when locking the screen. Help with that by sorting extensions by the number of session-modes, as extensions that support multiple modes are less likely to be disabled on session mode changes. Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2851>
This commit is contained in:
parent
38d9026bc7
commit
3b4e3af6fa
@ -583,6 +583,8 @@ export class ExtensionManager extends Signals.EventEmitter {
|
||||
if (!global.settings.get_boolean(DISABLE_USER_EXTENSIONS_KEY))
|
||||
extensions = extensions.concat(global.settings.get_strv(ENABLED_EXTENSIONS_KEY));
|
||||
|
||||
extensions.sort((a, b) => this._compareExtensions(this.lookup(a), this.lookup(b)));
|
||||
|
||||
// filter out 'disabled-extensions' which takes precedence
|
||||
let disabledExtensions = global.settings.get_strv(DISABLED_EXTENSIONS_KEY);
|
||||
return extensions.filter(item => !disabledExtensions.includes(item));
|
||||
@ -700,6 +702,12 @@ export class ExtensionManager extends Signals.EventEmitter {
|
||||
}
|
||||
}
|
||||
|
||||
_compareExtensions(a, b) {
|
||||
const modesA = a?.sessionModes ?? [];
|
||||
const modesB = b?.sessionModes ?? [];
|
||||
return modesB.length - modesA.length;
|
||||
}
|
||||
|
||||
async _loadExtensions() {
|
||||
global.settings.connect(`changed::${ENABLED_EXTENSIONS_KEY}`, () => {
|
||||
this._onEnabledExtensionsChanged();
|
||||
@ -748,7 +756,7 @@ export class ExtensionManager extends Signals.EventEmitter {
|
||||
}
|
||||
|
||||
return extension;
|
||||
}).filter(extension => extension !== null);
|
||||
}).filter(extension => extension !== null).sort(this._compareExtensions.bind(this));
|
||||
|
||||
// after updating to a new major version,
|
||||
// update extensions before loading them
|
||||
|
Loading…
x
Reference in New Issue
Block a user