summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Müllner <fmuellner@gnome.org>2014-06-05 18:09:47 +0200
committerFlorian Müllner <fmuellner@gnome.org>2014-06-09 21:52:03 +0200
commitae2751a68b20ab281ca74affd61562fb8869b639 (patch)
treeb973c45218662608aad5906f40c83747b07c14e1
parent589becbc79c7a96144298d75b3abd37f6dc97ccf (diff)
main: Move pref overrides back into C
Commit 6c2f3d1d178a65d moved pref overrides into JS to implement session mode specific overrides in a clean and generic way. However that approach comes with a cost - doing the overrides only after having handled over control to JS means that the core will be initialized with the non-overridden settings before changing to the correct values. In the best case this is unnecessary work, but it can in fact have a worse effect: when initializing workspaces, we will restore the previous number of workspaces when using dynamic-workspaces and reset to the configured number otherwise. As the non-overridden default for dynamic-workspaces is FALSE, we can easily end up moving the user's windows to the "wrong" workspace. Now GSettings is expected to grow support for session specific defaults, which will render our entire override system obsolete (yay!). Given that, it seems acceptable to use a less generic (and uglier) approach in the meanwhile, in order to fix aforementioned problems. So move overrides back before core initialization and just hardcode the session-mode => override-schema relation. https://bugzilla.gnome.org/show_bug.cgi?id=695487
-rw-r--r--js/ui/main.js13
-rw-r--r--js/ui/windowManager.js9
-rw-r--r--src/main.c21
-rw-r--r--src/shell-global.c31
-rw-r--r--src/shell-global.h1
5 files changed, 61 insertions, 14 deletions
diff --git a/js/ui/main.js b/js/ui/main.js
index a21af899..6218f33d 100644
--- a/js/ui/main.js
+++ b/js/ui/main.js
@@ -74,7 +74,6 @@ let _startDate;
let _defaultCssStylesheet = null;
let _cssStylesheet = null;
let _a11ySettings = null;
-let dynamicWorkspacesSchema = null;
function _sessionUpdated() {
_loadDefaultStylesheet();
@@ -111,7 +110,6 @@ function start() {
sessionMode = new SessionMode.SessionMode();
sessionMode.connect('updated', _sessionUpdated);
- _initializePrefs();
_initializeUI();
shellDBusService = new ShellDBus.GnomeShell();
@@ -120,17 +118,6 @@ function start() {
_sessionUpdated();
}
-function _initializePrefs() {
- let keys = new Gio.Settings({ schema: sessionMode.overridesSchema }).list_keys();
- for (let i = 0; i < keys.length; i++)
- Meta.prefs_override_preference_schema(keys[i], sessionMode.overridesSchema);
-
- if (keys.indexOf('dynamic-workspaces') > -1)
- dynamicWorkspacesSchema = sessionMode.overridesSchema;
- else
- dynamicWorkspacesSchema = 'org.gnome.mutter';
-}
-
function _initializeUI() {
// Ensure ShellWindowTracker and ShellAppUsage are initialized; this will
// also initialize ShellAppSystem first. ShellAppSystem
diff --git a/js/ui/windowManager.js b/js/ui/windowManager.js
index 0b77916b..c2a2d133 100644
--- a/js/ui/windowManager.js
+++ b/js/ui/windowManager.js
@@ -199,12 +199,19 @@ const WorkspaceTracker = new Lang.Class({
global.screen.connect('window-left-monitor', Lang.bind(this, this._windowLeftMonitor));
global.screen.connect('restacked', Lang.bind(this, this._windowsRestacked));
- this._workspaceSettings = new Gio.Settings({ schema: Main.dynamicWorkspacesSchema });
+ this._workspaceSettings = this._getWorkspaceSettings();
this._workspaceSettings.connect('changed::dynamic-workspaces', Lang.bind(this, this._queueCheckWorkspaces));
this._nWorkspacesChanged();
},
+ _getWorkspaceSettings: function() {
+ let settings = global.get_overrides_settings();
+ if (settings.list_keys().indexOf('dynamic-workspaces') > -1)
+ return settings;
+ return new Gio.Settings({ schema: 'org.gnome.mutter' });
+ },
+
_checkWorkspaces: function() {
let i;
let emptyWorkspaces = [];
diff --git a/src/main.c b/src/main.c
index 55f66839..a2f497cf 100644
--- a/src/main.c
+++ b/src/main.c
@@ -34,6 +34,8 @@ extern GType gnome_shell_plugin_get_type (void);
#define SHELL_DBUS_SERVICE "org.gnome.Shell"
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
+#define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
+
#define WM_NAME "GNOME Shell"
#define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell"
@@ -168,6 +170,23 @@ shell_dbus_init (gboolean replace)
}
static void
+shell_prefs_init (void)
+{
+ ShellGlobal *global = shell_global_get ();
+ GSettings *settings = shell_global_get_overrides_settings (global);
+ char **keys, **k;
+
+ if (!settings)
+ return;
+
+ keys = g_settings_list_keys (settings);
+ for (keys = k = g_settings_list_keys (settings); *k; k++)
+ meta_prefs_override_preference_schema (*k, OVERRIDES_SCHEMA);
+
+ g_strfreev (keys);
+}
+
+static void
shell_introspection_init (void)
{
@@ -434,6 +453,8 @@ main (int argc, char **argv)
_shell_global_init ("session-mode", session_mode, NULL);
+ shell_prefs_init ();
+
ecode = meta_run ();
if (g_getenv ("GNOME_SHELL_ENABLE_CLEANUP"))
diff --git a/src/shell-global.c b/src/shell-global.c
index f945e36f..18e3e099 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -1356,6 +1356,37 @@ shell_global_get_settings (ShellGlobal *global)
}
/**
+ * shell_global_get_overrides_settings:
+ * @global: A #ShellGlobal
+ *
+ * Get the session overrides GSettings instance.
+ *
+ * Return value: (transfer none): The GSettings object
+ */
+GSettings *
+shell_global_get_overrides_settings (ShellGlobal *global)
+{
+ static GSettings *settings = NULL;
+ const char *schema;
+
+ g_return_val_if_fail (SHELL_IS_GLOBAL (global), NULL);
+
+ if (!settings)
+ {
+ if (strcmp (global->session_mode, "classic") == 0)
+ schema = "org.gnome.shell.extensions.classic-overrides";
+ else if (strcmp (global->session_mode, "user") == 0)
+ schema = "org.gnome.shell.overrides";
+ else
+ return NULL;
+
+ settings = g_settings_new (schema);
+ }
+
+ return settings;
+}
+
+/**
* shell_global_get_current_time:
* @global: A #ShellGlobal
*
diff --git a/src/shell-global.h b/src/shell-global.h
index 71bdf7d8..a5630ecd 100644
--- a/src/shell-global.h
+++ b/src/shell-global.h
@@ -35,6 +35,7 @@ GdkScreen *shell_global_get_gdk_screen (ShellGlobal *global);
MetaDisplay *shell_global_get_display (ShellGlobal *global);
GList *shell_global_get_window_actors (ShellGlobal *global);
GSettings *shell_global_get_settings (ShellGlobal *global);
+GSettings *shell_global_get_overrides_settings (ShellGlobal *global);
guint32 shell_global_get_current_time (ShellGlobal *global);