status/keyboard: Use gnome-desktop API for getting default input sources list

At the moment, gnome-shell tries to figure out the default input sources
from localed. It fails to take into account the system locale and input
methods.

This commit switches it to use a new function in gnome-desktop,
gnome_get_default_input_sources, which does most of the heavy
lifting itself, instead.
This commit is contained in:
Ray Strode 2023-08-16 14:09:50 -04:00 committed by Florian Müllner
parent 3d8471bf08
commit ff6ae7291a

View file

@ -3,6 +3,7 @@
import Clutter from 'gi://Clutter'; import Clutter from 'gi://Clutter';
import Gio from 'gi://Gio'; import Gio from 'gi://Gio';
import GLib from 'gi://GLib'; import GLib from 'gi://GLib';
import GnomeDesktop from 'gi://GnomeDesktop';
import GObject from 'gi://GObject'; import GObject from 'gi://GObject';
import IBus from 'gi://IBus'; import IBus from 'gi://IBus';
import Meta from 'gi://Meta'; import Meta from 'gi://Meta';
@ -25,6 +26,8 @@ export const INPUT_SOURCE_TYPE_IBUS = 'ibus';
const DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources'; const DESKTOP_INPUT_SOURCES_SCHEMA = 'org.gnome.desktop.input-sources';
const KEY_INPUT_SOURCES = 'sources'; const KEY_INPUT_SOURCES = 'sources';
Gio._promisify(GnomeDesktop, 'get_default_input_sources');
export const LayoutMenuItem = GObject.registerClass( export const LayoutMenuItem = GObject.registerClass(
class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem { class LayoutMenuItem extends PopupMenu.PopupBaseMenuItem {
_init(displayName, shortName) { _init(displayName, shortName) {
@ -202,9 +205,9 @@ class InputSourceSystemSettings extends InputSourceSettings {
this._BUS_IFACE = 'org.freedesktop.locale1'; this._BUS_IFACE = 'org.freedesktop.locale1';
this._BUS_PROPS_IFACE = 'org.freedesktop.DBus.Properties'; this._BUS_PROPS_IFACE = 'org.freedesktop.DBus.Properties';
this._layouts = ''; this._inputSourceIds = [];
this._variants = ''; this._inputSourceTypes = [];
this._options = ''; this._options = [];
this._model = ''; this._model = '';
this._reload().catch(error => { this._reload().catch(error => {
@ -221,30 +224,22 @@ class InputSourceSystemSettings extends InputSourceSettings {
} }
async _reload() { async _reload() {
let props; let inputSourceIds;
let inputSourceTypes;
let options;
let model;
try { try {
const result = await Gio.DBus.system.call( [inputSourceIds, inputSourceTypes, options, model] =
this._BUS_NAME, await GnomeDesktop.get_default_input_sources(null);
this._BUS_PATH,
this._BUS_PROPS_IFACE,
'GetAll',
new GLib.Variant('(s)', [this._BUS_IFACE]),
null, Gio.DBusCallFlags.NONE, -1, null);
[props] = result.deepUnpack();
} catch (e) { } catch (e) {
log(`Could not get properties from ${this._BUS_NAME}`); logError(e, 'Could not get default input sources');
return; return;
} }
const layouts = props['X11Layout'].unpack(); if (inputSourceIds !== this._inputSourceIds ||
const variants = props['X11Variant'].unpack(); inputSourceTypes !== this._inputSourceTypes) {
const options = props['X11Options'].unpack(); this._inputSourceIds = inputSourceIds;
const model = props['X11Model'].unpack(); this._inputSourceTypes = inputSourceTypes;
if (layouts !== this._layouts ||
variants !== this._variants) {
this._layouts = layouts;
this._variants = variants;
this._emitInputSourcesChanged(); this._emitInputSourcesChanged();
} }
if (options !== this._options) { if (options !== this._options) {
@ -258,21 +253,21 @@ class InputSourceSystemSettings extends InputSourceSettings {
} }
get inputSources() { get inputSources() {
let sourcesList = []; let sourcesList;
let layouts = this._layouts.split(',');
let variants = this._variants.split(',');
for (let i = 0; i < layouts.length && !!layouts[i]; i++) { if (this._inputSourceIds) {
let id = layouts[i]; sourcesList = this._inputSourceIds.map((id, index) => {
if (variants[i]) return {type: this._inputSourceTypes[index], id};
id += `+${variants[i]}`; });
sourcesList.push({type: INPUT_SOURCE_TYPE_XKB, id}); } else {
sourcesList = [];
} }
return sourcesList; return sourcesList;
} }
get keyboardOptions() { get keyboardOptions() {
return this._options.split(','); return this._options;
} }
get keyboardModel() { get keyboardModel() {