To: vim-dev@vim.org Subject: Patch 5.6.007 (extra) Fcc: outbox From: Bram Moolenaar ------------ Patch 5.6.007 (extra) Problem: Win32 IME: Font is not changed when screen font is changed. And IME composition window does not trace the cursor. Solution: Initialize IME font. When cursor is moved, set IME composition window with ImeSetCompositionWindow(). Add call to ImmReleaseContext() in several places. (Taro Muraoka) Files: src/gui.c, src/gui_w32.c, src/proto/gui_w32.pro *** ../vim-5.6.6/src/gui.c Sun Jan 16 12:30:34 2000 --- src/gui.c Sat Jan 22 17:39:10 2000 *************** *** 683,688 **** --- 683,692 ---- gui_undraw_cursor(); if (gui.row <0) return; + #ifdef MULTI_BYTE_IME + if (gui.row != gui.cursor_row || gui.col != gui.cursor_col) + ImeSetCompositionWindow(); + #endif gui.cursor_row = gui.row; gui.cursor_col = gui.col; gui.cursor_is_valid = TRUE; *** ../vim-5.6.6/src/gui_w32.c Fri Jan 21 12:14:46 2000 --- src/gui_w32.c Sun Jan 23 12:13:42 2000 *************** *** 148,153 **** --- 148,154 ---- # define LPCTSTR int # define OSVERSIONINFO int # define HBRUSH int + # define HIMC int #endif /* For the Intellimouse: */ *************** *** 2641,2646 **** --- 2642,2657 ---- font_name = lf.lfFaceName; #ifdef MULTI_BYTE_IME norm_logfont = lf; + { + HIMC hImc; + + /* Initialize font for IME */ + if ((hImc = ImmGetContext(s_hwnd))) + { + ImmSetCompositionFont(hImc, &norm_logfont); + ImmReleaseContext(s_hwnd, hImc); + } + } #endif gui_mch_free_font(gui.norm_font); gui.norm_font = font; *************** *** 3025,3030 **** --- 3036,3071 ---- SetBkMode(s_hdc,OldBkMode); } + /* + * Position IME composition window. + */ + static void + ImePositionWindow(HIMC hImc) + { + COMPOSITIONFORM cfs; + + cfs.dwStyle = CFS_POINT; + cfs.ptCurrentPos.x = FILL_X(gui.col); + cfs.ptCurrentPos.y = FILL_Y(gui.row); + MapWindowPoints(s_textArea, s_hwnd, &cfs.ptCurrentPos, 1); + ImmSetCompositionWindow(hImc, &cfs); + } + + /* + * Get context and position IME composition window. + */ + void + ImeSetCompositionWindow(void) + { + HIMC hImc; + + if ((hImc = ImmGetContext(s_hwnd))) + { + ImePositionWindow(hImc); + ImmReleaseContext(s_hwnd, hImc); + } + } + /* * When enter to insert mode, set IME to previous language mode *************** *** 3033,3048 **** ImeSetOriginMode(void) { HIMC hImc; - DWORD dwConvMode, dwSentMode; if ((hImc = ImmGetContext(s_hwnd))) { if (!ImmGetOpenStatus(hImc) && bImeOpenStatus == TRUE) ! { ! ImmSetOpenStatus(hImc, TRUE); ! } else bImeOpenStatus = FALSE; } bCommandMode = FALSE; } --- 3074,3087 ---- ImeSetOriginMode(void) { HIMC hImc; if ((hImc = ImmGetContext(s_hwnd))) { if (!ImmGetOpenStatus(hImc) && bImeOpenStatus == TRUE) ! ImmSetOpenStatus(hImc, TRUE); else bImeOpenStatus = FALSE; + ImmReleaseContext(s_hwnd, hImc); } bCommandMode = FALSE; } *************** *** 3065,3070 **** --- 3104,3110 ---- } else bImeOpenStatus = FALSE; + ImmReleaseContext(s_hwnd, hImc); } bCommandMode = TRUE; } *************** *** 3191,3196 **** --- 3231,3237 ---- if ((hImc = ImmGetContext(s_hwnd))) { ImmGetConversionStatus(hImc, &dwConvMode, &dwSentMode); + ImmReleaseContext(s_hwnd, hImc); if ((dwConvMode & IME_CMODE_NATIVE)) return lpCompStr; } *************** *** 3203,3239 **** { HIMC hImc; DWORD dwConvMode, dwSentMode; - COMPOSITIONFORM cf; if ((hImc = ImmGetContext(s_hwnd))) { ImmGetConversionStatus(hImc, &dwConvMode, &dwSentMode); if (dwConvMode & IME_CMODE_NATIVE) { ! RECT t_rct; ! RECT w_rct; ! if (w = IMN_SETOPENSTATUS && GetWindowRect(s_textArea, &t_rct) ! && GetWindowRect(s_hwnd, &w_rct)) { ImmSetCompositionFont(hImc, &norm_logfont); ! cf.dwStyle = CFS_POINT; ! cf.ptCurrentPos.x = TEXT_X(gui.col) + gui.border_offset; ! cf.ptCurrentPos.y = TEXT_Y(gui.row) + gui.border_offset; ! #ifdef WANT_MENU ! if (gui.menu_is_active) ! cf.ptCurrentPos.y += gui.menu_height; ! #endif ! #ifdef USE_TOOLBAR ! if (vim_strchr(p_go, GO_TOOLBAR) != NULL) ! cf.ptCurrentPos.y += ! TOOLBAR_BUTTON_HEIGHT + TOOLBAR_BORDER_HEIGHT; ! #endif ! ImmSetCompositionWindow(hImc, &cf); } bImeNative = TRUE; } else bImeNative = FALSE; } } --- 3244,3265 ---- { HIMC hImc; DWORD dwConvMode, dwSentMode; if ((hImc = ImmGetContext(s_hwnd))) { ImmGetConversionStatus(hImc, &dwConvMode, &dwSentMode); if (dwConvMode & IME_CMODE_NATIVE) { ! if (w == IMN_SETOPENSTATUS) { ImmSetCompositionFont(hImc, &norm_logfont); ! ImePositionWindow(hImc); } bImeNative = TRUE; } else bImeNative = FALSE; + ImmReleaseContext(s_hwnd, hImc); } } *** ../vim-5.6.6/src/proto/gui_w32.pro Sun Jan 16 14:23:19 2000 --- src/proto/gui_w32.pro Sat Jan 22 17:59:42 2000 *************** *** 28,33 **** --- 28,34 ---- GuiColor gui_mch_get_color __ARGS((char_u *name)); void gui_mch_set_fg_color __ARGS((GuiColor color)); void gui_mch_set_bg_color __ARGS((GuiColor color)); + void ImeSetCompositionWindow __ARGS((void)); void ImeSetOriginMode __ARGS((void)); void ImeSetEnglishMode __ARGS((void)); void gui_mch_draw_string __ARGS((int row, int col, char_u *s, int len, int flags)); *** ../vim-5.6.6/src/version.c Fri Jan 21 20:44:10 2000 --- src/version.c Sun Jan 23 19:39:55 2000 *************** *** 420,421 **** --- 420,423 ---- { /* Add new patch number below this line */ + /**/ + 7, /**/ -- FIRST GUARD: Ah! Now ... we're not allowed to ... SIR LAUNCELOT runs him through, grabs his spear and stabs the other guard who collapses in a heap. Hiccoughs quietly. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /-/-- Bram Moolenaar --- Bram@moolenaar.net --- http://www.moolenaar.net --\-\ \ \ Vim: http://www.vim.org ICCF Holland: http://www.vim.org/iccf / /