Blob Blame History Raw
From 2298cfa0c9083fef432b9c51341f5ee75e7ebacb Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 16 Aug 2023 11:13:39 -0400
Subject: [PATCH 2/3] status/keyboard: Load keyboard from system settings if
 gsettings unconfigured

Right now if a user hasn't configured their input sources, the code falls back to
using the current layout on Xorg and the mutter default with wayland.

This commit changes the code to instead fall back to using the system
default (as configured by localed).
---
 js/ui/status/keyboard.js | 58 +++++++++++++++++++++++++++++++---------
 1 file changed, 45 insertions(+), 13 deletions(-)

diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js
index 7277c6d099..97e35d482c 100644
--- a/js/ui/status/keyboard.js
+++ b/js/ui/status/keyboard.js
@@ -22,6 +22,9 @@ import * as Util from '../../misc/util.js';
 export const INPUT_SOURCE_TYPE_XKB = 'xkb';
 export const INPUT_SOURCE_TYPE_IBUS = 'ibus';
 
+const DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources';
+const KEY_INPUT_SOURCES = 'sources';
+
 export const LayoutMenuItem = GObject.registerClass(
 class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem {
     _init(displayName, shortName) {
@@ -263,17 +266,15 @@ class InputSourceSystemSettings extends InputSourceSettings {
 }
 
 class InputSourceSessionSettings extends InputSourceSettings {
-    constructor() {
+    constructor(settings) {
         super();
 
-        this._DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources';
-        this._KEY_INPUT_SOURCES = 'sources';
         this._KEY_MRU_SOURCES = 'mru-sources';
         this._KEY_KEYBOARD_OPTIONS = 'xkb-options';
         this._KEY_PER_WINDOW = 'per-window';
 
-        this._settings = new Gio.Settings({schema_id: this._DESKTOP_INPUT_SOURCES_SCHEMA});
-        this._settings.connect(`changed::${this._KEY_INPUT_SOURCES}`, this._emitInputSourcesChanged.bind(this));
+        this._settings = settings;
+        this._settings.connect(`changed::${KEY_INPUT_SOURCES}`, this._emitInputSourcesChanged.bind(this));
         this._settings.connect(`changed::${this._KEY_KEYBOARD_OPTIONS}`, this._emitKeyboardOptionsChanged.bind(this));
         this._settings.connect(`changed::${this._KEY_PER_WINDOW}`, this._emitPerWindowChanged.bind(this));
     }
@@ -291,7 +292,7 @@ class InputSourceSessionSettings extends InputSourceSettings {
     }
 
     get inputSources() {
-        return this._getSourcesList(this._KEY_INPUT_SOURCES);
+        return this._getSourcesList(KEY_INPUT_SOURCES);
     }
 
     get mruSources() {
@@ -342,12 +343,6 @@ export class InputSourceManager extends Signals.EventEmitter {
                 Meta.KeyBindingFlags.IS_REVERSED,
                 Shell.ActionMode.ALL,
                 this._switchInputSource.bind(this));
-        if (Main.sessionMode.isGreeter)
-            this._settings = new InputSourceSystemSettings();
-        else
-            this._settings = new InputSourceSessionSettings();
-        this._settings.connect('input-sources-changed', this._inputSourcesChanged.bind(this));
-        this._settings.connect('keyboard-options-changed', this._keyboardOptionsChanged.bind(this));
 
         this._xkbInfo = KeyboardManager.getXkbInfo();
         this._keyboardManager = KeyboardManager.getKeyboardManager();
@@ -359,16 +354,53 @@ export class InputSourceManager extends Signals.EventEmitter {
         this._ibusManager.connect('property-updated', this._ibusPropertyUpdated.bind(this));
         this._ibusManager.connect('set-content-type', this._ibusSetContentType.bind(this));
 
+        this._inputSettings = new Gio.Settings({schema_id: DESKTOP_INPUT_SOURCES_SCHEMA});
+        this._setupInputSettings();
+
         global.display.connect('modifiers-accelerator-activated', this._modifiersSwitcher.bind(this));
 
         this._sourcesPerWindow = false;
         this._focusWindowNotifyId = 0;
-        this._settings.connect('per-window-changed', this._sourcesPerWindowChanged.bind(this));
         this._sourcesPerWindowChanged();
         this._disableIBus = false;
         this._reloading = false;
     }
 
+    _sessionHasNoInputSettings() {
+        return this._inputSettings.get_user_value(KEY_INPUT_SOURCES) === null;
+    }
+
+    _reloadInputSettings() {
+        const hadNoSessionInputSettings = this._hasNoSessionInputSettings;
+
+        if (Main.sessionMode.isGreeter)
+            this._hasNoSessionInputSettings = true;
+        else
+            this._hasNoSessionInputSettings = this._sessionHasNoInputSettings();
+
+        if (this._settings && hadNoSessionInputSettings === this._hasNoSessionInputSettings)
+            return;
+
+        this._settings?.disconnectObject(this);
+
+        if (this._hasNoSessionInputSettings)
+            this._settings = new InputSourceSystemSettings();
+        else
+            this._settings = new InputSourceSessionSettings(this._inputSettings);
+
+        this._settings.connectObject('input-sources-changed', this._inputSourcesChanged.bind(this),
+                                     'keyboard-options-changed', this._keyboardOptionsChanged.bind(this),
+                                     'per-window-changed', this._sourcesPerWindowChanged.bind(this), this);
+        this.reload();
+    }
+
+    _setupInputSettings() {
+        if (!Main.sessionMode.isGreeter)
+            this._inputSettings.connect(`changed::${KEY_INPUT_SOURCES}`, this._reloadInputSettings.bind(this));
+
+        this._reloadInputSettings();
+    }
+
     reload() {
         this._reloading = true;
         this._keyboardManager.setKeyboardOptions(this._settings.keyboardOptions);
-- 
2.43.0