summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-03-30 16:24:16 +0100
committerBram Moolenaar <Bram@vim.org>2019-03-30 16:24:16 +0100
commit433a5eb9de861dd01ea3b3dfa3b8fe23527cab54 (patch)
tree8ca2584bcc3dfce7f1a19c06f0346439695a2cda
parentef7f0e367eeaf6fb31b1caa0e3de1a4b07e86af3 (diff)
patch 8.1.1081: MS-Windows: cannot use some fontsv8.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)
-rw-r--r--src/gui_w32.c106
-rw-r--r--src/os_mswin.c140
-rw-r--r--src/proto/gui_w32.pro2
-rw-r--r--src/proto/os_mswin.pro2
-rw-r--r--src/version.c2
5 files changed, 132 insertions, 120 deletions
diff --git a/src/gui_w32.c b/src/gui_w32.c
index e6d2e80635..c4bc3c912c 100644
--- 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 *pImmAssociateContext)(HWND, HIMC);
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 @@ _OnMouseWheel(
* Return OK or FAIL.
*/
static int
-gui_w32_get_menu_font(LOGFONT *lf)
+gui_w32_get_menu_font(LOGFONTW *lf)
{
- NONCLIENTMETRICS nm;
+ NONCLIENTMETRICSW nm;
- nm.cbSize = sizeof(NONCLIENTMETRICS);
- if (!SystemParametersInfo(
+ 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 @@ _OnImeNotify(HWND hWnd, DWORD dwCommand, DWORD dwData UNUSED)
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 *lenp)
* 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)
diff --git a/src/os_mswin.c b/src/os_mswin.c
index 27a2cc6ace..ad5b60fd87 100644
--- a/src/os_mswin.c
+++ b/src/os_mswin.c
@@ -85,7 +85,7 @@ typedef int COLORREF;
typedef int CONSOLE_CURSOR_INFO;
typedef int COORD;
typedef int DWORD;
-typedef int ENUMLOGFONT;
+typedef int ENUMLOGFONTW;
typedef int HANDLE;
typedef int HDC;
typedef int HFONT;
@@ -93,7 +93,7 @@ typedef int HICON;
typedef int HWND;
typedef int INPUT_RECORD;
typedef int KEY_EVENT_RECORD;
-typedef int LOGFONT;
+typedef int LOGFONTW;
typedef int LPARAM;
typedef int LPBOOL;
typedef int LPCSTR;
@@ -103,7 +103,7 @@ typedef int LPTSTR;
typedef int LPWSTR;
typedef int LRESULT;
typedef int MOUSE_EVENT_RECORD;
-typedef int NEWTEXTMETRIC;
+typedef int NEWTEXTMETRICW;
typedef int PACL;
typedef int PRINTDLG;
typedef int PSECURITY_DESCRIPTOR;
@@ -1420,7 +1420,7 @@ mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit)
static int stored_nCopies = 1;
static int stored_nFlags = 0;
- LOGFONT fLogFont;
+ LOGFONTW fLogFont;
int pifItalic;
int pifBold;
int pifUnderline;
@@ -1577,7 +1577,7 @@ mch_print_init(prt_settings_T *psettings, char_u *jobname, int forceit)
fLogFont.lfItalic = pifItalic;
fLogFont.lfUnderline = pifUnderline;
prt_font_handles[pifBold][pifItalic][pifUnderline]
- = CreateFontIndirect(&fLogFont);
+ = CreateFontIndirectW(&fLogFont);
}
SetBkMode(prt_dlg.hDC, OPAQUE);
@@ -2915,12 +2915,12 @@ quality_id2name(DWORD id)
return qp->name;
}
-static const LOGFONT s_lfDefault =
+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,
- "Fixedsys" /* see _ReadVimIni */
+ L"Fixedsys" /* see _ReadVimIni */
};
/* Initialise the "current height" to -12 (same as s_lfDefault) just
@@ -2937,7 +2937,7 @@ int current_font_height = -12; /* also used in gui_w48.c */
* 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)
+points_to_pixels(WCHAR *str, WCHAR **end, int vertical, long_i pprinter_dc)
{
int pixels;
int points = 0;
@@ -2948,7 +2948,7 @@ points_to_pixels(char_u *str, char_u **end, int vertical, long_i pprinter_dc)
while (*str != NUL)
{
- if (*str == '.' && divisor == 0)
+ if (*str == L'.' && divisor == 0)
{
/* Start keeping a divisor, for later */
divisor = 1;
@@ -2959,7 +2959,7 @@ points_to_pixels(char_u *str, char_u **end, int vertical, long_i pprinter_dc)
break;
points *= 10;
- points += *str - '0';
+ points += *str - L'0';
divisor *= 10;
}
++str;
@@ -2989,15 +2989,15 @@ points_to_pixels(char_u *str, char_u **end, int vertical, long_i pprinter_dc)
static int CALLBACK
font_enumproc(
- ENUMLOGFONT *elf,
- NEWTEXTMETRIC *ntm UNUSED,
- int type UNUSED,
+ 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 LOGFONT
+ * 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,7 +3005,7 @@ font_enumproc(
* It's not pretty, but it works!
*/
- LOGFONT *lf = (LOGFONT *)(lparam);
+ LOGFONTW *lf = (LOGFONTW *)(lparam);
#ifndef FEAT_PROPORTIONAL_FONTS
/* Ignore non-monospace fonts without further ado */
@@ -3013,7 +3013,7 @@ font_enumproc(
return 1;
#endif
- /* Remember this LOGFONT as a "possible" */
+ /* Remember this LOGFONTW as a "possible" */
*lf = elf->elfLogFont;
/* Terminate the scan as soon as we find an ANSI font */
@@ -3027,15 +3027,15 @@ font_enumproc(
}
static int
-init_logfont(LOGFONT *lf)
+init_logfont(LOGFONTW *lf)
{
int n;
HWND hwnd = GetDesktopWindow();
HDC hdc = GetWindowDC(hwnd);
- n = EnumFontFamilies(hdc,
- (LPCSTR)lf->lfFaceName,
- (FONTENUMPROC)font_enumproc,
+ n = EnumFontFamiliesW(hdc,
+ lf->lfFaceName,
+ (FONTENUMPROCW)font_enumproc,
(LPARAM)lf);
ReleaseDC(hwnd, hdc);
@@ -3044,7 +3044,7 @@ init_logfont(LOGFONT *lf)
if (n == 1)
return FAIL;
- /* Tidy up the rest of the LOGFONT structure. We set to a basic
+ /* 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,39 +3060,51 @@ init_logfont(LOGFONT *lf)
}
/*
+ * 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(
- LOGFONT *lf,
+ LOGFONTW *lf,
char_u *name,
HDC printer_dc,
int verbose)
{
- char_u *p;
+ WCHAR *p;
int i;
int ret = FAIL;
- static LOGFONT *lastlf = NULL;
- char_u *acpname = NULL;
+ static LOGFONTW *lastlf = NULL;
+ WCHAR *wname;
*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)
+ wname = enc_to_utf16(name, NULL);
+ if (wname == NULL)
+ return FAIL;
+
+ if (wcscmp(wname, L"*") == 0)
{
#if defined(FEAT_GUI_MSWIN)
- CHOOSEFONT cf;
+ CHOOSEFONTW cf;
/* if name is "*", bring up std font dialog: */
vim_memset(&cf, 0, sizeof(cf));
cf.lStructSize = sizeof(cf);
@@ -3102,7 +3114,7 @@ get_logfont(
*lf = *lastlf;
cf.lpLogFont = lf;
cf.nFontType = 0 ; //REGULAR_FONTTYPE;
- if (ChooseFont(&cf))
+ if (ChooseFontW(&cf))
ret = OK;
#endif
goto theend;
@@ -3111,14 +3123,14 @@ get_logfont(
/*
* Split name up, it could be <name>:h<height>:w<width> etc.
*/
- for (p = name; *p && *p != ':'; p++)
+ for (p = wname; *p && *p != L':'; p++)
{
- if (p - name + 1 >= LF_FACESIZE)
+ if (p - wname + 1 >= LF_FACESIZE)
goto theend; /* Name too long */
- lf->lfFaceName[p - name] = *p;
+ lf->lfFaceName[p - wname] = *p;
}
- if (p != name)
- lf->lfFaceName[p - name] = NUL;
+ if (p != wname)
+ lf->lfFaceName[p - wname] = NUL;
/* First set defaults */
lf->lfHeight = -12;
@@ -3136,18 +3148,16 @@ get_logfont(
int did_replace = FALSE;
for (i = 0; lf->lfFaceName[i]; ++i)
- if (IsDBCSLeadByte(lf->lfFaceName[i]))
- ++i;
- else if (lf->lfFaceName[i] == '_')
+ if (lf->lfFaceName[i] == L'_')
{
- lf->lfFaceName[i] = ' ';
+ lf->lfFaceName[i] = L' ';
did_replace = TRUE;
}
if (!did_replace || init_logfont(lf) == FAIL)
goto theend;
}
- while (*p == ':')
+ while (*p == L':')
p++;
/* Set the values found after ':' */
@@ -3155,30 +3165,30 @@ get_logfont(
{
switch (*p++)
{
- case 'h':
+ case L'h':
lf->lfHeight = - points_to_pixels(p, &p, TRUE, (long_i)printer_dc);
break;
- case 'w':
+ case L'w':
lf->lfWidth = points_to_pixels(p, &p, FALSE, (long_i)printer_dc);
break;
- case 'b':
+ case L'b':
lf->lfWeight = FW_BOLD;
break;
- case 'i':
+ case L'i':
lf->lfItalic = TRUE;
break;
- case 'u':
+ case L'u':
lf->lfUnderline = TRUE;
break;
- case 's':
+ case L's':
lf->lfStrikeOut = TRUE;
break;
- case 'c':
+ case L'c':
{
struct charset_pair *cp;
for (cp = charset_pairs; cp->name != NULL; ++cp)
- if (STRNCMP(p, cp->name, strlen(cp->name)) == 0)
+ if (utf16ascncmp(p, cp->name, strlen(cp->name)) == 0)
{
lf->lfCharSet = cp->charset;
p += strlen(cp->name);
@@ -3186,17 +3196,19 @@ get_logfont(
}
if (cp->name == NULL && verbose)
{
- semsg(_("E244: Illegal charset name \"%s\" in font name \"%s\""), p, name);
+ 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 'q':
+ case L'q':
{
struct quality_pair *qp;
for (qp = quality_pairs; qp->name != NULL; ++qp)
- if (STRNCMP(p, qp->name, strlen(qp->name)) == 0)
+ if (utf16ascncmp(p, qp->name, strlen(qp->name)) == 0)
{
lf->lfQuality = qp->quality;
p += strlen(qp->name);
@@ -3204,7 +3216,9 @@ get_logfont(
}
if (qp->name == NULL && verbose)
{
- semsg(_("E244: Illegal quality name \"%s\" in font name \"%s\""), p, name);
+ 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,7 +3228,7 @@ get_logfont(
semsg(_("E245: Illegal char '%c' in font name \"%s\""), p[-1], name);
goto theend;
}
- while (*p == ':')
+ while (*p == L':')
p++;
}
ret = OK;
@@ -3224,11 +3238,11 @@ theend:
if (ret == OK && printer_dc == NULL)
{
vim_free(lastlf);
- lastlf = (LOGFONT *)alloc(sizeof(LOGFONT));
+ lastlf = (LOGFONTW *)alloc(sizeof(LOGFONTW));
if (lastlf != NULL)
- mch_memmove(lastlf, lf, sizeof(LOGFONT));
+ mch_memmove(lastlf, lf, sizeof(LOGFONTW));
}
- vim_free(acpname);
+ vim_free(wname);
return ret;
}
diff --git a/src/proto/gui_w32.pro b/src/proto/gui_w32.pro
index 75edd4be24..9f2e5fbce6 100644
--- a/src/proto/gui_w32.pro
+++ b/src/proto/gui_w32.pro
@@ -70,7 +70,7 @@ void gui_mch_set_font(GuiFont font);
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_font(LOGFONTW *lf);
void im_set_position(int row, int col);
void im_set_active(int active);
int im_get_status(void);
diff --git a/src/proto/os_mswin.pro b/src/proto/os_mswin.pro
index 3e8d487077..2548d00794 100644
--- a/src/proto/os_mswin.pro
+++ b/src/proto/os_mswin.pro
@@ -49,6 +49,6 @@ char_u *serverGetReply(HWND server, int *expr_res, int remove, int wait, int tim
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);
+int get_logfont(LOGFONTW *lf, char_u *name, HDC printer_dc, int verbose);
void channel_init_winsock(void);
/* vim: set ft=c : */
diff --git a/src/version.c b/src/version.c
index 508736a44b..fad51e22b7 100644
--- a/src/version.c
+++ b/src/version.c
@@ -776,6 +776,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1081,
+/**/
1080,
/**/
1079,