Blame SOURCES/0001-extensions-app-Add-compatibility-with-GNOME-3.34.patch

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