inputMethod: Keep track of preedit string visibility

So we can silence update-preedit-text signals that keep the
preedit string invisible.

https://gitlab.gnome.org/GNOME/gtk/issues/1447
This commit is contained in:
Carlos Garnacho 2018-11-13 18:28:15 +01:00
parent 8c3811a866
commit 6f5a099184

View File

@ -17,6 +17,7 @@ var InputMethod = new Lang.Class({
this._currentFocus = null; this._currentFocus = null;
this._preeditStr = ''; this._preeditStr = '';
this._preeditPos = 0; this._preeditPos = 0;
this._preeditVisible = false;
this._ibus = IBus.Bus.new_async(); this._ibus = IBus.Bus.new_async();
this._ibus.connect('connected', this._onConnected.bind(this)); this._ibus.connect('connected', this._onConnected.bind(this));
this._ibus.connect('disconnected', this._clear.bind(this)); this._ibus.connect('disconnected', this._clear.bind(this));
@ -80,6 +81,7 @@ var InputMethod = new Lang.Class({
this._enabled = false; this._enabled = false;
this._preeditStr = '' this._preeditStr = ''
this._preeditPos = 0; this._preeditPos = 0;
this._preeditVisible = false;
}, },
_emitRequestSurrounding() { _emitRequestSurrounding() {
@ -98,20 +100,27 @@ var InputMethod = new Lang.Class({
_onUpdatePreeditText(context, text, pos, visible) { _onUpdatePreeditText(context, text, pos, visible) {
if (text == null) if (text == null)
return; return;
this._preeditStr = text.get_text();
this._preeditPos = pos; let preedit = text.get_text();
if (visible) if (visible)
this.set_preedit_text(this._preeditStr, pos); this.set_preedit_text(preedit, pos);
else else if (this._preeditVisible)
this.set_preedit_text(null, pos); this.set_preedit_text(null, pos);
this._preeditStr = preedit;
this._preeditPos = pos;
this._preeditVisible = visible;
}, },
_onShowPreeditText(context) { _onShowPreeditText(context) {
this._preeditVisible = true;
this.set_preedit_text(this._preeditStr, this._preeditPos); this.set_preedit_text(this._preeditStr, this._preeditPos);
}, },
_onHidePreeditText(context) { _onHidePreeditText(context) {
this.set_preedit_text(null, this._preeditPos); this.set_preedit_text(null, this._preeditPos);
this._preeditVisible = false;
}, },
_onForwardKeyEvent(context, keyval, keycode, state) { _onForwardKeyEvent(context, keyval, keycode, state) {