[gnome-shell/wip/carlosg/ibus-assert] inputMethod: Compare ibus context before processing key event result



commit c3e58548b832e26aa771f12b70777d680bd79fbc
Author: Carlos Garnacho <carlosg gnome org>
Date:   Thu Nov 7 19:06:15 2019 +0100

    inputMethod: Compare ibus context before processing key event result
    
    In the xwayland-on-demand scenario, it may happen that Xwayland is
    shutdown (causing a restart of ibus-daemon to drop ibus-x11) while
    we are typing.
    
    If we have a bit of bad luck, this will cause the IBusInputContext
    to be disposed (due to its bus "closing") at a time when we have
    an ibus_input_context_process_key_event_async() request on the fly.
    
    As the object is disposed in between this would tickle JS (rightfully
    complaining that it's been disposed under its feet) and make us pass
    an actually NULL IBusInputContext to the corresponding _finish()
    function (despite the IBusInputContext being still held alive by some
    other refs). This will assert and abort in
    ibus_input_context_process_key_event_async_finish() then.
    
    To handle this, listen for IBusInputContext::destroy, and reset our
    internal state, this way we can compare on the JS side that the
    IBusInputContext is indeed an up-to-date one.

 js/misc/inputMethod.js | 4 ++++
 1 file changed, 4 insertions(+)
---
diff --git a/js/misc/inputMethod.js b/js/misc/inputMethod.js
index 42bf7f6321..545cea63af 100644
--- a/js/misc/inputMethod.js
+++ b/js/misc/inputMethod.js
@@ -69,6 +69,7 @@ class InputMethod extends Clutter.InputMethod {
         this._context.connect('show-preedit-text', this._onShowPreeditText.bind(this));
         this._context.connect('hide-preedit-text', this._onHidePreeditText.bind(this));
         this._context.connect('forward-key-event', this._onForwardKeyEvent.bind(this));
+        this._context.connect('destroy', this._clear.bind(this));
 
         this._updateCapabilities();
     }
@@ -264,6 +265,9 @@ class InputMethod extends Clutter.InputMethod {
             event.get_key_code() - 8, // Convert XKB keycodes to evcodes
             state, -1, this._cancellable,
             (context, res) => {
+                if (context != this._context)
+                    return;
+
                 try {
                     let retval = context.process_key_event_async_finish(res);
                     this.notify_key_event(event, retval);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]