[gnome-shell/wip/carlosg/fallback-im-virtual-keys: 2/2] inputMethod: Check return value when letting IM handle virtual keys




commit 5863717fbeeda34ffc3890ddd06486398b150276
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

 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 7bf6646d80..13b46f2565 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;
 
@@ -329,10 +331,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 82e3927b19..e52a168dd6 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]