# HG changeset patch # User Jason Rumney # Date 1248278619 0 # Node ID 91b945d54645d7ab8ee5344a9e971fa6ef4be4fc # Parent 55ba5af4bf3a0e83eeb18518c348373e53a83fa3 * w32fns.c (w32_wnd_proc) [WM_IME_STARTCOMPOSITION]: Position IME window at cursor (Bug#2570). (w32_wnd_proc) [WM_IME_CHAR]: Release context when finished. (globals_of_w32fns): Dynamically load functions required above. * w32term.c (w32_draw_window_cursor): Send message to reposition any IME window. diff -r 55ba5af4bf3a -r 91b945d54645 src/ChangeLog --- a/src/ChangeLog Wed Jul 22 03:07:18 2009 +0000 +++ b/src/ChangeLog Wed Jul 22 16:03:39 2009 +0000 @@ -1,3 +1,13 @@ +2009-07-22 Jason Rumney + + * w32fns.c (w32_wnd_proc) [WM_IME_STARTCOMPOSITION]: Position + IME window at cursor (Bug#2570). + (w32_wnd_proc) [WM_IME_CHAR]: Release context when finished. + (globals_of_w32fns): Dynamically load functions required above. + + * w32term.c (w32_draw_window_cursor): Send message to reposition + any IME window. + 2009-07-21 Chong Yidong * fileio.c: Revert 2009-07-16 changes. diff -r 55ba5af4bf3a -r 91b945d54645 src/w32fns.c --- a/src/w32fns.c Wed Jul 22 03:07:18 2009 +0000 +++ b/src/w32fns.c Wed Jul 22 16:03:39 2009 +0000 @@ -252,6 +252,9 @@ typedef LONG (WINAPI * ImmGetCompositionString_Proc) (IN HIMC context, IN DWORD index, OUT LPVOID buffer, IN DWORD bufLen); typedef HIMC (WINAPI * ImmGetContext_Proc) (IN HWND window); +typedef HWND (WINAPI * ImmReleaseContext_Proc) (IN HWND wnd, IN HIMC context); +typedef HWND (WINAPI * ImmSetCompositionWindow_Proc) (IN HIMC context, + IN COMPOSITIONFORM *form); typedef HMONITOR (WINAPI * MonitorFromPoint_Proc) (IN POINT pt, IN DWORD flags); typedef BOOL (WINAPI * GetMonitorInfo_Proc) (IN HMONITOR monitor, OUT struct MONITOR_INFO* info); @@ -260,6 +263,8 @@ ClipboardSequence_Proc clipboard_sequence_fn = NULL; ImmGetCompositionString_Proc get_composition_string_fn = NULL; ImmGetContext_Proc get_ime_context_fn = NULL; +ImmReleaseContext_Proc release_ime_context_fn = NULL; +ImmSetCompositionWindow_Proc set_ime_composition_window_fn = NULL; MonitorFromPoint_Proc monitor_from_point_fn = NULL; GetMonitorInfo_Proc get_monitor_info_fn = NULL; @@ -3158,6 +3163,8 @@ buffer = alloca(size); size = get_composition_string_fn (context, GCS_RESULTSTR, buffer, size); + release_ime_context_fn (hwnd, context); + signal_user_input (); for (i = 0; i < size / sizeof (wchar_t); i++) { @@ -3173,6 +3180,40 @@ break; + case WM_IME_STARTCOMPOSITION: + if (!set_ime_composition_window_fn) + goto dflt; + else + { + COMPOSITIONFORM form; + HIMC context; + struct window *w; + + if (!context) + break; + + f = x_window_to_frame (dpyinfo, hwnd); + w = XWINDOW (FRAME_SELECTED_WINDOW (f)); + + form.dwStyle = CFS_RECT; + form.ptCurrentPos.x = w32_system_caret_x; + form.ptCurrentPos.y = w32_system_caret_y; + + form.rcArea.left = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, 0); + form.rcArea.top = (WINDOW_TOP_EDGE_Y (w) + + WINDOW_HEADER_LINE_HEIGHT (w)); + form.rcArea.right = (WINDOW_BOX_RIGHT_EDGE_X (w) + - WINDOW_RIGHT_MARGIN_WIDTH (w) + - WINDOW_RIGHT_FRINGE_WIDTH (w)); + form.rcArea.bottom = (WINDOW_BOTTOM_EDGE_Y (w) + - WINDOW_MODE_LINE_HEIGHT (w)); + + context = get_ime_context_fn (hwnd); + set_ime_composition_window_fn (context, &form); + release_ime_context_fn (hwnd, context); + } + break; + case WM_IME_ENDCOMPOSITION: ignore_ime_char = 0; goto dflt; @@ -7278,6 +7319,10 @@ GetProcAddress (imm32_lib, "ImmGetCompositionStringW"); get_ime_context_fn = (ImmGetContext_Proc) GetProcAddress (imm32_lib, "ImmGetContext"); + release_ime_context_fn = (ImmReleaseContext_Proc) + GetProcAddress (imm32_lib, "ImmReleaseContext"); + set_ime_composition_window_fn = (ImmSetCompositionWindow_Proc) + GetProcAddress (imm32_lib, "ImmSetCompositionWindow"); } DEFVAR_INT ("w32-ansi-code-page", &w32_ansi_code_page, diff -r 55ba5af4bf3a -r 91b945d54645 src/w32term.c --- a/src/w32term.c Wed Jul 22 03:07:18 2009 +0000 +++ b/src/w32term.c Wed Jul 22 16:03:39 2009 +0000 @@ -32,6 +32,7 @@ #include #include #include +#include #include "charset.h" #include "character.h" @@ -5128,6 +5129,8 @@ = (WINDOW_TO_FRAME_PIXEL_Y (w, w->phys_cursor.y) + glyph_row->ascent - w->phys_cursor_ascent); + PostMessage (hwnd, WM_IME_STARTCOMPOSITION, 0, 0); + /* If the size of the active cursor changed, destroy the old system caret. */ if (w32_system_caret_hwnd