From 67b43f86f357201940e18fe9188ef91c2e35394e Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 10 May 2012 21:30:07 +0200 Subject: [PATCH] improve IME support --- .../Editing/ImeNativeWrapper.cs | 18 ++++++++++++ .../Editing/ImeSupport.cs | 29 +++++++++++++++++-- .../TextEditorOptions.cs | 2 +- 3 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs index 4a1f38e92c..1e81993239 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeNativeWrapper.cs @@ -16,6 +16,7 @@ using ICSharpCode.AvalonEdit; using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Rendering; using ICSharpCode.AvalonEdit.Utils; +using Draw = System.Drawing; namespace ICSharpCode.AvalonEdit.Editing { @@ -70,7 +71,9 @@ namespace ICSharpCode.AvalonEdit.Editing const int CPS_CANCEL = 0x4; const int NI_COMPOSITIONSTR = 0x15; const int GCS_COMPSTR = 0x0008; + public const int WM_IME_COMPOSITION = 0x10F; + public const int WM_INPUTLANGCHANGE = 0x51; [DllImport("imm32.dll")] static extern IntPtr ImmAssociateContext(IntPtr hWnd, IntPtr hIMC); @@ -85,6 +88,12 @@ namespace ICSharpCode.AvalonEdit.Editing [DllImport("imm32.dll")] [return: MarshalAs(UnmanagedType.Bool)] static extern bool ImmSetCompositionWindow(IntPtr hIMC, ref CompositionForm form); + [DllImport("imm32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool ImmSetCompositionFont(IntPtr hIMC, ref LOGFONT font); + [DllImport("imm32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool ImmGetCompositionFont(IntPtr hIMC, out LOGFONT font); public static IntPtr AssociateContext(HwndSource source, IntPtr hIMC) { @@ -132,6 +141,15 @@ namespace ICSharpCode.AvalonEdit.Editing return ImmSetCompositionWindow(hIMC, ref form); } + public static bool SetCompositionFont(HwndSource source, IntPtr hIMC, TextArea textArea) + { + if (textArea == null) + throw new ArgumentNullException("textArea"); +// LOGFONT font = new LOGFONT(); +// ImmGetCompositionFont(hIMC, out font); + return false; + } + static Rect GetBounds(this TextView textView) { Point location = textView.TranslatePoint(new Point(0,0), textView); diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs index 5e3082b0dd..934c546210 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/ImeSupport.cs @@ -34,9 +34,17 @@ namespace ICSharpCode.AvalonEdit.Editing InputMethod.SetIsInputMethodSuspended(this.textArea, true); textArea.GotKeyboardFocus += TextAreaGotKeyboardFocus; textArea.LostKeyboardFocus += TextAreaLostKeyboardFocus; + textArea.OptionChanged += TextAreaOptionChanged; currentContext = IntPtr.Zero; previousContext = IntPtr.Zero; } + + void TextAreaOptionChanged(object sender, PropertyChangedEventArgs e) + { + if (e.PropertyName == "EnableImeSupport" && textArea.IsKeyboardFocusWithin) { + CreateContext(); + } + } public void Dispose() { @@ -66,10 +74,20 @@ namespace ICSharpCode.AvalonEdit.Editing return; if (e.OriginalSource != this.textArea) return; + CreateContext(); + } + + void CreateContext() + { + if (this.textArea == null) + return; + if (!textArea.Options.EnableImeSupport) + return; hwndSource = (HwndSource)PresentationSource.FromVisual(this.textArea); if (hwndSource != null) { currentContext = ImeNativeWrapper.GetContext(hwndSource); previousContext = ImeNativeWrapper.AssociateContext(hwndSource, currentContext); +// ImeNativeWrapper.SetCompositionFont(hwndSource, currentContext, textArea); hwndSource.AddHook(WndProc); } } @@ -85,8 +103,15 @@ namespace ICSharpCode.AvalonEdit.Editing IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { - if (msg == ImeNativeWrapper.WM_IME_COMPOSITION) - UpdateCompositionWindow(); + switch (msg) { + case ImeNativeWrapper.WM_INPUTLANGCHANGE: + ClearContext(); + CreateContext(); + break; + case ImeNativeWrapper.WM_IME_COMPOSITION: + UpdateCompositionWindow(); + break; + } return IntPtr.Zero; } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs index 95ee2498c7..897fcbcf45 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs @@ -382,7 +382,7 @@ namespace ICSharpCode.AvalonEdit } } - bool enableImeSupport; + bool enableImeSupport = true; /// /// Gets/Sets whether the support for Input Method Editors (IME)