See |gui-w32-title-bar| for details.
*'go-d'*
'd' Use dark theme variant if available. Currently only works for
- GTK+ GUI.
+ Win32 and GTK+ GUI.
*'go-e'*
'e' Add tab pages when indicated with 'showtabline'.
'guitablabel' can be used to change the text in the labels.
-*todo.txt* For Vim version 9.1. Last change: 2025 Nov 18
+*todo.txt* For Vim version 9.1. Last change: 2025 Dec 09
VIM REFERENCE MANUAL by Bram Moolenaar
GUI Scroll test fails on FreeBSD when using Motif. See FIXME in
Test_scrollbars in src/test_gui.vim
-Support dark mode for MS-Windows: #12282
-
Remote command escapes single quote with backslash, should be doubling the
single quote in vim_strsave_escaped_ext() #12202.
/*
* GUI dark theme variant
*/
-#if defined(FEAT_GUI_GTK) && defined(USE_GTK3)
+#if (defined(FEAT_GUI_GTK) && defined(USE_GTK3)) || defined(FEAT_GUI_MSWIN)
# define FEAT_GUI_DARKTHEME
#endif
gui_init_which_components(char_u *oldval UNUSED)
{
#ifdef FEAT_GUI_DARKTHEME
- static int prev_dark_theme = -1;
+ static int prev_dark_theme = FALSE;
int using_dark_theme = FALSE;
#endif
#ifdef FEAT_MENU
# define SPI_SETWHEELSCROLLCHARS 0x006D
#endif
+#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
+# define DWMWA_USE_IMMERSIVE_DARK_MODE 20
+#endif
+
#ifndef DWMWA_CAPTION_COLOR
# define DWMWA_CAPTION_COLOR 35
#endif
static HRESULT (WINAPI *pDwmSetWindowAttribute)(HWND, DWORD, LPCVOID, DWORD);
static void dyn_dwm_load(void);
+#ifdef FEAT_GUI_DARKTHEME
+
+static HINSTANCE hUxThemeLib = NULL;
+static DWORD (WINAPI *pSetPreferredAppMode)(DWORD) = NULL;
+static void (WINAPI *pFlushMenuThemes)(void) = NULL;
+static void dyn_uxtheme_load(void);
+#endif
+
static int WINAPI
stubGetSystemMetricsForDpi(int nIndex, UINT dpi UNUSED)
{
#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)
+ pDwmSetWindowAttribute(s_hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, &dark,
+ sizeof(dark));
+
+ if (pSetPreferredAppMode != NULL)
+ pSetPreferredAppMode(dark);
+
+ if (pFlushMenuThemes != NULL)
+ pFlushMenuThemes();
+}
+
+ static void
+dyn_uxtheme_load(void)
+{
+ hUxThemeLib = vimLoadLib("uxtheme.dll");
+ if (hUxThemeLib == NULL)
+ return;
+
+ pSetPreferredAppMode = (DWORD (WINAPI *)(DWORD))
+ GetProcAddress(hUxThemeLib, MAKEINTRESOURCE(135));
+ pFlushMenuThemes = (void (WINAPI *)(void))
+ GetProcAddress(hUxThemeLib, MAKEINTRESOURCE(136));
+
+ if (pSetPreferredAppMode == NULL || pFlushMenuThemes == NULL)
+ {
+ FreeLibrary(hUxThemeLib);
+ hUxThemeLib = NULL;
+ return;
+ }
+}
+
+#endif // FEAT_GUI_DARKTHEME
+
/*
* ":simalt" command.
*/
load_dpi_func();
+#ifdef FEAT_GUI_DARKTHEME
+ dyn_uxtheme_load();
+#endif
+
dyn_dwm_load();
s_dpi = pGetDpiForSystem();
static WCHAR *exe_pathw = NULL;
static BOOL win8_or_later = FALSE;
-static BOOL win10_22H2_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)
int gui_mch_showing_tabline(void);
void gui_mch_update_tabline(void);
void gui_mch_set_curtab(int nr);
+void gui_mch_set_dark_theme(int dark);
void ex_simalt(exarg_T *eap);
void gui_mch_find_dialog(exarg_T *eap);
void gui_mch_replace_dialog(exarg_T *eap);
exec 'sleep' . duration
call assert_equal('egmrLtT', &guioptions)
+ set guioptions+=d
+ exec 'sleep' . duration
+ call assert_equal('egmrLtTd', &guioptions)
+ set guioptions-=d
+ exec 'sleep' . duration
+ call assert_equal('egmrLtT', &guioptions)
+
else
" Default Value
set guioptions&
static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1966,
/**/
1965,
/**/