ibusManager: Check existence of IBus systemd units before manual start

IBus is moving to being a systemd managed service in GNOME sessions
(see https://github.com/ibus/ibus/pull/2377). Since there will be a
transition period, and we still have to support non-systemd sessions,
check for this existence at runtime.

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2171>
This commit is contained in:
Carlos Garnacho 2022-02-10 14:08:06 +01:00 committed by Marge Bot
parent 352c9695f3
commit c12f085530

View File

@ -1,7 +1,7 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
/* exported getIBusManager */ /* exported getIBusManager */
const { Gio, GLib, IBus, Meta } = imports.gi; const { Gio, GLib, IBus, Meta, Shell } = imports.gi;
const Signals = imports.signals; const Signals = imports.signals;
const IBusCandidatePopup = imports.ui.ibusCandidatePopup; const IBusCandidatePopup = imports.ui.ibusCandidatePopup;
@ -14,11 +14,13 @@ Gio._promisify(IBus.Bus.prototype,
'get_global_engine_async', 'get_global_engine_async_finish'); 'get_global_engine_async', 'get_global_engine_async_finish');
Gio._promisify(IBus.Bus.prototype, Gio._promisify(IBus.Bus.prototype,
'set_global_engine_async', 'set_global_engine_async_finish'); 'set_global_engine_async', 'set_global_engine_async_finish');
Gio._promisify(Shell, 'util_systemd_unit_exists');
// Ensure runtime version matches // Ensure runtime version matches
_checkIBusVersion(1, 5, 2); _checkIBusVersion(1, 5, 2);
let _ibusManager = null; let _ibusManager = null;
const IBUS_SYSTEMD_SERVICE = 'org.freedesktop.IBus.session.GNOME.service';
function _checkIBusVersion(requiredMajor, requiredMinor, requiredMicro) { function _checkIBusVersion(requiredMajor, requiredMinor, requiredMicro) {
if ((IBus.MAJOR_VERSION > requiredMajor) || if ((IBus.MAJOR_VERSION > requiredMajor) ||
@ -64,6 +66,27 @@ var IBusManager = class {
this._ibus.set_watch_ibus_signal(true); this._ibus.set_watch_ibus_signal(true);
this._ibus.connect('global-engine-changed', this._engineChanged.bind(this)); this._ibus.connect('global-engine-changed', this._engineChanged.bind(this));
this._queueSpawn();
}
async _ibusSystemdServiceExists() {
if (this._ibusIsSystemdService)
return true;
try {
this._ibusIsSystemdService =
await Shell.util_systemd_unit_exists(
IBUS_SYSTEMD_SERVICE, null);
} catch (e) {
this._ibusIsSystemdService = false;
}
return this._ibusIsSystemdService;
}
async _queueSpawn() {
const isSystemdService = await this._ibusSystemdServiceExists();
if (!isSystemdService)
this._spawn(Meta.is_wayland_compositor() ? [] : ['--xim']); this._spawn(Meta.is_wayland_compositor() ? [] : ['--xim']);
} }
@ -91,7 +114,9 @@ var IBusManager = class {
} }
} }
restartDaemon(extraArgs = []) { async restartDaemon(extraArgs = []) {
const isSystemdService = await this._ibusSystemdServiceExists();
if (!isSystemdService)
this._spawn(['-r', ...extraArgs]); this._spawn(['-r', ...extraArgs]);
} }