From 455526804beab00adc7b96d01b7e53355123c3d7 Mon Sep 17 00:00:00 2001 From: Ray Strode 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 | 56 ++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js index 4ef2f35..156efde 100644 --- a/js/ui/status/keyboard.js +++ b/js/ui/status/keyboard.js @@ -278,18 +278,16 @@ 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_KEYBOARD_MODEL = 'xkb-model'; 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_KEYBOARD_MODEL}`, this._emitKeyboardModelChanged.bind(this)); this._settings.connect(`changed::${this._KEY_PER_WINDOW}`, this._emitPerWindowChanged.bind(this)); @@ -308,7 +306,7 @@ class InputSourceSessionSettings extends InputSourceSettings { } get inputSources() { - return this._getSourcesList(this._KEY_INPUT_SOURCES); + return this._getSourcesList(KEY_INPUT_SOURCES); } get mruSources() { @@ -363,13 +361,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._settings.connect('keyboard-model-changed', this._keyboardModelChanged.bind(this)); this._xkbInfo = KeyboardManager.getXkbInfo(); this._keyboardManager = KeyboardManager.getKeyboardManager(); @@ -381,16 +372,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); diff --git a/js/ui/status/keyboard.js b/js/ui/status/keyboard.js index 156efde..b76bba2 100644 --- a/js/ui/status/keyboard.js +++ b/js/ui/status/keyboard.js @@ -19,6 +19,9 @@ import * as PanelMenu from '../panelMenu.js'; import * as SwitcherPopup from '../switcherPopup.js'; import * as Util from '../../misc/util.js'; +const DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources'; +const KEY_INPUT_SOURCES = 'sources'; + export const INPUT_SOURCE_TYPE_XKB = 'xkb'; export const INPUT_SOURCE_TYPE_IBUS = 'ibus';