From 4d8af585211dda298774de4efe8cb3eb829e6514 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 18 Oct 2023 01:45:29 +0600 Subject: [PATCH] iBus: Ignore CommitText signal if it was sent while context is being Reset --- .../DBusIme/DBusTextInputMethodBase.cs | 2 +- .../DBusIme/IBus/IBusX11TextInputMethod.cs | 29 +++++++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.FreeDesktop/DBusIme/DBusTextInputMethodBase.cs b/src/Avalonia.FreeDesktop/DBusIme/DBusTextInputMethodBase.cs index ee118d92b5..6cd24c49eb 100644 --- a/src/Avalonia.FreeDesktop/DBusIme/DBusTextInputMethodBase.cs +++ b/src/Avalonia.FreeDesktop/DBusIme/DBusTextInputMethodBase.cs @@ -308,9 +308,9 @@ namespace Avalonia.FreeDesktop.DBusIme void ITextInputMethodImpl.Reset() { - Reset(); _queue.Enqueue(async () => { + Reset(); if (!IsConnected) return; await ResetContextCore(); diff --git a/src/Avalonia.FreeDesktop/DBusIme/IBus/IBusX11TextInputMethod.cs b/src/Avalonia.FreeDesktop/DBusIme/IBus/IBusX11TextInputMethod.cs index 3ab83b8591..35dc18288a 100644 --- a/src/Avalonia.FreeDesktop/DBusIme/IBus/IBusX11TextInputMethod.cs +++ b/src/Avalonia.FreeDesktop/DBusIme/IBus/IBusX11TextInputMethod.cs @@ -18,6 +18,7 @@ namespace Avalonia.FreeDesktop.DBusIme.IBus private string? _preeditText; private int _preeditCursor; private bool _preeditShown = true; + private int _insideReset = 0; public IBusX11TextInputMethod(Connection connection) : base(connection, "org.freedesktop.portal.IBus") { } @@ -103,6 +104,14 @@ namespace Avalonia.FreeDesktop.DBusIme.IBus private void OnCommitText(Exception? e, DBusVariantItem variantItem) { + if (_insideReset > 0) + { + // For some reason iBus can trigger a CommitText while being reset. + // Thankfully the signal is sent _during_ Reset call processing, + // so it arrives on-the-wire before Reset call result, so we can + // check if we have any pending Reset calls and ignore the signal here + return; + } if (e is not null) { Logger.TryGet(LogEventLevel.Error, LogArea.FreeDesktopPlatform)?.Log(this, $"OnCommitText failed: {e}"); @@ -130,10 +139,23 @@ namespace Avalonia.FreeDesktop.DBusIme.IBus => (active ? _context?.FocusInAsync() : _context?.FocusOutAsync()) ?? Task.CompletedTask; - protected override Task ResetContextCore() + protected override async Task ResetContextCore() { _preeditShown = true; - return _context?.ResetAsync() ?? Task.CompletedTask; + if (_context == null) + return; + if (_context == null) + return; + + try + { + _insideReset++; + await _context.ResetAsync(); + } + finally + { + _insideReset--; + } } protected override Task HandleKeyCore(RawKeyEventArgs args, int keyVal, int keyCode) @@ -164,7 +186,8 @@ namespace Avalonia.FreeDesktop.DBusIme.IBus var caps = IBusCapability.CapFocus; if (supportsPreedit) caps |= IBusCapability.CapPreeditText; - await _context.SetCapabilitiesAsync((uint)caps); + if (_context != null) + await _context.SetCapabilitiesAsync((uint)caps); } } }