From: Mao-Yining Date: Sun, 15 Mar 2026 09:49:33 +0000 (+0000) Subject: patch 9.2.0171: MS-Windows: version detection is deprecated X-Git-Tag: v9.2.0171^0 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ca62f84503f78d267b94361ee0652d9713406462;p=thirdparty%2Fvim.git patch 9.2.0171: MS-Windows: version detection is deprecated Problem: MS-Windows: GetVersionEx() is deprecated since Windows 8. Version checks for specific features (like dark mode or title bar colors) are duplicated across files using multiple boolean flags. Solution: Use RtlGetVersion() to centralize detection in a single win_version variable. Use the MAKE_VER() macro to check against major, minor, and build numbers. Update titlebar colors and dark theme to use proper version thresholds (Mao-Yining). closes: #19673 Signed-off-by: Mao-Yining Signed-off-by: Christian Brabandt --- diff --git a/src/gui_w32.c b/src/gui_w32.c index 4b8b5f83dc..09d90be791 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -1572,7 +1572,7 @@ dyn_dwm_load(void) } } -extern BOOL win11_or_later; // this is in os_win32.c +extern DWORD win_version; // this is in os_mswin.c /* * Set TitleBar's color. Handle hl-TitleBar and hl-TitleBarNC. @@ -1584,11 +1584,12 @@ extern BOOL win11_or_later; // this is in os_win32.c void gui_mch_set_titlebar_colors(void) { - if (pDwmSetWindowAttribute == NULL || !win11_or_later) +#define DWMWA_COLOR_DEFAULT 0xFFFFFFFF + if (pDwmSetWindowAttribute == NULL || win_version < MAKE_VER(10, 0, 22000)) return; - guicolor_T captionColor = 0xFFFFFFFF; - guicolor_T textColor = 0xFFFFFFFF; + guicolor_T captionColor = DWMWA_COLOR_DEFAULT; + guicolor_T textColor = DWMWA_COLOR_DEFAULT; if (vim_strchr(p_go, GO_TITLEBAR) != NULL) { @@ -1604,9 +1605,9 @@ gui_mch_set_titlebar_colors(void) } if (captionColor == INVALCOLOR) - captionColor = 0xFFFFFFFF; + captionColor = DWMWA_COLOR_DEFAULT; if (textColor == INVALCOLOR) - textColor = 0xFFFFFFFF; + textColor = DWMWA_COLOR_DEFAULT; } pDwmSetWindowAttribute(s_hwnd, DWMWA_CAPTION_COLOR, @@ -3131,22 +3132,17 @@ gui_mch_set_curtab(int nr) #endif #ifdef FEAT_GUI_DARKTHEME -extern BOOL win10_22H2_or_later; // this is in os_win32.c - void gui_mch_set_dark_theme(int dark) { - if (!win10_22H2_or_later) - return; - - if (pDwmSetWindowAttribute != NULL) + if (pDwmSetWindowAttribute != NULL && win_version >= MAKE_VER(10, 0, 18985)) pDwmSetWindowAttribute(s_hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &dark, sizeof(dark)); - if (pSetPreferredAppMode != NULL) + if (pSetPreferredAppMode != NULL && win_version >= MAKE_VER(10, 0, 18362)) pSetPreferredAppMode(dark); - if (pFlushMenuThemes != NULL) + if (pFlushMenuThemes != NULL && win_version >= MAKE_VER(10, 0, 18362)) pFlushMenuThemes(); } diff --git a/src/os_mswin.c b/src/os_mswin.c index f8fee0e591..89e4d1c4dd 100644 --- a/src/os_mswin.c +++ b/src/os_mswin.c @@ -16,7 +16,6 @@ #include "vim.h" #include -#include #include #include @@ -105,6 +104,34 @@ mch_exit_g(int r) #endif // FEAT_GUI_MSWIN +/* + * Get version number including build number + */ +typedef BOOL (WINAPI *PfnRtlGetVersion)(LPOSVERSIONINFOW); +DWORD win_version; + static void +win_version_init(void) +{ + OSVERSIONINFOW osver; + HMODULE hNtdll; + PfnRtlGetVersion pRtlGetVersion; + + hNtdll = GetModuleHandle("ntdll.dll"); + if (hNtdll == NULL) + return; + + pRtlGetVersion = + (PfnRtlGetVersion) GetProcAddress(hNtdll, "RtlGetVersion"); + if (pRtlGetVersion == NULL) + return; + + osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); + pRtlGetVersion(&osver); + win_version = + MAKE_VER(osver.dwMajorVersion, osver.dwMinorVersion, + osver.dwBuildNumber); +} + /* * Init the tables for toupper() and tolower(). */ @@ -113,6 +140,8 @@ mch_early_init(void) { int i; + win_version_init(); + PlatformId(); // Init the tables for toupper() and tolower() diff --git a/src/os_win32.c b/src/os_win32.c index 6ccd185f08..99acf6afed 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -160,42 +160,11 @@ static int suppress_winsize = 1; // don't fiddle with console static WCHAR *exe_pathw = NULL; -static BOOL win8_or_later = FALSE; -BOOL win10_22H2_or_later = FALSE; -BOOL win11_or_later = FALSE; // used in gui_mch_set_titlebar_colors(void) - #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL) static BOOL use_alternate_screen_buffer = FALSE; #endif -/* - * Get version number including build number - */ -typedef BOOL (WINAPI *PfnRtlGetVersion)(LPOSVERSIONINFOW); -#define MAKE_VER(major, minor, build) \ - (((major) << 24) | ((minor) << 16) | (build)) - - static DWORD -get_build_number(void) -{ - OSVERSIONINFOW osver; - HMODULE hNtdll; - PfnRtlGetVersion pRtlGetVersion; - DWORD ver = MAKE_VER(0, 0, 0); - - osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW); - hNtdll = GetModuleHandle("ntdll.dll"); - if (hNtdll == NULL) - return ver; - - pRtlGetVersion = - (PfnRtlGetVersion)GetProcAddress(hNtdll, "RtlGetVersion"); - pRtlGetVersion(&osver); - ver = MAKE_VER(min(osver.dwMajorVersion, 255), - min(osver.dwMinorVersion, 255), - min(osver.dwBuildNumber, 32767)); - return ver; -} +extern DWORD win_version; // this is in os_mswin.c #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL) static BOOL @@ -257,7 +226,7 @@ read_console_input( if (nLength == -2) return (s_dwMax > 0) ? TRUE : FALSE; - if (!win8_or_later) + if (win_version < MAKE_VER(6, 2, 0)) // Before Windows 8 { if (nLength == -1) return PeekConsoleInputW(hInput, lpBuffer, 1, lpEvents); @@ -918,39 +887,17 @@ win32_enable_privilege(LPTSTR lpszPrivilege) } #endif -#ifdef _MSC_VER -// Suppress the deprecation warning for using GetVersionEx(). -// It is needed for implementing "windowsversion()". -# pragma warning(push) -# pragma warning(disable: 4996) -#endif /* - * Set "win8_or_later" and fill in "windowsVersion" if possible. + * Fill in "windowsVersion" if possible and enable security privilege for ACL. */ void PlatformId(void) { - OSVERSIONINFO ovi; - - ovi.dwOSVersionInfoSize = sizeof(ovi); - if (!GetVersionEx(&ovi)) - return; - #ifdef FEAT_EVAL - vim_snprintf(windowsVersion, sizeof(windowsVersion), "%d.%d", - (int)ovi.dwMajorVersion, (int)ovi.dwMinorVersion); + DWORD major = (win_version >> 24) & 0xFF; + DWORD minor = (win_version >> 16) & 0xFF; + vim_snprintf(windowsVersion, sizeof(windowsVersion), "%d.%d", major, minor); #endif - if ((ovi.dwMajorVersion == 6 && ovi.dwMinorVersion >= 2) - || ovi.dwMajorVersion > 6) - win8_or_later = TRUE; - - if ((ovi.dwMajorVersion == 10 && ovi.dwBuildNumber >= 19045) - || ovi.dwMajorVersion > 10) - win10_22H2_or_later = TRUE; - - if ((ovi.dwMajorVersion == 10 && ovi.dwBuildNumber >= 22000) - || ovi.dwMajorVersion > 10) - win11_or_later = TRUE; #ifdef HAVE_ACL // Enable privilege for getting or setting SACLs. @@ -958,9 +905,6 @@ PlatformId(void) return; #endif } -#ifdef _MSC_VER -# pragma warning(pop) -#endif #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL) @@ -8537,7 +8481,7 @@ mch_setenv(char *var, char *value, int x UNUSED) * Support for 256 colors and 24-bit colors was added in Windows 10 * version 1703 (Creators update). */ -#define VTP_FIRST_SUPPORT_BUILD MAKE_VER(10, 0, 15063) +#define VTP_FIRST_SUPPORT_BUILD MAKE_VER(10, 0, 15063) /* * Support for pseudo-console (ConPTY) was added in windows 10 @@ -8582,7 +8526,6 @@ mch_setenv(char *var, char *value, int x UNUSED) static void vtp_flag_init(void) { - DWORD ver = get_build_number(); #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL) DWORD mode; HANDLE out; @@ -8593,7 +8536,7 @@ vtp_flag_init(void) { out = GetStdHandle(STD_OUTPUT_HANDLE); - vtp_working = (ver >= VTP_FIRST_SUPPORT_BUILD) ? 1 : 0; + vtp_working = (win_version >= VTP_FIRST_SUPPORT_BUILD) ? 1 : 0; GetConsoleMode(out, &mode); mode |= (ENABLE_PROCESSED_OUTPUT | ENABLE_VIRTUAL_TERMINAL_PROCESSING); if (SetConsoleMode(out, mode) == 0) @@ -8601,26 +8544,26 @@ vtp_flag_init(void) // VTP uses alternate screen buffer. // But, not if running in a nested terminal - use_alternate_screen_buffer = win10_22H2_or_later && p_rs && vtp_working - && !mch_getenv("VIM_TERMINAL"); + use_alternate_screen_buffer = win_version >= MAKE_VER(10, 0, 19045) + && p_rs && vtp_working && !mch_getenv("VIM_TERMINAL"); } #endif - if (ver >= CONPTY_FIRST_SUPPORT_BUILD) + if (win_version >= CONPTY_FIRST_SUPPORT_BUILD) conpty_working = 1; - if (ver >= CONPTY_STABLE_BUILD) + if (win_version >= CONPTY_STABLE_BUILD) conpty_stable = 1; - if (ver <= CONPTY_INSIDER_BUILD) + if (win_version <= CONPTY_INSIDER_BUILD) conpty_type = 3; - if (ver <= CONPTY_1909_BUILD) + if (win_version <= CONPTY_1909_BUILD) conpty_type = 2; - if (ver <= CONPTY_1903_BUILD) + if (win_version <= CONPTY_1903_BUILD) conpty_type = 2; - if (ver < CONPTY_FIRST_SUPPORT_BUILD) + if (win_version < CONPTY_FIRST_SUPPORT_BUILD) conpty_type = 1; - if (ver >= CONPTY_NEXT_UPDATE_BUILD) + if (win_version >= CONPTY_NEXT_UPDATE_BUILD) conpty_fix_type = 1; } diff --git a/src/os_win32.h b/src/os_win32.h index ae162dbf05..6eaa951e7a 100644 --- a/src/os_win32.h +++ b/src/os_win32.h @@ -224,3 +224,7 @@ Trace(char *pszFormat, ...); #endif #define mch_getenv(x) (char_u *)getenv((char *)(x)) #define vim_mkdir(x, y) mch_mkdir(x) + +// Windows Version +#define MAKE_VER(major, minor, build) \ + ((((major) & 0xFF) << 24) | (((minor) & 0xFF) << 16) | ((build) & 0x7FFF)) diff --git a/src/version.c b/src/version.c index 38e48f4a11..611c679443 100644 --- a/src/version.c +++ b/src/version.c @@ -734,6 +734,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 171, /**/ 170, /**/