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 @@ -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 @@ -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)

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

@ -24,7 +24,8 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -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 @@ -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 @@ -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 @@ -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);

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

@ -758,7 +758,7 @@ namespace ICSharpCode.AvalonEdit.Editing @@ -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 @@ -767,7 +767,7 @@ namespace ICSharpCode.AvalonEdit.Editing
{
base.OnLostKeyboardFocus(e);
caret.Hide();
ime.OnLostFocus(e);
ime.OnLostKeyboardFocus(e);
}
#endregion

Loading…
Cancel
Save