From 0dec5058bf8854419e66925b091416b9a7bcf8c7 Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Wed, 13 Mar 2013 20:09:49 +0100 Subject: [PATCH] fixed IME: IME context is properly restored when returning from a toolbar or button. --- .../Editing/ImeNativeWrapper.cs | 30 ++++--------------- .../Editing/ImeSupport.cs | 21 +++++++------ .../Editing/TextArea.cs | 4 +-- 3 files changed, 20 insertions(+), 35 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs index d8d0de240c..b978d7b26b 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs @@ -76,21 +76,15 @@ namespace ICSharpCode.AvalonEdit.Editing public const int WM_IME_SETCONTEXT = 0x281; public const int WM_INPUTLANGCHANGE = 0x51; -// [DllImport("imm32.dll")] -// public static extern IntPtr ImmCreateContext(); -// -// [DllImport("imm32.dll")] -// [return: MarshalAs(UnmanagedType.Bool)] -// public static extern bool ImmDestroyContext(IntPtr hIMC); - -// [DllImport("imm32.dll")] -// public static extern IntPtr ImmAssociateContext(IntPtr hWnd, IntPtr hIMC); - [DllImport("imm32.dll")] - static extern IntPtr ImmGetContext(IntPtr hWnd); + public static extern IntPtr ImmAssociateContext(IntPtr hWnd, IntPtr hIMC); + [DllImport("imm32.dll")] + internal static extern IntPtr ImmGetContext(IntPtr hWnd); + [DllImport("imm32.dll")] + internal static extern IntPtr ImmGetDefaultIMEWnd(IntPtr hWnd); [DllImport("imm32.dll")] [return: MarshalAs(UnmanagedType.Bool)] - static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC); + internal static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC); [DllImport("imm32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool ImmNotifyIME(IntPtr hIMC, int dwAction, int dwIndex, int dwValue = 0); @@ -124,18 +118,6 @@ namespace ICSharpCode.AvalonEdit.Editing return ImmNotifyIME(hIMC, NI_COMPOSITIONSTR, CPS_CANCEL); } - public static IntPtr GetContext(HwndSource source) - { - if (source == null) - return IntPtr.Zero; - return ImmGetContext(source.Handle); - } - - public static bool ReleaseContext(HwndSource source, IntPtr hIMC) - { - return source != null && hIMC != IntPtr.Zero && ImmReleaseContext(source.Handle, hIMC); - } - public static bool SetCompositionWindow(HwndSource source, IntPtr hIMC, TextArea textArea) { if (textArea == null) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs index 10fa063524..23c3c41c36 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs @@ -24,7 +24,8 @@ namespace ICSharpCode.AvalonEdit.Editing { readonly TextArea textArea; IntPtr currentContext; - //IntPtr previousContext; + IntPtr previousContext; + IntPtr defaultImeWnd; HwndSource hwndSource; public ImeSupport(TextArea textArea) @@ -47,16 +48,16 @@ namespace ICSharpCode.AvalonEdit.Editing void ClearContext() { if (hwndSource != null) { - //ImeNativeWrapper.AssociateContext(hwndSource, previousContext); - //ImeNativeWrapper.ImmDestroyContext(currentContext); - ImeNativeWrapper.ReleaseContext(hwndSource, currentContext); + ImeNativeWrapper.ImmAssociateContext(hwndSource.Handle, previousContext); + ImeNativeWrapper.ImmReleaseContext(defaultImeWnd, currentContext); currentContext = IntPtr.Zero; + defaultImeWnd = IntPtr.Zero; hwndSource.RemoveHook(WndProc); hwndSource = null; } } - public void OnGotFocus(KeyboardFocusChangedEventArgs e) + public void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e) { CreateContext(); } @@ -68,9 +69,11 @@ namespace ICSharpCode.AvalonEdit.Editing return; hwndSource = (HwndSource)PresentationSource.FromVisual(this.textArea); if (hwndSource != null) { - //currentContext = ImeNativeWrapper.ImmCreateContext(); - //previousContext = ImeNativeWrapper.AssociateContext(hwndSource, currentContext); - currentContext = ImeNativeWrapper.GetContext(hwndSource); + defaultImeWnd = ImeNativeWrapper.ImmGetDefaultIMEWnd(IntPtr.Zero); + currentContext = ImeNativeWrapper.ImmGetContext(defaultImeWnd); + previousContext = ImeNativeWrapper.ImmAssociateContext(hwndSource.Handle, currentContext); + Debug.Assert(hwndSource != null); + Debug.Assert(currentContext != null); hwndSource.AddHook(WndProc); // UpdateCompositionWindow() will be called by the caret becoming visible @@ -83,7 +86,7 @@ namespace ICSharpCode.AvalonEdit.Editing } } - public void OnLostFocus(KeyboardFocusChangedEventArgs e) + public void OnLostKeyboardFocus(KeyboardFocusChangedEventArgs e) { if (e.OldFocus == textArea && currentContext != IntPtr.Zero) ImeNativeWrapper.NotifyIme(currentContext); diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs index 3eaffdedc9..31607759f8 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs @@ -758,7 +758,7 @@ namespace ICSharpCode.AvalonEdit.Editing { base.OnGotKeyboardFocus(e); // First activate IME, then show caret - ime.OnGotFocus(e); + ime.OnGotKeyboardFocus(e); caret.Show(); } @@ -767,7 +767,7 @@ namespace ICSharpCode.AvalonEdit.Editing { base.OnLostKeyboardFocus(e); caret.Hide(); - ime.OnLostFocus(e); + ime.OnLostKeyboardFocus(e); } #endregion