From 157c08c79707a3e85bf99cbdf9d9cd2d0ede10ac Mon Sep 17 00:00:00 2001 From: Benedikt Stebner Date: Tue, 4 Jun 2024 15:12:54 +0200 Subject: [PATCH] Make sure focus lost is delayed until IMM32 has finished up the composition on kill focus (#15907) --- .../Avalonia.Win32/WindowImpl.AppWndProc.cs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs index 35b823d34c..29d4a614de 100644 --- a/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs +++ b/src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs @@ -19,6 +19,8 @@ namespace Avalonia.Win32 { internal partial class WindowImpl { + private bool _killFocusRequested; + [SuppressMessage("Microsoft.StyleCop.CSharp.NamingRules", "SA1305:FieldNamesMustNotUseHungarianNotation", Justification = "Using Win32 naming for consistency.")] [UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "We do .NET COM interop availability checks")] @@ -718,7 +720,15 @@ namespace Avalonia.Win32 } case WindowsMessage.WM_KILLFOCUS: - LostFocus?.Invoke(); + if (Imm32InputMethod.Current.IsComposing) + { + _killFocusRequested = true; + } + else + { + LostFocus?.Invoke(); + } + break; case WindowsMessage.WM_INPUTLANGCHANGE: @@ -763,6 +773,13 @@ namespace Avalonia.Win32 { Imm32InputMethod.Current.HandleCompositionEnd(timestamp); + if (_killFocusRequested) + { + LostFocus?.Invoke(); + + _killFocusRequested = false; + } + return IntPtr.Zero; } case WindowsMessage.WM_GETOBJECT: