[gnome-shell/wip/carlosg/fallback-im-virtual-keys: 10/10] inputMethod: Check return value when letting IM handle virtual keys
- From: Marge Bot <marge-bot src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/wip/carlosg/fallback-im-virtual-keys: 10/10] inputMethod: Check return value when letting IM handle virtual keys
- Date: Tue, 18 Oct 2022 19:32:03 +0000 (UTC)
commit 76090c14ebbda0c7c27870516db265c7f6fed5bd
Author: Carlos Garnacho <carlosg gnome org>
Date: Tue Oct 11 18:24:15 2022 +0200
inputMethod: Check return value when letting IM handle virtual keys
When propagating keys from the OSK, we usually feed these directly to
the IBusInputContext and let the IM handle the effects of this virtual
key event (which may also include feeding a key event back to us).
But these functions may also return a FALSE value if the key was "let
through" by the IM, which means the ball is in our yard again, and
we are responsible of letting this event get to its destination.
If that happens, just fall through, so the string is committed to
the client as an UTF-8 string, or propagated through keyboard events.
Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/5930
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2508>
js/misc/inputMethod.js | 19 ++++++++++++++-----
js/ui/keyboard.js | 6 +++---
2 files changed, 17 insertions(+), 8 deletions(-)
---
diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js
index cb70f93f7a..3ee96a7faf 100644
--- a/js/misc/inputMethod.js
+++ b/js/misc/inputMethod.js
@@ -7,6 +7,8 @@ const Main = imports.ui.main;
Gio._promisify(IBus.Bus.prototype,
'create_input_context_async', 'create_input_context_async_finish');
+Gio._promisify(IBus.InputContext.prototype,
+ 'process_key_event_async', 'process_key_event_async_finish');
var HIDE_PANEL_TIME = 50;
@@ -332,10 +334,17 @@ var InputMethod = GObject.registerClass({
return this._preeditVisible && this._preeditStr !== '' && this._preeditStr !== null;
}
- handleVirtualKey(keyval) {
- this._context.process_key_event_async(
- keyval, 0, 0, -1, null, null);
- this._context.process_key_event_async(
- keyval, 0, IBus.ModifierType.RELEASE_MASK, -1, null, null);
+ async handleVirtualKey(keyval) {
+ try {
+ if (!await this._context.process_key_event_async(
+ keyval, 0, 0, -1, null))
+ return false;
+
+ await this._context.process_key_event_async(
+ keyval, 0, IBus.ModifierType.RELEASE_MASK, -1, null);
+ return true;
+ } catch (e) {
+ return false;
+ }
}
});
diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js
index 28369316e1..3241571de7 100644
--- a/js/ui/keyboard.js
+++ b/js/ui/keyboard.js
@@ -1569,11 +1569,11 @@ var Keyboard = GObject.registerClass({
}
}
- _commitAction(keyval, str) {
+ async _commitAction(keyval, str) {
if (this._modifiers.size === 0 && str !== '' &&
keyval && this._oskCompletionEnabled) {
- Main.inputMethod.handleVirtualKey(keyval);
- return;
+ if (await Main.inputMethod.handleVirtualKey(keyval))
+ return;
}
if (str === '' || !Main.inputMethod.currentFocus ||
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]