diff src/gui_w32.c @ 16152:8f4eccaaf2c0 v8.1.1081

patch 8.1.1081: MS-Windows: cannot use some fonts commit https://github.com/vim/vim/commit/433a5eb9de861dd01ea3b3dfa3b8fe23527cab54 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Mar 30 16:24:16 2019 +0100 patch 8.1.1081: MS-Windows: cannot use some fonts 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)
author Bram Moolenaar <Bram@vim.org>
date Sat, 30 Mar 2019 16:30:04 +0100
parents a246b020984c
children cd5c83115ec6
line wrap: on
line diff
--- a/src/gui_w32.c
+++ b/src/gui_w32.c
@@ -253,7 +253,7 @@ typedef int HBITMAP;
 typedef int HBRUSH;
 typedef int HDROP;
 typedef int INT;
-typedef int LOGFONT[];
+typedef int LOGFONTW[];
 typedef int LPARAM;
 typedef int LPCREATESTRUCT;
 typedef int LPCSTR;
@@ -501,15 +501,15 @@ static void TrackUserActivity(UINT uMsg)
 /*
  * For control IME.
  *
- * These LOGFONT used for IME.
+ * These LOGFONTW used for IME.
  */
 #if defined(FEAT_MBYTE_IME) || defined(GLOBAL_IME)
-/* holds LOGFONT for 'guifontwide' if available, otherwise 'guifont' */
-static LOGFONT norm_logfont;
+/* holds LOGFONTW for 'guifontwide' if available, otherwise 'guifont' */
+static LOGFONTW norm_logfont;
 #endif
 #ifdef FEAT_MBYTE_IME
-/* holds LOGFONT for 'guifont' always. */
-static LOGFONT sub_logfont;
+/* holds LOGFONTW for 'guifont' always. */
+static LOGFONTW sub_logfont;
 #endif
 
 #ifdef FEAT_MBYTE_IME
@@ -1520,12 +1520,12 @@ gui_mch_adjust_charheight(void)
 }
 
     static GuiFont
-get_font_handle(LOGFONT *lf)
+get_font_handle(LOGFONTW *lf)
 {
     HFONT   font = NULL;
 
     /* Load the font */
-    font = CreateFontIndirect(lf);
+    font = CreateFontIndirectW(lf);
 
     if (font == NULL)
 	return NOFONT;
@@ -1556,7 +1556,7 @@ gui_mch_get_font(
     char_u	*name,
     int		giveErrorIfMissing)
 {
-    LOGFONT	lf;
+    LOGFONTW	lf;
     GuiFont	font = NOFONT;
 
     if (get_logfont(&lf, name, NULL, giveErrorIfMissing) == OK)
@@ -3201,23 +3201,18 @@ gui_mch_exit(int rc UNUSED)
 }
 
     static char_u *
-logfont2name(LOGFONT lf)
+logfont2name(LOGFONTW lf)
 {
     char	*p;
     char	*res;
     char	*charset_name;
     char	*quality_name;
-    char	*font_name = lf.lfFaceName;
-
+    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);
-    /* 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
@@ -3254,25 +3249,24 @@ logfont2name(LOGFONT lf)
 	}
     }
 
-    if (font_name != lf.lfFaceName)
-	vim_free(font_name);
+    vim_free(font_name);
     return (char_u *)res;
 }
 
 
 #ifdef FEAT_MBYTE_IME
 /*
- * Set correct LOGFONT to IME.  Use 'guifontwide' if available, otherwise use
+ * Set correct LOGFONTW to IME.  Use 'guifontwide' if available, otherwise use
  * 'guifont'
  */
     static void
 update_im_font(void)
 {
-    LOGFONT	lf_wide;
+    LOGFONTW	lf_wide;
 
     if (p_guifontwide != NULL && *p_guifontwide != NUL
 	    && gui.wide_font != NOFONT
-	    && GetObject((HFONT)gui.wide_font, sizeof(lf_wide), &lf_wide))
+	    && GetObjectW((HFONT)gui.wide_font, sizeof(lf_wide), &lf_wide))
 	norm_logfont = lf_wide;
     else
 	norm_logfont = sub_logfont;
@@ -3286,7 +3280,7 @@ update_im_font(void)
     void
 gui_mch_wide_font_changed(void)
 {
-    LOGFONT lf;
+    LOGFONTW lf;
 
 #ifdef FEAT_MBYTE_IME
     update_im_font();
@@ -3300,7 +3294,7 @@ gui_mch_wide_font_changed(void)
     gui.wide_boldital_font = NOFONT;
 
     if (gui.wide_font
-	&& GetObject((HFONT)gui.wide_font, sizeof(lf), &lf))
+	&& GetObjectW((HFONT)gui.wide_font, sizeof(lf), &lf))
     {
 	if (!lf.lfItalic)
 	{
@@ -3328,7 +3322,7 @@ gui_mch_wide_font_changed(void)
     int
 gui_mch_init_font(char_u *font_name, int fontset UNUSED)
 {
-    LOGFONT	lf;
+    LOGFONTW	lf;
     GuiFont	font = NOFONT;
     char_u	*p;
 
@@ -4225,8 +4219,8 @@ static HIMC (WINAPI *pImmAssociateContex
 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 *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,8 +4233,8 @@ static void dyn_imm_load(void);
 # define pImmReleaseContext	  ImmReleaseContext
 # define pImmGetOpenStatus	  ImmGetOpenStatus
 # define pImmSetOpenStatus	  ImmSetOpenStatus
-# define pImmGetCompositionFont   ImmGetCompositionFontA
-# define pImmSetCompositionFont   ImmSetCompositionFontA
+# define pImmGetCompositionFontW  ImmGetCompositionFontW
+# define pImmSetCompositionFontW  ImmSetCompositionFontW
 # define pImmSetCompositionWindow ImmSetCompositionWindow
 # define pImmGetConversionStatus  ImmGetConversionStatus
 # define pImmSetConversionStatus  ImmSetConversionStatus
@@ -4379,14 +4373,14 @@ init_mouse_wheel(void)
  * Return OK or FAIL.
  */
     static int
-gui_w32_get_menu_font(LOGFONT *lf)
-{
-    NONCLIENTMETRICS nm;
-
-    nm.cbSize = sizeof(NONCLIENTMETRICS);
-    if (!SystemParametersInfo(
+gui_w32_get_menu_font(LOGFONTW *lf)
+{
+    NONCLIENTMETRICSW nm;
+
+    nm.cbSize = sizeof(NONCLIENTMETRICSW);
+    if (!SystemParametersInfoW(
 	    SPI_GETNONCLIENTMETRICS,
-	    sizeof(NONCLIENTMETRICS),
+	    sizeof(NONCLIENTMETRICSW),
 	    &nm,
 	    0))
 	return FAIL;
@@ -4403,7 +4397,7 @@ gui_w32_get_menu_font(LOGFONT *lf)
     static void
 set_tabline_font(void)
 {
-    LOGFONT	lfSysmenu;
+    LOGFONTW	lfSysmenu;
     HFONT	font;
     HWND	hwnd;
     HDC		hdc;
@@ -4413,7 +4407,7 @@ set_tabline_font(void)
     if (gui_w32_get_menu_font(&lfSysmenu) != OK)
 	return;
 
-    font = CreateFontIndirect(&lfSysmenu);
+    font = CreateFontIndirectW(&lfSysmenu);
 
     SendMessage(s_tabhwnd, WM_SETFONT, (WPARAM)font, TRUE);
 
@@ -5562,7 +5556,7 @@ gui_mch_set_sp_color(guicolor_T color)
 	case IMN_SETOPENSTATUS:
 	    if (pImmGetOpenStatus(hImc))
 	    {
-		pImmSetCompositionFont(hImc, &norm_logfont);
+		pImmSetCompositionFontW(hImc, &norm_logfont);
 		im_set_position(gui.row, gui.col);
 
 		/* Disable langmap */
@@ -5703,13 +5697,13 @@ GetResultStr(HWND hwnd, int GCS, int *le
  * set font to IM.
  */
     void
-im_set_font(LOGFONT *lf)
+im_set_font(LOGFONTW *lf)
 {
     HIMC hImc;
 
     if (pImmGetContext && (hImc = pImmGetContext(s_hwnd)) != (HIMC)0)
     {
-	pImmSetCompositionFont(hImc, lf);
+	pImmSetCompositionFontW(hImc, lf);
 	pImmReleaseContext(s_hwnd, hImc);
     }
 }
@@ -6829,7 +6823,7 @@ gui_mch_dialog(
     int		dlgPaddingX;
     int		dlgPaddingY;
 #ifdef USE_SYSMENU_FONT
-    LOGFONT	lfSysmenu;
+    LOGFONTW	lfSysmenu;
     int		use_lfSysmenu = FALSE;
 #endif
     garray_T	ga;
@@ -6894,7 +6888,7 @@ gui_mch_dialog(
 #ifdef USE_SYSMENU_FONT
     if (gui_w32_get_menu_font(&lfSysmenu) == OK)
     {
-	font = CreateFontIndirect(&lfSysmenu);
+	font = CreateFontIndirectW(&lfSysmenu);
 	use_lfSysmenu = TRUE;
     }
     else
@@ -7123,7 +7117,8 @@ gui_mch_dialog(
 	    /* point size */
 	    *p++ = -MulDiv(lfSysmenu.lfHeight, 72,
 		    GetDeviceCaps(hdc, LOGPIXELSY));
-	    nchar = nCopyAnsiToWideChar(p, lfSysmenu.lfFaceName, FALSE);
+	    wcscpy(p, lfSysmenu.lfFaceName);
+	    nchar = (int)wcslen(lfSysmenu.lfFaceName) + 1;
 	}
 	else
 #endif
@@ -7488,14 +7483,14 @@ get_dialog_font_metrics(void)
     DWORD	    dlgFontSize;
     SIZE	    size;
 #ifdef USE_SYSMENU_FONT
-    LOGFONT	    lfSysmenu;
+    LOGFONTW	    lfSysmenu;
 #endif
 
     s_usenewlook = FALSE;
 
 #ifdef USE_SYSMENU_FONT
     if (gui_w32_get_menu_font(&lfSysmenu) == OK)
-	hfontTools = CreateFontIndirect(&lfSysmenu);
+	hfontTools = CreateFontIndirectW(&lfSysmenu);
     else
 #endif
 	hfontTools = CreateFont(-DLG_FONT_POINT_SIZE, 0, 0, 0, 0, 0, 0, 0,
@@ -7563,7 +7558,7 @@ gui_mch_tearoff(
     int		x;
     int		y;
 #ifdef USE_SYSMENU_FONT
-    LOGFONT	lfSysmenu;
+    LOGFONTW	lfSysmenu;
     int		use_lfSysmenu = FALSE;
 #endif
 
@@ -7599,7 +7594,7 @@ gui_mch_tearoff(
 #ifdef USE_SYSMENU_FONT
     if (gui_w32_get_menu_font(&lfSysmenu) == OK)
     {
-	font = CreateFontIndirect(&lfSysmenu);
+	font = CreateFontIndirectW(&lfSysmenu);
 	use_lfSysmenu = TRUE;
     }
     else
@@ -7708,7 +7703,8 @@ gui_mch_tearoff(
 	    /* point size */
 	    *p++ = -MulDiv(lfSysmenu.lfHeight, 72,
 		    GetDeviceCaps(hdc, LOGPIXELSY));
-	    nchar = nCopyAnsiToWideChar(p, lfSysmenu.lfFaceName, FALSE);
+	    wcscpy(p, lfSysmenu.lfFaceName);
+	    nchar = (int)wcslen(lfSysmenu.lfFaceName) + 1;
 	}
 	else
 #endif
@@ -8136,10 +8132,10 @@ dyn_imm_load(void)
 	    = (void *)GetProcAddress(hLibImm, "ImmGetOpenStatus");
     pImmSetOpenStatus
 	    = (void *)GetProcAddress(hLibImm, "ImmSetOpenStatus");
-    pImmGetCompositionFont
-	    = (void *)GetProcAddress(hLibImm, "ImmGetCompositionFontA");
-    pImmSetCompositionFont
-	    = (void *)GetProcAddress(hLibImm, "ImmSetCompositionFontA");
+    pImmGetCompositionFontW
+	    = (void *)GetProcAddress(hLibImm, "ImmGetCompositionFontW");
+    pImmSetCompositionFontW
+	    = (void *)GetProcAddress(hLibImm, "ImmSetCompositionFontW");
     pImmSetCompositionWindow
 	    = (void *)GetProcAddress(hLibImm, "ImmSetCompositionWindow");
     pImmGetConversionStatus
@@ -8154,8 +8150,8 @@ dyn_imm_load(void)
 	    || pImmReleaseContext == NULL
 	    || pImmGetOpenStatus == NULL
 	    || pImmSetOpenStatus == NULL
-	    || pImmGetCompositionFont == NULL
-	    || pImmSetCompositionFont == NULL
+	    || pImmGetCompositionFontW == NULL
+	    || pImmSetCompositionFontW == NULL
 	    || pImmSetCompositionWindow == NULL
 	    || pImmGetConversionStatus == NULL
 	    || pImmSetConversionStatus == NULL)