diff --git a/runtime/doc/gui_w32.txt b/runtime/doc/gui_w32.txt index 6c0af5079f..026f3a74dc 100644 --- a/runtime/doc/gui_w32.txt +++ b/runtime/doc/gui_w32.txt @@ -1,4 +1,4 @@ -*gui_w32.txt* For Vim version 9.1. Last change: 2025 Aug 06 +*gui_w32.txt* For Vim version 9.1. Last change: 2025 Sep 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -488,4 +488,12 @@ VIM_KEYCODE_TRANS_STRATEGY can be set to the desired value ("experimental" or set VIM_KEYCODE_TRANS_STRATEGY=experimental gvim.exe < + +Title Bar's Behaviour *gui-w32-title-bar-behaviour* + +The color of the gVim title bar (sometimes also called the caption bar) is +treated as part of the application's background. Starting with Windows 11, +it follows the background color defined by |hl-Normal|, so it matches the +background of the current colorscheme. + vim:tw=78:sw=4:ts=8:noet:ft=help:norl: diff --git a/runtime/doc/tags b/runtime/doc/tags index c59f848d56..cb14b75fdc 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -8223,6 +8223,7 @@ gui-w32-cmdargs gui_w32.txt /*gui-w32-cmdargs* gui-w32-dialogs gui_w32.txt /*gui-w32-dialogs* gui-w32-printing gui_w32.txt /*gui-w32-printing* gui-w32-start gui_w32.txt /*gui-w32-start* +gui-w32-title-bar-behaviour gui_w32.txt /*gui-w32-title-bar-behaviour* gui-w32-various gui_w32.txt /*gui-w32-various* gui-w32-windowid gui_w32.txt /*gui-w32-windowid* gui-w32s os_win32.txt /*gui-w32s* diff --git a/runtime/doc/version9.txt b/runtime/doc/version9.txt index 4ad3eb2a4a..910a036141 100644 --- a/runtime/doc/version9.txt +++ b/runtime/doc/version9.txt @@ -1,4 +1,4 @@ -*version9.txt* For Vim version 9.1. Last change: 2025 Sep 28 +*version9.txt* For Vim version 9.1. Last change: 2025 Sep 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -41748,6 +41748,8 @@ Plugins~ Platform specific ~ - MS-Winodws: Paths like "\Windows" and "/Windows" are now considered to be absolute paths (to the current drive) and no longer relative. +- MS-Windows: The title bar background follows the |hl-Normal| highlighting + group background color. - macOS: increase default scheduler priority to TASK_DEFAULT_APPLICATION. Others: ~ diff --git a/src/gui_w32.c b/src/gui_w32.c index 1ee4ab1677..19dcfe24f4 100644 --- a/src/gui_w32.c +++ b/src/gui_w32.c @@ -318,6 +318,14 @@ gui_mch_set_rendering_options(char_u *s) # define SPI_SETWHEELSCROLLCHARS 0x006D #endif +#ifndef DWMWA_CAPTION_COLOR +# define DWMWA_CAPTION_COLOR 35 +#endif + +#ifndef DWMWA_TEXT_COLOR +# define DWMWA_TEXT_COLOR 36 +#endif + #ifdef PROTO /* * Define a few things for generating prototypes. This is just to avoid @@ -468,6 +476,9 @@ static int (WINAPI *pGetSystemMetricsForDpi)(int, UINT) = NULL; static DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT dpiContext) = NULL; static DPI_AWARENESS (WINAPI *pGetAwarenessFromDpiAwarenessContext)(DPI_AWARENESS_CONTEXT) = NULL; +// Sets the value of Desktop Window Manager (DWM) non-client rendering attributes for a window. +static HRESULT (WINAPI *pDwmSetWindowAttribute)(HWND, DWORD, LPCVOID, DWORD) = NULL; + static int WINAPI stubGetSystemMetricsForDpi(int nIndex, UINT dpi UNUSED) { @@ -1591,6 +1602,20 @@ _TextAreaWndProc( } } + static void +load_dwm_func(void) +{ + static HMODULE hLibDwm = NULL; + hLibDwm = vimLoadLib("dwmapi.dll"); + if (hLibDwm == NULL) + return; + + pDwmSetWindowAttribute = (HRESULT (WINAPI *)(HWND, DWORD, LPCVOID, DWORD)) + GetProcAddress(hLibDwm, "DwmSetWindowAttribute"); +} + +extern BOOL win11_or_later; // this is in os_win32.c + /* * Called when the foreground or background color has been changed. */ @@ -1604,6 +1629,21 @@ gui_mch_new_colors(void) s_hwnd, GCLP_HBRBACKGROUND, (LONG_PTR)s_brush); InvalidateRect(s_hwnd, NULL, TRUE); DeleteObject(prevBrush); + + // Set The Caption Bar + + if (pDwmSetWindowAttribute == NULL) + return; + + if (win11_or_later) + { + const COLORREF captionColor = gui.back_pixel; + pDwmSetWindowAttribute(s_hwnd, DWMWA_CAPTION_COLOR, + &captionColor, sizeof(captionColor)); + const COLORREF textColor = gui.norm_pixel; + pDwmSetWindowAttribute(s_hwnd, DWMWA_TEXT_COLOR, + &textColor, sizeof(textColor)); + } } /* @@ -5636,6 +5676,8 @@ gui_mch_init(void) load_dpi_func(); + load_dwm_func(); + s_dpi = pGetDpiForSystem(); update_scrollbar_size(); diff --git a/src/os_win32.c b/src/os_win32.c index 3873a2b37f..06387c3f96 100644 --- a/src/os_win32.c +++ b/src/os_win32.c @@ -222,8 +222,10 @@ static int suppress_winsize = 1; // don't fiddle with console static WCHAR *exe_pathw = NULL; -static BOOL win8_or_later = FALSE; -static BOOL win10_22H2_or_later = FALSE; +BOOL win8_or_later = FALSE; +BOOL win10_22H2_or_later = FALSE; +BOOL win11_or_later = FALSE; + #if !defined(FEAT_GUI_MSWIN) || defined(VIMDLL) static BOOL use_alternate_screen_buffer = FALSE; #endif @@ -1010,6 +1012,10 @@ PlatformId(void) || 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. if (!win32_enable_privilege(SE_SECURITY_NAME)) diff --git a/src/version.c b/src/version.c index d989f097a5..3cc88a1064 100644 --- a/src/version.c +++ b/src/version.c @@ -729,6 +729,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1813, /**/ 1812, /**/