]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1813: MS-Windows: title bar is always white v9.1.1813
authorMao-Yining <mao.yining@outlook.com>
Mon, 29 Sep 2025 21:13:57 +0000 (21:13 +0000)
committerChristian Brabandt <cb@256bit.org>
Mon, 29 Sep 2025 21:19:34 +0000 (21:19 +0000)
Problem:  MS-Windows: title bar is always white
Solution: Set_caption() and set the title bars color to the
          Normal highlighting background (Mao-Yining)

The implement of 'guidarkmode' is a much longer task, so I would like to
complete this most needed feature.

This commit seen the caption bar as the extension of the background so
it is follow the option 'background' before Windows 11 and follow the
background color after Windows 11.

fixes: #3922
fixes: #18028
closes: #18282

Signed-off-by: Mao-Yining <mao.yining@outlook.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
runtime/doc/gui_w32.txt
runtime/doc/tags
runtime/doc/version9.txt
src/gui_w32.c
src/os_win32.c
src/version.c

index 6c0af5079f57911573c4b379c4b288c610f39a86..026f3a74dc63c8b52ec9d5bb047dee936fb344d9 100644 (file)
@@ -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:
index c59f848d563559b458a99482efe3016a2352dec1..cb14b75fdcd2a155469e87ca0082b62b82421d57 100644 (file)
@@ -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*
index 4ad3eb2a4a4486f0a47299729feb05132315a3f9..910a036141041bf5e4b328f4bb80cfd2feb337dd 100644 (file)
@@ -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: ~
index 1ee4ab167786eda96811be48e0b97ae9475b883c..19dcfe24f46ab27e8e697cd7fa2bdfef6b67aa14 100644 (file)
@@ -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();
 
index 3873a2b37f96a398e24c4d78f4657d6b73c024d1..06387c3f9665c3751173a59f76891fd9630a7c53 100644 (file)
@@ -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))
index d989f097a53966b48805f1826364954d45cc8a41..3cc88a10644753706c67446363ccea666f6b8d03 100644 (file)
@@ -729,6 +729,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1813,
 /**/
     1812,
 /**/