diff --git a/data/org.gnome.shell.gschema.xml.in b/data/org.gnome.shell.gschema.xml.in index 698ebc1ea..050c4130b 100644 --- a/data/org.gnome.shell.gschema.xml.in +++ b/data/org.gnome.shell.gschema.xml.in @@ -15,8 +15,18 @@ [] <_summary>Uuids of extensions to disable <_description> - GNOME Shell extensions have a uuid property; - this key lists extensions which should not be loaded. + GNOME Shell extensions have a uuid property; this key lists extensions + which should not be loaded. This setting overrides enabled-extensions + for extensions that appear in both lists. + + + + [] + <_summary>Uuids of extensions to enable + <_description> + GNOME Shell extensions have a uuid property; this key lists extensions + which should be loaded. disabled-extensions overrides this setting for + extensions that appear in both lists. diff --git a/js/ui/extensionSystem.js b/js/ui/extensionSystem.js index 9dd3a47ef..f722007fc 100644 --- a/js/ui/extensionSystem.js +++ b/js/ui/extensionSystem.js @@ -23,8 +23,9 @@ const ExtensionType = { const extensionMeta = {}; // Maps uuid -> importer object (extension directory tree) const extensions = {}; -// Array of uuids +// Arrays of uuids var disabledExtensions; +var enabledExtensions; // GFile for user extensions var userExtensionsDir = null; @@ -178,6 +179,7 @@ function init() { } disabledExtensions = global.settings.get_strv('disabled-extensions', -1); + enabledExtensions = global.settings.get_strv('enabled-extensions', -1); } function _loadExtensionsIn(dir, type) { @@ -195,7 +197,10 @@ function _loadExtensionsIn(dir, type) { if (fileType != Gio.FileType.DIRECTORY) continue; let name = info.get_name(); - let enabled = disabledExtensions.indexOf(name) < 0; + // Enable all but disabled extensions if enabledExtensions is not set. + // If it is set, enable one those, except they are disabled as well. + let enabled = (enabledExtensions.length == 0 || enabledExtensions.indexOf(name) >= 0) + && disabledExtensions.indexOf(name) < 0; let child = dir.get_child(name); loadExtension(child, enabled, type); }