From fb808312696eb8cf91d04ff6cdfcec3b220c1e8a Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Fri, 8 Feb 2019 23:00:18 +0100 Subject: [PATCH] inputMethod: Handle OSK hiding after unfocus Set a small timeout in order to let focus changes preserve OSK state. If focus is eventually unset, the OSK will be hidden. https://gitlab.gnome.org/GNOME/gtk/issues/1277 https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/397 --- js/misc/inputMethod.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js index ce2002a09..8d46264e1 100644 --- a/js/misc/inputMethod.js +++ b/js/misc/inputMethod.js @@ -1,8 +1,10 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- -const { Clutter, GObject, IBus } = imports.gi; +const { Clutter, GLib, GObject, IBus } = imports.gi; const Keyboard = imports.ui.status.keyboard; +var HIDE_PANEL_TIME = 50; + var InputMethod = GObject.registerClass( class InputMethod extends Clutter.InputMethod { _init() { @@ -13,6 +15,7 @@ class InputMethod extends Clutter.InputMethod { this._preeditStr = ''; this._preeditPos = 0; this._preeditVisible = false; + this._hidePanelId = 0; this._ibus = IBus.Bus.new_async(); this._ibus.connect('connected', this._onConnected.bind(this)); this._ibus.connect('disconnected', this._clear.bind(this)); @@ -136,6 +139,11 @@ class InputMethod extends Clutter.InputMethod { this._updateCapabilities(); this._emitRequestSurrounding(); } + + if (this._hidePanelId) { + GLib.source_remove(this._hidePanelId); + this._hidePanelId = 0; + } } vfunc_focus_out() { @@ -150,6 +158,12 @@ class InputMethod extends Clutter.InputMethod { this.set_preedit_text(null, 0); this._preeditStr = null; } + + this._hidePanelId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, HIDE_PANEL_TIME, () => { + this.set_input_panel_state(Clutter.InputPanelState.OFF); + this._hidePanelId = 0; + return GLib.SOURCE_REMOVE; + }); } vfunc_reset() {