From 42d5ff3ec2d18d7239eac8a6ce0544d4f69efab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Tue, 31 Mar 2020 19:53:50 +0200 Subject: [PATCH] extensions-app: Add compatibility with GNOME 3.34 We are currently relying on 3.36 changes: - the addition of the UserExtensionsEnabled property - the separate org.gnome.Shell.Extensions name to expose the interface In order to work with the previous stable release as well, we can fall back to connecting to gnome-shell itself and changing the underlying GSettings directly. --- subprojects/extensions-app/data/meson.build | 2 + .../data/org.gnome.Extensions.gschema.xml | 12 +++++ subprojects/extensions-app/js/main.js | 47 +++++++++++++++---- subprojects/extensions-app/meson.build | 1 + 4 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 subprojects/extensions-app/data/org.gnome.Extensions.gschema.xml diff --git a/subprojects/extensions-app/data/meson.build b/subprojects/extensions-app/data/meson.build index 0568fafc8..e9399e3b6 100644 --- a/subprojects/extensions-app/data/meson.build +++ b/subprojects/extensions-app/data/meson.build @@ -33,5 +33,7 @@ configure_file( install_dir: servicedir, ) +install_data(app_id + '.gschema.xml', install_dir: schemadir) + subdir('icons') subdir('metainfo') diff --git a/subprojects/extensions-app/data/org.gnome.Extensions.gschema.xml b/subprojects/extensions-app/data/org.gnome.Extensions.gschema.xml new file mode 100644 index 000000000..d70d4bd4c --- /dev/null +++ b/subprojects/extensions-app/data/org.gnome.Extensions.gschema.xml @@ -0,0 +1,12 @@ + + + + false + Disable user extensions + + Disable all extensions the user has enabled without affecting + the “enabled-extension” setting. + + + + diff --git a/subprojects/extensions-app/js/main.js b/subprojects/extensions-app/js/main.js index d25df9c57..f5ac2e564 100644 --- a/subprojects/extensions-app/js/main.js +++ b/subprojects/extensions-app/js/main.js @@ -47,6 +47,10 @@ class Application extends Gtk.Application { return this._shellProxy; } + get legacyMode() { + return this._legacyMode; + } + vfunc_activate() { this._shellProxy.CheckForUpdatesRemote(); this._window.present(); @@ -69,6 +73,13 @@ class Application extends Gtk.Application { this._shellProxy = new GnomeShellProxy(Gio.DBus.session, 'org.gnome.Shell.Extensions', '/org/gnome/Shell/Extensions'); + this._legacyMode = this._shellProxy.g_name_owner === null; + + if (this._legacyMode) { + this._shellProxy = new GnomeShellProxy(Gio.DBus.session, + 'org.gnome.Shell', '/org/gnome/Shell'); + } + this._window = new ExtensionsWindow({ application: this }); } }); @@ -89,6 +100,10 @@ var ExtensionsWindow = GObject.registerClass({ _init(params) { super._init(params); + this._settings = this.application.legacyMode + ? new Gio.Settings({ schema_id: 'org.gnome.shell' }) + : null; + this._updatesCheckId = 0; this._exporter = new Shew.WindowExporter({ window: this }); @@ -111,7 +126,12 @@ var ExtensionsWindow = GObject.registerClass({ }); action.connect('activate', toggleState); action.connect('change-state', (a, state) => { - this._shellProxy.UserExtensionsEnabled = state.get_boolean(); + const value = state.get_boolean(); + + if (this._settings) + this._settings.set_boolean('disable-user-extensions', !value); + else + this._shellProxy.UserExtensionsEnabled = value; }); this.add_action(action); @@ -124,8 +144,13 @@ var ExtensionsWindow = GObject.registerClass({ this._shellProxy.connectSignal('ExtensionStateChanged', this._onExtensionStateChanged.bind(this)); - this._shellProxy.connect('g-properties-changed', - this._onUserExtensionsEnabledChanged.bind(this)); + if (this._settings) { + this._settings.connect('changed::disable-user-extensions', + this._onUserExtensionsEnabledChanged.bind(this)); + } else { + this._shellProxy.connect('g-properties-changed', + this._onUserExtensionsEnabledChanged.bind(this)); + } this._onUserExtensionsEnabledChanged(); this._scanExtensions(); @@ -166,9 +191,13 @@ var ExtensionsWindow = GObject.registerClass({ } } - this._shellProxy.OpenExtensionPrefsRemote(uuid, - this._exportedHandle, - { modal: new GLib.Variant('b', true) }); + if (this.application.legacyMode) { + this._shellProxy.LaunchExtensionPrefsRemote(uuid); + } else { + this._shellProxy.OpenExtensionPrefsRemote(uuid, + this._exportedHandle, + { modal: new GLib.Variant('b', true) }); + } } _showAbout() { @@ -228,8 +257,10 @@ var ExtensionsWindow = GObject.registerClass({ _onUserExtensionsEnabledChanged() { let action = this.lookup_action('user-extensions-enabled'); - action.set_state( - new GLib.Variant('b', this._shellProxy.UserExtensionsEnabled)); + const newState = this._settings + ? !this._settings.get_boolean('disable-user-extensions') + : this._shellProxy.UserExtensionsEnabled; + action.set_state(new GLib.Variant('b', newState)); } _onExtensionStateChanged(proxy, senderName, [uuid, newState]) { diff --git a/subprojects/extensions-app/meson.build b/subprojects/extensions-app/meson.build index 88536236a..ebf3da942 100644 --- a/subprojects/extensions-app/meson.build +++ b/subprojects/extensions-app/meson.build @@ -34,6 +34,7 @@ icondir = join_paths(datadir, 'icons') localedir = join_paths(datadir, 'locale') metainfodir = join_paths(datadir, 'metainfo') servicedir = join_paths(datadir, 'dbus-1', 'services') +schemadir = join_paths(datadir, 'glib-2.0', 'schemas') gjs = find_program('gjs') appstream_util = find_program('appstream-util', required: false) -- 2.25.1