diff options
Diffstat (limited to 'data/vim/patches/8.1.1081')
-rw-r--r-- | data/vim/patches/8.1.1081 | 1264 |
1 files changed, 1264 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.1081 b/data/vim/patches/8.1.1081 new file mode 100644 index 000000000..9b833db8c --- /dev/null +++ b/data/vim/patches/8.1.1081 @@ -0,0 +1,1264 @@ +To: vim_dev@googlegroups.com +Subject: Patch 8.1.1081 +Fcc: outbox +From: Bram Moolenaar <Bram@moolenaar.net> +Mime-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +------------ + +Patch 8.1.1081 +Problem: MS-Windows: cannot use fonts whose name cannot be represented in + the current code page. +Solution: Use wide font functions. (Ken Takata, closes #4000) +Files: src/gui_w32.c, src/os_mswin.c, src/proto/gui_w32.pro, + src/proto/os_mswin.pro + + +*** ../vim-8.1.1080/src/gui_w32.c 2019-03-28 22:43:12.103997449 +0100 +--- src/gui_w32.c 2019-03-30 16:20:37.994106945 +0100 +*************** +*** 253,259 **** + typedef int HBRUSH; + typedef int HDROP; + typedef int INT; +! typedef int LOGFONT[]; + typedef int LPARAM; + typedef int LPCREATESTRUCT; + typedef int LPCSTR; +--- 253,259 ---- + typedef int HBRUSH; + typedef int HDROP; + typedef int INT; +! typedef int LOGFONTW[]; + typedef int LPARAM; + typedef int LPCREATESTRUCT; + typedef int LPCSTR; +*************** +*** 501,515 **** + /* + * For control IME. + * +! * These LOGFONT used for IME. + */ + #if defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME) +! /* holds LOGFONT for 'guifontwide' if available, otherwise 'guifont' */ +! static LOGFONT norm_logfont; + #endif + #ifdef FEAT_MBYTE_IME +! /* holds LOGFONT for 'guifont' always. */ +! static LOGFONT sub_logfont; + #endif + + #ifdef FEAT_MBYTE_IME +--- 501,515 ---- + /* + * For control IME. + * +! * These LOGFONTW used for IME. + */ + #if defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME) +! /* holds LOGFONTW for 'guifontwide' if available, otherwise 'guifont' */ +! static LOGFONTW norm_logfont; + #endif + #ifdef FEAT_MBYTE_IME +! /* holds LOGFONTW for 'guifont' always. */ +! static LOGFONTW sub_logfont; + #endif + + #ifdef FEAT_MBYTE_IME +*************** +*** 1520,1531 **** + } + + static GuiFont +! get_font_handle(LOGFONT *lf) + { + HFONT font = NULL; + + /* Load the font */ +! font = CreateFontIndirect(lf); + + if (font == NULL) + return NOFONT; +--- 1520,1531 ---- + } + + static GuiFont +! get_font_handle(LOGFONTW *lf) + { + HFONT font = NULL; + + /* Load the font */ +! font = CreateFontIndirectW(lf); + + if (font == NULL) + return NOFONT; +*************** +*** 1556,1562 **** + char_u *name, + int giveErrorIfMissing) + { +! LOGFONT lf; + GuiFont font = NOFONT; + + if (get_logfont(&lf, name, NULL, giveErrorIfMissing) == OK) +--- 1556,1562 ---- + char_u *name, + int giveErrorIfMissing) + { +! LOGFONTW lf; + GuiFont font = NOFONT; + + if (get_logfont(&lf, name, NULL, giveErrorIfMissing) == OK) +*************** +*** 3201,3223 **** + } + + static char_u * +! logfont2name(LOGFONT lf) + { + char *p; + char *res; + char *charset_name; + char *quality_name; +! char *font_name = lf.lfFaceName; + + charset_name = charset_id2name((int)lf.lfCharSet); +- /* Convert a font name from the current codepage to 'encoding'. +- * TODO: Use Wide APIs (including LOGFONTW) instead of ANSI APIs. */ +- if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +- { +- int len; +- acp_to_enc((char_u *)lf.lfFaceName, (int)strlen(lf.lfFaceName), +- (char_u **)&font_name, &len); +- } + quality_name = quality_id2name((int)lf.lfQuality); + + res = (char *)alloc((unsigned)(strlen(font_name) + 20 +--- 3201,3218 ---- + } + + static char_u * +! logfont2name(LOGFONTW lf) + { + char *p; + char *res; + char *charset_name; + char *quality_name; +! char *font_name; + ++ font_name = (char *)utf16_to_enc(lf.lfFaceName, NULL); ++ if (font_name == NULL) ++ return NULL; + charset_name = charset_id2name((int)lf.lfCharSet); + quality_name = quality_id2name((int)lf.lfQuality); + + res = (char *)alloc((unsigned)(strlen(font_name) + 20 +*************** +*** 3254,3278 **** + } + } + +! if (font_name != lf.lfFaceName) +! vim_free(font_name); + return (char_u *)res; + } + + + #ifdef FEAT_MBYTE_IME + /* +! * Set correct LOGFONT to IME. Use 'guifontwide' if available, otherwise use + * 'guifont' + */ + static void + update_im_font(void) + { +! LOGFONT lf_wide; + + if (p_guifontwide != NULL && *p_guifontwide != NUL + && gui.wide_font != NOFONT +! && GetObject((HFONT)gui.wide_font, sizeof(lf_wide), &lf_wide)) + norm_logfont = lf_wide; + else + norm_logfont = sub_logfont; +--- 3249,3272 ---- + } + } + +! vim_free(font_name); + return (char_u *)res; + } + + + #ifdef FEAT_MBYTE_IME + /* +! * Set correct LOGFONTW to IME. Use 'guifontwide' if available, otherwise use + * 'guifont' + */ + static void + update_im_font(void) + { +! LOGFONTW lf_wide; + + if (p_guifontwide != NULL && *p_guifontwide != NUL + && gui.wide_font != NOFONT +! && GetObjectW((HFONT)gui.wide_font, sizeof(lf_wide), &lf_wide)) + norm_logfont = lf_wide; + else + norm_logfont = sub_logfont; +*************** +*** 3286,3292 **** + void + gui_mch_wide_font_changed(void) + { +! LOGFONT lf; + + #ifdef FEAT_MBYTE_IME + update_im_font(); +--- 3280,3286 ---- + void + gui_mch_wide_font_changed(void) + { +! LOGFONTW lf; + + #ifdef FEAT_MBYTE_IME + update_im_font(); +*************** +*** 3300,3306 **** + gui.wide_boldital_font = NOFONT; + + if (gui.wide_font +! && GetObject((HFONT)gui.wide_font, sizeof(lf), &lf)) + { + if (!lf.lfItalic) + { +--- 3294,3300 ---- + gui.wide_boldital_font = NOFONT; + + if (gui.wide_font +! && GetObjectW((HFONT)gui.wide_font, sizeof(lf), &lf)) + { + if (!lf.lfItalic) + { +*************** +*** 3328,3334 **** + int + gui_mch_init_font(char_u *font_name, int fontset UNUSED) + { +! LOGFONT lf; + GuiFont font = NOFONT; + char_u *p; + +--- 3322,3328 ---- + int + gui_mch_init_font(char_u *font_name, int fontset UNUSED) + { +! LOGFONTW lf; + GuiFont font = NOFONT; + char_u *p; + +*************** +*** 4225,4232 **** + static BOOL (WINAPI *pImmReleaseContext)(HWND, HIMC); + static BOOL (WINAPI *pImmGetOpenStatus)(HIMC); + static BOOL (WINAPI *pImmSetOpenStatus)(HIMC, BOOL); +! static BOOL (WINAPI *pImmGetCompositionFont)(HIMC, LPLOGFONTA); +! static BOOL (WINAPI *pImmSetCompositionFont)(HIMC, LPLOGFONTA); + static BOOL (WINAPI *pImmSetCompositionWindow)(HIMC, LPCOMPOSITIONFORM); + static BOOL (WINAPI *pImmGetConversionStatus)(HIMC, LPDWORD, LPDWORD); + static BOOL (WINAPI *pImmSetConversionStatus)(HIMC, DWORD, DWORD); +--- 4219,4226 ---- + static BOOL (WINAPI *pImmReleaseContext)(HWND, HIMC); + static BOOL (WINAPI *pImmGetOpenStatus)(HIMC); + static BOOL (WINAPI *pImmSetOpenStatus)(HIMC, BOOL); +! static BOOL (WINAPI *pImmGetCompositionFontW)(HIMC, LPLOGFONTW); +! static BOOL (WINAPI *pImmSetCompositionFontW)(HIMC, LPLOGFONTW); + static BOOL (WINAPI *pImmSetCompositionWindow)(HIMC, LPCOMPOSITIONFORM); + static BOOL (WINAPI *pImmGetConversionStatus)(HIMC, LPDWORD, LPDWORD); + static BOOL (WINAPI *pImmSetConversionStatus)(HIMC, DWORD, DWORD); +*************** +*** 4239,4246 **** + # define pImmReleaseContext ImmReleaseContext + # define pImmGetOpenStatus ImmGetOpenStatus + # define pImmSetOpenStatus ImmSetOpenStatus +! # define pImmGetCompositionFont ImmGetCompositionFontA +! # define pImmSetCompositionFont ImmSetCompositionFontA + # define pImmSetCompositionWindow ImmSetCompositionWindow + # define pImmGetConversionStatus ImmGetConversionStatus + # define pImmSetConversionStatus ImmSetConversionStatus +--- 4233,4240 ---- + # define pImmReleaseContext ImmReleaseContext + # define pImmGetOpenStatus ImmGetOpenStatus + # define pImmSetOpenStatus ImmSetOpenStatus +! # define pImmGetCompositionFontW ImmGetCompositionFontW +! # define pImmSetCompositionFontW ImmSetCompositionFontW + # define pImmSetCompositionWindow ImmSetCompositionWindow + # define pImmGetConversionStatus ImmGetConversionStatus + # define pImmSetConversionStatus ImmSetConversionStatus +*************** +*** 4379,4392 **** + * Return OK or FAIL. + */ + static int +! gui_w32_get_menu_font(LOGFONT *lf) + { +! NONCLIENTMETRICS nm; + +! nm.cbSize = sizeof(NONCLIENTMETRICS); +! if (!SystemParametersInfo( + SPI_GETNONCLIENTMETRICS, +! sizeof(NONCLIENTMETRICS), + &nm, + 0)) + return FAIL; +--- 4373,4386 ---- + * Return OK or FAIL. + */ + static int +! gui_w32_get_menu_font(LOGFONTW *lf) + { +! NONCLIENTMETRICSW nm; + +! nm.cbSize = sizeof(NONCLIENTMETRICSW); +! if (!SystemParametersInfoW( + SPI_GETNONCLIENTMETRICS, +! sizeof(NONCLIENTMETRICSW), + &nm, + 0)) + return FAIL; +*************** +*** 4403,4409 **** + static void + set_tabline_font(void) + { +! LOGFONT lfSysmenu; + HFONT font; + HWND hwnd; + HDC hdc; +--- 4397,4403 ---- + static void + set_tabline_font(void) + { +! LOGFONTW lfSysmenu; + HFONT font; + HWND hwnd; + HDC hdc; +*************** +*** 4413,4419 **** + if (gui_w32_get_menu_font(&lfSysmenu) != OK) + return; + +! font = CreateFontIndirect(&lfSysmenu); + + SendMessage(s_tabhwnd, WM_SETFONT, (WPARAM)font, TRUE); + +--- 4407,4413 ---- + if (gui_w32_get_menu_font(&lfSysmenu) != OK) + return; + +! font = CreateFontIndirectW(&lfSysmenu); + + SendMessage(s_tabhwnd, WM_SETFONT, (WPARAM)font, TRUE); + +*************** +*** 5562,5568 **** + case IMN_SETOPENSTATUS: + if (pImmGetOpenStatus(hImc)) + { +! pImmSetCompositionFont(hImc, &norm_logfont); + im_set_position(gui.row, gui.col); + + /* Disable langmap */ +--- 5556,5562 ---- + case IMN_SETOPENSTATUS: + if (pImmGetOpenStatus(hImc)) + { +! pImmSetCompositionFontW(hImc, &norm_logfont); + im_set_position(gui.row, gui.col); + + /* Disable langmap */ +*************** +*** 5703,5715 **** + * set font to IM. + */ + void +! im_set_font(LOGFONT *lf) + { + HIMC hImc; + + if (pImmGetContext && (hImc = pImmGetContext(s_hwnd)) != (HIMC)0) + { +! pImmSetCompositionFont(hImc, lf); + pImmReleaseContext(s_hwnd, hImc); + } + } +--- 5697,5709 ---- + * set font to IM. + */ + void +! im_set_font(LOGFONTW *lf) + { + HIMC hImc; + + if (pImmGetContext && (hImc = pImmGetContext(s_hwnd)) != (HIMC)0) + { +! pImmSetCompositionFontW(hImc, lf); + pImmReleaseContext(s_hwnd, hImc); + } + } +*************** +*** 6829,6835 **** + int dlgPaddingX; + int dlgPaddingY; + #ifdef USE_SYSMENU_FONT +! LOGFONT lfSysmenu; + int use_lfSysmenu = FALSE; + #endif + garray_T ga; +--- 6823,6829 ---- + int dlgPaddingX; + int dlgPaddingY; + #ifdef USE_SYSMENU_FONT +! LOGFONTW lfSysmenu; + int use_lfSysmenu = FALSE; + #endif + garray_T ga; +*************** +*** 6894,6900 **** + #ifdef USE_SYSMENU_FONT + if (gui_w32_get_menu_font(&lfSysmenu) == OK) + { +! font = CreateFontIndirect(&lfSysmenu); + use_lfSysmenu = TRUE; + } + else +--- 6888,6894 ---- + #ifdef USE_SYSMENU_FONT + if (gui_w32_get_menu_font(&lfSysmenu) == OK) + { +! font = CreateFontIndirectW(&lfSysmenu); + use_lfSysmenu = TRUE; + } + else +*************** +*** 7123,7129 **** + /* point size */ + *p++ = -MulDiv(lfSysmenu.lfHeight, 72, + GetDeviceCaps(hdc, LOGPIXELSY)); +! nchar = nCopyAnsiToWideChar(p, lfSysmenu.lfFaceName, FALSE); + } + else + #endif +--- 7117,7124 ---- + /* point size */ + *p++ = -MulDiv(lfSysmenu.lfHeight, 72, + GetDeviceCaps(hdc, LOGPIXELSY)); +! wcscpy(p, lfSysmenu.lfFaceName); +! nchar = (int)wcslen(lfSysmenu.lfFaceName) + 1; + } + else + #endif +*************** +*** 7488,7501 **** + DWORD dlgFontSize; + SIZE size; + #ifdef USE_SYSMENU_FONT +! LOGFONT lfSysmenu; + #endif + + s_usenewlook = FALSE; + + #ifdef USE_SYSMENU_FONT + if (gui_w32_get_menu_font(&lfSysmenu) == OK) +! hfontTools = CreateFontIndirect(&lfSysmenu); + else + #endif + hfontTools = CreateFont(-DLG_FONT_POINT_SIZE, 0, 0, 0, 0, 0, 0, 0, +--- 7483,7496 ---- + DWORD dlgFontSize; + SIZE size; + #ifdef USE_SYSMENU_FONT +! LOGFONTW lfSysmenu; + #endif + + s_usenewlook = FALSE; + + #ifdef USE_SYSMENU_FONT + if (gui_w32_get_menu_font(&lfSysmenu) == OK) +! hfontTools = CreateFontIndirectW(&lfSysmenu); + else + #endif + hfontTools = CreateFont(-DLG_FONT_POINT_SIZE, 0, 0, 0, 0, 0, 0, 0, +*************** +*** 7563,7569 **** + int x; + int y; + #ifdef USE_SYSMENU_FONT +! LOGFONT lfSysmenu; + int use_lfSysmenu = FALSE; + #endif + +--- 7558,7564 ---- + int x; + int y; + #ifdef USE_SYSMENU_FONT +! LOGFONTW lfSysmenu; + int use_lfSysmenu = FALSE; + #endif + +*************** +*** 7599,7605 **** + #ifdef USE_SYSMENU_FONT + if (gui_w32_get_menu_font(&lfSysmenu) == OK) + { +! font = CreateFontIndirect(&lfSysmenu); + use_lfSysmenu = TRUE; + } + else +--- 7594,7600 ---- + #ifdef USE_SYSMENU_FONT + if (gui_w32_get_menu_font(&lfSysmenu) == OK) + { +! font = CreateFontIndirectW(&lfSysmenu); + use_lfSysmenu = TRUE; + } + else +*************** +*** 7708,7714 **** + /* point size */ + *p++ = -MulDiv(lfSysmenu.lfHeight, 72, + GetDeviceCaps(hdc, LOGPIXELSY)); +! nchar = nCopyAnsiToWideChar(p, lfSysmenu.lfFaceName, FALSE); + } + else + #endif +--- 7703,7710 ---- + /* point size */ + *p++ = -MulDiv(lfSysmenu.lfHeight, 72, + GetDeviceCaps(hdc, LOGPIXELSY)); +! wcscpy(p, lfSysmenu.lfFaceName); +! nchar = (int)wcslen(lfSysmenu.lfFaceName) + 1; + } + else + #endif +*************** +*** 8136,8145 **** + = (void *)GetProcAddress(hLibImm, "ImmGetOpenStatus"); + pImmSetOpenStatus + = (void *)GetProcAddress(hLibImm, "ImmSetOpenStatus"); +! pImmGetCompositionFont +! = (void *)GetProcAddress(hLibImm, "ImmGetCompositionFontA"); +! pImmSetCompositionFont +! = (void *)GetProcAddress(hLibImm, "ImmSetCompositionFontA"); + pImmSetCompositionWindow + = (void *)GetProcAddress(hLibImm, "ImmSetCompositionWindow"); + pImmGetConversionStatus +--- 8132,8141 ---- + = (void *)GetProcAddress(hLibImm, "ImmGetOpenStatus"); + pImmSetOpenStatus + = (void *)GetProcAddress(hLibImm, "ImmSetOpenStatus"); +! pImmGetCompositionFontW +! = (void *)GetProcAddress(hLibImm, "ImmGetCompositionFontW"); +! pImmSetCompositionFontW +! = (void *)GetProcAddress(hLibImm, "ImmSetCompositionFontW"); + pImmSetCompositionWindow + = (void *)GetProcAddress(hLibImm, "ImmSetCompositionWindow"); + pImmGetConversionStatus +*************** +*** 8154,8161 **** + || pImmReleaseContext == NULL + || pImmGetOpenStatus == NULL + || pImmSetOpenStatus == NULL +! || pImmGetCompositionFont == NULL +! || pImmSetCompositionFont == NULL + || pImmSetCompositionWindow == NULL + || pImmGetConversionStatus == NULL + || pImmSetConversionStatus == NULL) +--- 8150,8157 ---- + || pImmReleaseContext == NULL + || pImmGetOpenStatus == NULL + || pImmSetOpenStatus == NULL +! || pImmGetCompositionFontW == NULL +! || pImmSetCompositionFontW == NULL + || pImmSetCompositionWindow == NULL + || pImmGetConversionStatus == NULL + || pImmSetConversionStatus == NULL) +*** ../vim-8.1.1080/src/os_mswin.c 2019-02-17 17:44:36.215875493 +0100 +--- src/os_mswin.c 2019-03-30 16:20:37.994106945 +0100 +*************** +*** 85,91 **** + typedef int CONSOLE_CURSOR_INFO; + typedef int COORD; + typedef int DWORD; +! typedef int ENUMLOGFONT; + typedef int HANDLE; + typedef int HDC; + typedef int HFONT; +--- 85,91 ---- + typedef int CONSOLE_CURSOR_INFO; + typedef int COORD; + typedef int DWORD; +! typedef int ENUMLOGFONTW; + typedef int HANDLE; + typedef int HDC; + typedef int HFONT; +*************** +*** 93,99 **** + typedef int HWND; + typedef int INPUT_RECORD; + typedef int KEY_EVENT_RECORD; +! typedef int LOGFONT; + typedef int LPARAM; + typedef int LPBOOL; + typedef int LPCSTR; +--- 93,99 ---- + typedef int HWND; + typedef int INPUT_RECORD; + typedef int KEY_EVENT_RECORD; +! typedef int LOGFONTW; + typedef int LPARAM; + typedef int LPBOOL; + typedef int LPCSTR; +*************** +*** 103,109 **** + typedef int LPWSTR; + typedef int LRESULT; + typedef int MOUSE_EVENT_RECORD; +! typedef int NEWTEXTMETRIC; + typedef int PACL; + typedef int PRINTDLG; + typedef int PSECURITY_DESCRIPTOR; +--- 103,109 ---- + typedef int LPWSTR; + typedef int LRESULT; + typedef int MOUSE_EVENT_RECORD; +! typedef int NEWTEXTMETRICW; + typedef int PACL; + typedef int PRINTDLG; + typedef int PSECURITY_DESCRIPTOR; +*************** +*** 1420,1426 **** + static int stored_nCopies = 1; + static int stored_nFlags = 0; + +! LOGFONT fLogFont; + int pifItalic; + int pifBold; + int pifUnderline; +--- 1420,1426 ---- + static int stored_nCopies = 1; + static int stored_nFlags = 0; + +! LOGFONTW fLogFont; + int pifItalic; + int pifBold; + int pifUnderline; +*************** +*** 1577,1583 **** + fLogFont.lfItalic = pifItalic; + fLogFont.lfUnderline = pifUnderline; + prt_font_handles[pifBold][pifItalic][pifUnderline] +! = CreateFontIndirect(&fLogFont); + } + + SetBkMode(prt_dlg.hDC, OPAQUE); +--- 1577,1583 ---- + fLogFont.lfItalic = pifItalic; + fLogFont.lfUnderline = pifUnderline; + prt_font_handles[pifBold][pifItalic][pifUnderline] +! = CreateFontIndirectW(&fLogFont); + } + + SetBkMode(prt_dlg.hDC, OPAQUE); +*************** +*** 2915,2926 **** + return qp->name; + } + +! static const LOGFONT s_lfDefault = + { + -12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + PROOF_QUALITY, FIXED_PITCH | FF_DONTCARE, +! "Fixedsys" /* see _ReadVimIni */ + }; + + /* Initialise the "current height" to -12 (same as s_lfDefault) just +--- 2915,2926 ---- + return qp->name; + } + +! static const LOGFONTW s_lfDefault = + { + -12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, + PROOF_QUALITY, FIXED_PITCH | FF_DONTCARE, +! L"Fixedsys" /* see _ReadVimIni */ + }; + + /* Initialise the "current height" to -12 (same as s_lfDefault) just +*************** +*** 2937,2943 **** + * calculation is for a vertical (height) size or a horizontal (width) one. + */ + static int +! points_to_pixels(char_u *str, char_u **end, int vertical, long_i pprinter_dc) + { + int pixels; + int points = 0; +--- 2937,2943 ---- + * calculation is for a vertical (height) size or a horizontal (width) one. + */ + static int +! points_to_pixels(WCHAR *str, WCHAR **end, int vertical, long_i pprinter_dc) + { + int pixels; + int points = 0; +*************** +*** 2948,2954 **** + + while (*str != NUL) + { +! if (*str == '.' && divisor == 0) + { + /* Start keeping a divisor, for later */ + divisor = 1; +--- 2948,2954 ---- + + while (*str != NUL) + { +! if (*str == L'.' && divisor == 0) + { + /* Start keeping a divisor, for later */ + divisor = 1; +*************** +*** 2959,2965 **** + break; + + points *= 10; +! points += *str - '0'; + divisor *= 10; + } + ++str; +--- 2959,2965 ---- + break; + + points *= 10; +! points += *str - L'0'; + divisor *= 10; + } + ++str; +*************** +*** 2989,3003 **** + + static int CALLBACK + font_enumproc( +! ENUMLOGFONT *elf, +! NEWTEXTMETRIC *ntm UNUSED, +! int type UNUSED, + LPARAM lparam) + { + /* Return value: + * 0 = terminate now (monospace & ANSI) + * 1 = continue, still no luck... +! * 2 = continue, but we have an acceptable LOGFONT + * (monospace, not ANSI) + * We use these values, as EnumFontFamilies returns 1 if the + * callback function is never called. So, we check the return as +--- 2989,3003 ---- + + static int CALLBACK + font_enumproc( +! ENUMLOGFONTW *elf, +! NEWTEXTMETRICW *ntm UNUSED, +! DWORD type UNUSED, + LPARAM lparam) + { + /* Return value: + * 0 = terminate now (monospace & ANSI) + * 1 = continue, still no luck... +! * 2 = continue, but we have an acceptable LOGFONTW + * (monospace, not ANSI) + * We use these values, as EnumFontFamilies returns 1 if the + * callback function is never called. So, we check the return as +*************** +*** 3005,3011 **** + * It's not pretty, but it works! + */ + +! LOGFONT *lf = (LOGFONT *)(lparam); + + #ifndef FEAT_PROPORTIONAL_FONTS + /* Ignore non-monospace fonts without further ado */ +--- 3005,3011 ---- + * It's not pretty, but it works! + */ + +! LOGFONTW *lf = (LOGFONTW *)(lparam); + + #ifndef FEAT_PROPORTIONAL_FONTS + /* Ignore non-monospace fonts without further ado */ +*************** +*** 3013,3019 **** + return 1; + #endif + +! /* Remember this LOGFONT as a "possible" */ + *lf = elf->elfLogFont; + + /* Terminate the scan as soon as we find an ANSI font */ +--- 3013,3019 ---- + return 1; + #endif + +! /* Remember this LOGFONTW as a "possible" */ + *lf = elf->elfLogFont; + + /* Terminate the scan as soon as we find an ANSI font */ +*************** +*** 3027,3041 **** + } + + static int +! init_logfont(LOGFONT *lf) + { + int n; + HWND hwnd = GetDesktopWindow(); + HDC hdc = GetWindowDC(hwnd); + +! n = EnumFontFamilies(hdc, +! (LPCSTR)lf->lfFaceName, +! (FONTENUMPROC)font_enumproc, + (LPARAM)lf); + + ReleaseDC(hwnd, hdc); +--- 3027,3041 ---- + } + + static int +! init_logfont(LOGFONTW *lf) + { + int n; + HWND hwnd = GetDesktopWindow(); + HDC hdc = GetWindowDC(hwnd); + +! n = EnumFontFamiliesW(hdc, +! lf->lfFaceName, +! (FONTENUMPROCW)font_enumproc, + (LPARAM)lf); + + ReleaseDC(hwnd, hdc); +*************** +*** 3044,3050 **** + if (n == 1) + return FAIL; + +! /* Tidy up the rest of the LOGFONT structure. We set to a basic + * font - get_logfont() sets bold, italic, etc based on the user's + * input. + */ +--- 3044,3050 ---- + if (n == 1) + return FAIL; + +! /* Tidy up the rest of the LOGFONTW structure. We set to a basic + * font - get_logfont() sets bold, italic, etc based on the user's + * input. + */ +*************** +*** 3060,3098 **** + } + + /* + * Get font info from "name" into logfont "lf". + * Return OK for a valid name, FAIL otherwise. + */ + int + get_logfont( +! LOGFONT *lf, + char_u *name, + HDC printer_dc, + int verbose) + { +! char_u *p; + int i; + int ret = FAIL; +! static LOGFONT *lastlf = NULL; +! char_u *acpname = NULL; + + *lf = s_lfDefault; + if (name == NULL) + return OK; + +! /* Convert 'name' from 'encoding' to the current codepage, because +! * lf->lfFaceName uses the current codepage. +! * TODO: Use Wide APIs instead of ANSI APIs. */ +! if (enc_codepage >= 0 && (int)GetACP() != enc_codepage) +! { +! int len; +! enc_to_acp(name, (int)STRLEN(name), &acpname, &len); +! name = acpname; +! } +! if (STRCMP(name, "*") == 0) + { + #if defined(FEAT_GUI_MSWIN) +! CHOOSEFONT cf; + /* if name is "*", bring up std font dialog: */ + vim_memset(&cf, 0, sizeof(cf)); + cf.lStructSize = sizeof(cf); +--- 3060,3110 ---- + } + + /* ++ * Compare a UTF-16 string and an ASCII string literally. ++ * Only works all the code points are inside ASCII range. ++ */ ++ static int ++ utf16ascncmp(const WCHAR *w, const char *p, size_t n) ++ { ++ size_t i; ++ ++ for (i = 0; i < n; i++) ++ { ++ if (w[i] == 0 || w[i] != p[i]) ++ return w[i] - p[i]; ++ } ++ return 0; ++ } ++ ++ /* + * Get font info from "name" into logfont "lf". + * Return OK for a valid name, FAIL otherwise. + */ + int + get_logfont( +! LOGFONTW *lf, + char_u *name, + HDC printer_dc, + int verbose) + { +! WCHAR *p; + int i; + int ret = FAIL; +! static LOGFONTW *lastlf = NULL; +! WCHAR *wname; + + *lf = s_lfDefault; + if (name == NULL) + return OK; + +! wname = enc_to_utf16(name, NULL); +! if (wname == NULL) +! return FAIL; +! +! if (wcscmp(wname, L"*") == 0) + { + #if defined(FEAT_GUI_MSWIN) +! CHOOSEFONTW cf; + /* if name is "*", bring up std font dialog: */ + vim_memset(&cf, 0, sizeof(cf)); + cf.lStructSize = sizeof(cf); +*************** +*** 3102,3108 **** + *lf = *lastlf; + cf.lpLogFont = lf; + cf.nFontType = 0 ; //REGULAR_FONTTYPE; +! if (ChooseFont(&cf)) + ret = OK; + #endif + goto theend; +--- 3114,3120 ---- + *lf = *lastlf; + cf.lpLogFont = lf; + cf.nFontType = 0 ; //REGULAR_FONTTYPE; +! if (ChooseFontW(&cf)) + ret = OK; + #endif + goto theend; +*************** +*** 3111,3124 **** + /* + * Split name up, it could be <name>:h<height>:w<width> etc. + */ +! for (p = name; *p && *p != ':'; p++) + { +! if (p - name + 1 >= LF_FACESIZE) + goto theend; /* Name too long */ +! lf->lfFaceName[p - name] = *p; + } +! if (p != name) +! lf->lfFaceName[p - name] = NUL; + + /* First set defaults */ + lf->lfHeight = -12; +--- 3123,3136 ---- + /* + * Split name up, it could be <name>:h<height>:w<width> etc. + */ +! for (p = wname; *p && *p != L':'; p++) + { +! if (p - wname + 1 >= LF_FACESIZE) + goto theend; /* Name too long */ +! lf->lfFaceName[p - wname] = *p; + } +! if (p != wname) +! lf->lfFaceName[p - wname] = NUL; + + /* First set defaults */ + lf->lfHeight = -12; +*************** +*** 3136,3153 **** + int did_replace = FALSE; + + for (i = 0; lf->lfFaceName[i]; ++i) +! if (IsDBCSLeadByte(lf->lfFaceName[i])) +! ++i; +! else if (lf->lfFaceName[i] == '_') + { +! lf->lfFaceName[i] = ' '; + did_replace = TRUE; + } + if (!did_replace || init_logfont(lf) == FAIL) + goto theend; + } + +! while (*p == ':') + p++; + + /* Set the values found after ':' */ +--- 3148,3163 ---- + int did_replace = FALSE; + + for (i = 0; lf->lfFaceName[i]; ++i) +! if (lf->lfFaceName[i] == L'_') + { +! lf->lfFaceName[i] = L' '; + did_replace = TRUE; + } + if (!did_replace || init_logfont(lf) == FAIL) + goto theend; + } + +! while (*p == L':') + p++; + + /* Set the values found after ':' */ +*************** +*** 3155,3184 **** + { + switch (*p++) + { +! case 'h': + lf->lfHeight = - points_to_pixels(p, &p, TRUE, (long_i)printer_dc); + break; +! case 'w': + lf->lfWidth = points_to_pixels(p, &p, FALSE, (long_i)printer_dc); + break; +! case 'b': + lf->lfWeight = FW_BOLD; + break; +! case 'i': + lf->lfItalic = TRUE; + break; +! case 'u': + lf->lfUnderline = TRUE; + break; +! case 's': + lf->lfStrikeOut = TRUE; + break; +! case 'c': + { + struct charset_pair *cp; + + for (cp = charset_pairs; cp->name != NULL; ++cp) +! if (STRNCMP(p, cp->name, strlen(cp->name)) == 0) + { + lf->lfCharSet = cp->charset; + p += strlen(cp->name); +--- 3165,3194 ---- + { + switch (*p++) + { +! case L'h': + lf->lfHeight = - points_to_pixels(p, &p, TRUE, (long_i)printer_dc); + break; +! case L'w': + lf->lfWidth = points_to_pixels(p, &p, FALSE, (long_i)printer_dc); + break; +! case L'b': + lf->lfWeight = FW_BOLD; + break; +! case L'i': + lf->lfItalic = TRUE; + break; +! case L'u': + lf->lfUnderline = TRUE; + break; +! case L's': + lf->lfStrikeOut = TRUE; + break; +! case L'c': + { + struct charset_pair *cp; + + for (cp = charset_pairs; cp->name != NULL; ++cp) +! if (utf16ascncmp(p, cp->name, strlen(cp->name)) == 0) + { + lf->lfCharSet = cp->charset; + p += strlen(cp->name); +*************** +*** 3186,3202 **** + } + if (cp->name == NULL && verbose) + { +! semsg(_("E244: Illegal charset name \"%s\" in font name \"%s\""), p, name); + break; + } + break; + } +! case 'q': + { + struct quality_pair *qp; + + for (qp = quality_pairs; qp->name != NULL; ++qp) +! if (STRNCMP(p, qp->name, strlen(qp->name)) == 0) + { + lf->lfQuality = qp->quality; + p += strlen(qp->name); +--- 3196,3214 ---- + } + if (cp->name == NULL && verbose) + { +! char_u *s = utf16_to_enc(p, NULL); +! semsg(_("E244: Illegal charset name \"%s\" in font name \"%s\""), s, name); +! vim_free(s); + break; + } + break; + } +! case L'q': + { + struct quality_pair *qp; + + for (qp = quality_pairs; qp->name != NULL; ++qp) +! if (utf16ascncmp(p, qp->name, strlen(qp->name)) == 0) + { + lf->lfQuality = qp->quality; + p += strlen(qp->name); +*************** +*** 3204,3210 **** + } + if (qp->name == NULL && verbose) + { +! semsg(_("E244: Illegal quality name \"%s\" in font name \"%s\""), p, name); + break; + } + break; +--- 3216,3224 ---- + } + if (qp->name == NULL && verbose) + { +! char_u *s = utf16_to_enc(p, NULL); +! semsg(_("E244: Illegal quality name \"%s\" in font name \"%s\""), s, name); +! vim_free(s); + break; + } + break; +*************** +*** 3214,3220 **** + semsg(_("E245: Illegal char '%c' in font name \"%s\""), p[-1], name); + goto theend; + } +! while (*p == ':') + p++; + } + ret = OK; +--- 3228,3234 ---- + semsg(_("E245: Illegal char '%c' in font name \"%s\""), p[-1], name); + goto theend; + } +! while (*p == L':') + p++; + } + ret = OK; +*************** +*** 3224,3234 **** + if (ret == OK && printer_dc == NULL) + { + vim_free(lastlf); +! lastlf = (LOGFONT *)alloc(sizeof(LOGFONT)); + if (lastlf != NULL) +! mch_memmove(lastlf, lf, sizeof(LOGFONT)); + } +! vim_free(acpname); + + return ret; + } +--- 3238,3248 ---- + if (ret == OK && printer_dc == NULL) + { + vim_free(lastlf); +! lastlf = (LOGFONTW *)alloc(sizeof(LOGFONTW)); + if (lastlf != NULL) +! mch_memmove(lastlf, lf, sizeof(LOGFONTW)); + } +! vim_free(wname); + + return ret; + } +*** ../vim-8.1.1080/src/proto/gui_w32.pro 2019-02-01 20:42:18.718884011 +0100 +--- src/proto/gui_w32.pro 2019-03-30 16:20:37.994106945 +0100 +*************** +*** 70,76 **** + void gui_mch_set_fg_color(guicolor_T color); + void gui_mch_set_bg_color(guicolor_T color); + void gui_mch_set_sp_color(guicolor_T color); +! void im_set_font(LOGFONT *lf); + void im_set_position(int row, int col); + void im_set_active(int active); + int im_get_status(void); +--- 70,76 ---- + void gui_mch_set_fg_color(guicolor_T color); + void gui_mch_set_bg_color(guicolor_T color); + void gui_mch_set_sp_color(guicolor_T color); +! void im_set_font(LOGFONTW *lf); + void im_set_position(int row, int col); + void im_set_active(int active); + int im_get_status(void); +*** ../vim-8.1.1080/src/proto/os_mswin.pro 2019-02-10 23:18:49.038187525 +0100 +--- src/proto/os_mswin.pro 2019-03-30 16:20:37.994106945 +0100 +*************** +*** 49,54 **** + void serverProcessPendingMessages(void); + char *charset_id2name(int id); + char *quality_id2name(DWORD id); +! int get_logfont(LOGFONT *lf, char_u *name, HDC printer_dc, int verbose); + void channel_init_winsock(void); + /* vim: set ft=c : */ +--- 49,54 ---- + void serverProcessPendingMessages(void); + char *charset_id2name(int id); + char *quality_id2name(DWORD id); +! int get_logfont(LOGFONTW *lf, char_u *name, HDC printer_dc, int verbose); + void channel_init_winsock(void); + /* vim: set ft=c : */ +*** ../vim-8.1.1080/src/version.c 2019-03-30 15:59:48.086175476 +0100 +--- src/version.c 2019-03-30 16:22:38.549119396 +0100 +*************** +*** 777,778 **** +--- 777,780 ---- + { /* Add new patch number below this line */ ++ /**/ ++ 1081, + /**/ + +-- +hundred-and-one symptoms of being an internet addict: +161. You get up before the sun rises to check your e-mail, and you + find yourself in the very same chair long after the sun has set. + + /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ +/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ +\\\ an exciting new programming language -- http://www.Zimbu.org /// + \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |