Browse Source

fixed IME: IME context is properly restored when returning from a toolbar or button.

pull/39/merge
Siegfried Pammer 13 years ago
parent
commit
0dec5058bf
  1. 30
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs
  2. 21
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs
  3. 4
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs

30
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_IME_SETCONTEXT = 0x281;
public const int WM_INPUTLANGCHANGE = 0x51; 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")] [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")] [DllImport("imm32.dll")]
[return: MarshalAs(UnmanagedType.Bool)] [return: MarshalAs(UnmanagedType.Bool)]
static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC); internal static extern bool ImmReleaseContext(IntPtr hWnd, IntPtr hIMC);
[DllImport("imm32.dll")] [DllImport("imm32.dll")]
[return: MarshalAs(UnmanagedType.Bool)] [return: MarshalAs(UnmanagedType.Bool)]
static extern bool ImmNotifyIME(IntPtr hIMC, int dwAction, int dwIndex, int dwValue = 0); 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); 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) public static bool SetCompositionWindow(HwndSource source, IntPtr hIMC, TextArea textArea)
{ {
if (textArea == null) if (textArea == null)

21
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs

@ -24,7 +24,8 @@ namespace ICSharpCode.AvalonEdit.Editing
{ {
readonly TextArea textArea; readonly TextArea textArea;
IntPtr currentContext; IntPtr currentContext;
//IntPtr previousContext; IntPtr previousContext;
IntPtr defaultImeWnd;
HwndSource hwndSource; HwndSource hwndSource;
public ImeSupport(TextArea textArea) public ImeSupport(TextArea textArea)
@ -47,16 +48,16 @@ namespace ICSharpCode.AvalonEdit.Editing
void ClearContext() void ClearContext()
{ {
if (hwndSource != null) { if (hwndSource != null) {
//ImeNativeWrapper.AssociateContext(hwndSource, previousContext); ImeNativeWrapper.ImmAssociateContext(hwndSource.Handle, previousContext);
//ImeNativeWrapper.ImmDestroyContext(currentContext); ImeNativeWrapper.ImmReleaseContext(defaultImeWnd, currentContext);
ImeNativeWrapper.ReleaseContext(hwndSource, currentContext);
currentContext = IntPtr.Zero; currentContext = IntPtr.Zero;
defaultImeWnd = IntPtr.Zero;
hwndSource.RemoveHook(WndProc); hwndSource.RemoveHook(WndProc);
hwndSource = null; hwndSource = null;
} }
} }
public void OnGotFocus(KeyboardFocusChangedEventArgs e) public void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
{ {
CreateContext(); CreateContext();
} }
@ -68,9 +69,11 @@ namespace ICSharpCode.AvalonEdit.Editing
return; return;
hwndSource = (HwndSource)PresentationSource.FromVisual(this.textArea); hwndSource = (HwndSource)PresentationSource.FromVisual(this.textArea);
if (hwndSource != null) { if (hwndSource != null) {
//currentContext = ImeNativeWrapper.ImmCreateContext(); defaultImeWnd = ImeNativeWrapper.ImmGetDefaultIMEWnd(IntPtr.Zero);
//previousContext = ImeNativeWrapper.AssociateContext(hwndSource, currentContext); currentContext = ImeNativeWrapper.ImmGetContext(defaultImeWnd);
currentContext = ImeNativeWrapper.GetContext(hwndSource); previousContext = ImeNativeWrapper.ImmAssociateContext(hwndSource.Handle, currentContext);
Debug.Assert(hwndSource != null);
Debug.Assert(currentContext != null);
hwndSource.AddHook(WndProc); hwndSource.AddHook(WndProc);
// UpdateCompositionWindow() will be called by the caret becoming visible // 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) if (e.OldFocus == textArea && currentContext != IntPtr.Zero)
ImeNativeWrapper.NotifyIme(currentContext); ImeNativeWrapper.NotifyIme(currentContext);

4
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs

@ -758,7 +758,7 @@ namespace ICSharpCode.AvalonEdit.Editing
{ {
base.OnGotKeyboardFocus(e); base.OnGotKeyboardFocus(e);
// First activate IME, then show caret // First activate IME, then show caret
ime.OnGotFocus(e); ime.OnGotKeyboardFocus(e);
caret.Show(); caret.Show();
} }
@ -767,7 +767,7 @@ namespace ICSharpCode.AvalonEdit.Editing
{ {
base.OnLostKeyboardFocus(e); base.OnLostKeyboardFocus(e);
caret.Hide(); caret.Hide();
ime.OnLostFocus(e); ime.OnLostKeyboardFocus(e);
} }
#endregion #endregion

Loading…
Cancel
Save