Browse Source

Clear IMM state when window is closed.

pull/8206/head
Dariusz Komosinski 4 years ago
parent
commit
ea4d92ddaf
  1. 18
      src/Windows/Avalonia.Win32/Input/Imm32InputMethod.cs
  2. 6
      src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs

18
src/Windows/Avalonia.Win32/Input/Imm32InputMethod.cs

@ -37,6 +37,24 @@ namespace Avalonia.Win32.Input
IsComposing = false;
}
public void ClearLanguageAndWindow()
{
if (HWND != IntPtr.Zero && _defaultImc != IntPtr.Zero)
{
ImmReleaseContext(HWND, _defaultImc);
}
_defaultImc = IntPtr.Zero;
HWND = IntPtr.Zero;
_parent = null;
_active = false;
_langId = 0;
_showCompositionWindow = false;
_showCandidateList = false;
IsComposing = false;
}
//Dependant on CurrentThread. When Avalonia will support Multiple Dispatchers -
//every Dispatcher should have their own InputMethod.
public static Imm32InputMethod Current { get; } = new Imm32InputMethod();

6
src/Windows/Avalonia.Win32/WindowImpl.AppWndProc.cs

@ -82,6 +82,12 @@ namespace Avalonia.Win32
case WindowsMessage.WM_DESTROY:
{
UiaCoreProviderApi.UiaReturnRawElementProvider(_hwnd, IntPtr.Zero, IntPtr.Zero, null);
// We need to release IMM context and state to avoid leaks.
if (Imm32InputMethod.Current.HWND == _hwnd)
{
Imm32InputMethod.Current.ClearLanguageAndWindow();
}
//Window doesn't exist anymore
_hwnd = IntPtr.Zero;

Loading…
Cancel
Save