# HG changeset patch # User Christian Brabandt # Date 1705079705 -3600 # Node ID 2630432cb6b19e26bd8916900edd8e6e243bf347 # Parent 3f4a2bb2e5e886ecbb719cc6e52808b200ae059d patch 9.1.0026: win32: Windows default font lacking Commit: https://github.com/vim/vim/commit/d8cb1ddab7b8cb19267a8877d62bbe3a06626fa2 Author: Ken Takata Date: Fri Jan 12 18:09:43 2024 +0100 patch 9.1.0026: win32: Windows default font lacking Problem: win32: Windows default font lacking (@clach04) Solution: Improve default font (Ken Takata) win32: Improve default font Currently, Fixedsys is the default font on Windows. It is not suitable for recent High DPI environments. * Change the default font to Consolas. * Allow to change the default font by the translation message. E.g.: ``` msgid "DefaultFontNameForWindows" msgstr "Courier New" ``` fixes: #12919 closes: #13266 Signed-off-by: Ken Takata Signed-off-by: Christian Brabandt diff --git a/src/gui_w32.c b/src/gui_w32.c --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -392,16 +392,6 @@ static int (WINAPI *pGetSystemMetricsFor static DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT dpiContext) = NULL; static DPI_AWARENESS (WINAPI *pGetAwarenessFromDpiAwarenessContext)(DPI_AWARENESS_CONTEXT) = NULL; - static UINT WINAPI -stubGetDpiForSystem(void) -{ - HWND hwnd = GetDesktopWindow(); - HDC hdc = GetWindowDC(hwnd); - UINT dpi = GetDeviceCaps(hdc, LOGPIXELSY); - ReleaseDC(hwnd, hdc); - return dpi; -} - static int WINAPI stubGetSystemMetricsForDpi(int nIndex, UINT dpi UNUSED) { @@ -5286,7 +5276,7 @@ load_dpi_func(void) fail: // Disable PerMonitorV2 APIs. - pGetDpiForSystem = stubGetDpiForSystem; + pGetDpiForSystem = vimGetDpiForSystem; pGetDpiForWindow = NULL; pGetSystemMetricsForDpi = stubGetSystemMetricsForDpi; pSetThreadDpiAwarenessContext = NULL; diff --git a/src/os_mswin.c b/src/os_mswin.c --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -2747,19 +2747,22 @@ quality_id2name(DWORD id) return qp->name; } +// The default font height in 100% scaling (96dpi). +// (-12 in 96dpi equates to roughly 9pt) +#define DEFAULT_FONT_HEIGHT (-12) + static const LOGFONTW s_lfDefault = { - -12, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, DEFAULT_CHARSET, + DEFAULT_FONT_HEIGHT, + 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 + L"" // Default font name will be set later based on current language. }; -// Initialise the "current height" to -12 (same as s_lfDefault) just -// in case the user specifies a font in "guifont" with no size before a font -// with an explicit size has been set. This defaults the size to this value -// (-12 equates to roughly 9pt). -int current_font_height = -12; // also used in gui_w32.c +// This will be initialized when set_default_logfont() is called first time. +// The value will be based on the system DPI. +int current_font_height = 0; // also used in gui_w32.c /* * Convert a string representing a point size into pixels. The string should @@ -3027,6 +3030,47 @@ utf16ascncmp(const WCHAR *w, const char } /* + * Equivalent of GetDpiForSystem(). + */ + UINT WINAPI +vimGetDpiForSystem(void) +{ + HWND hwnd = GetDesktopWindow(); + HDC hdc = GetWindowDC(hwnd); + UINT dpi = GetDeviceCaps(hdc, LOGPIXELSY); + ReleaseDC(hwnd, hdc); + return dpi; +} + +/* + * Set default logfont based on current language. + */ + static void +set_default_logfont(LOGFONTW *lf) +{ + // Default font name for current language on MS-Windows. + // If not translated, falls back to "Consolas". + // This must be a fixed-pitch font. + const char *defaultfontname = N_("DefaultFontNameForWindows"); + char *fontname = _(defaultfontname); + + if (strcmp(fontname, defaultfontname) == 0) + fontname = "Consolas"; + + *lf = s_lfDefault; + lf->lfHeight = DEFAULT_FONT_HEIGHT * (int)vimGetDpiForSystem() / 96; + if (current_font_height == 0) + current_font_height = lf->lfHeight; + + WCHAR *wfontname = enc_to_utf16((char_u*)fontname, NULL); + if (wfontname != NULL) + { + wcscpy_s(lf->lfFaceName, LF_FACESIZE, wfontname); + vim_free(wfontname); + } +} + +/* * Get font info from "name" into logfont "lf". * Return OK for a valid name, FAIL otherwise. */ @@ -3043,7 +3087,7 @@ get_logfont( static LOGFONTW *lastlf = NULL; WCHAR *wname; - *lf = s_lfDefault; + set_default_logfont(lf); if (name == NULL) return OK; @@ -3083,7 +3127,7 @@ get_logfont( lf->lfFaceName[p - wname] = NUL; // First set defaults - lf->lfHeight = -12; + lf->lfHeight = DEFAULT_FONT_HEIGHT * (int)vimGetDpiForSystem() / 96; lf->lfWidth = 0; lf->lfWeight = FW_NORMAL; lf->lfItalic = FALSE; diff --git a/src/proto/os_mswin.pro b/src/proto/os_mswin.pro --- a/src/proto/os_mswin.pro +++ b/src/proto/os_mswin.pro @@ -51,6 +51,7 @@ void serverProcessPendingMessages(void); char *charset_id2name(int id); char *quality_id2name(DWORD id); void gui_mch_expand_font(optexpand_T *args, void *param, int (*add_match)(char_u *val)); +UINT WINAPI vimGetDpiForSystem(void); 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/testdir/test_mswin_event.vim b/src/testdir/test_mswin_event.vim --- a/src/testdir/test_mswin_event.vim +++ b/src/testdir/test_mswin_event.vim @@ -727,14 +727,14 @@ func Test_mswin_event_mouse() if has('gui_running') let args = { } let args.row = 9 - let args.col = 7 + let args.col = 5 let args.move = 1 let args.cell = 1 call test_mswin_event("mouse", args) call feedkeys("\", 'Lx!') let pos = getmousepos() call assert_equal(9, pos.screenrow) - call assert_equal(7, pos.screencol) + call assert_equal(5, pos.screencol) let args.cell = 0 call test_mswin_event("mouse", args) diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -705,6 +705,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 26, +/**/ 25, /**/ 24,