@@ -315,6 +315,10 @@ gui_mch_set_rendering_options(char_u *s)
315315# define SPI_SETWHEELSCROLLCHARS 0x006D
316316#endif
317317
318+ #ifndef DWMWA_USE_IMMERSIVE_DARK_MODE
319+ # define DWMWA_USE_IMMERSIVE_DARK_MODE 20
320+ #endif
321+
318322#ifndef DWMWA_CAPTION_COLOR
319323# define DWMWA_CAPTION_COLOR 35
320324#endif
@@ -417,6 +421,14 @@ static HINSTANCE hLibDwm = NULL;
417421static HRESULT (WINAPI * pDwmSetWindowAttribute )(HWND , DWORD , LPCVOID , DWORD );
418422static void dyn_dwm_load (void );
419423
424+ #ifdef FEAT_GUI_DARKTHEME
425+
426+ static HINSTANCE hUxThemeLib = NULL ;
427+ static DWORD (WINAPI * pSetPreferredAppMode )(DWORD ) = NULL ;
428+ static void (WINAPI * pFlushMenuThemes )(void ) = NULL ;
429+ static void dyn_uxtheme_load (void );
430+ #endif
431+
420432 static int WINAPI
421433stubGetSystemMetricsForDpi (int nIndex , UINT dpi UNUSED )
422434{
@@ -3116,6 +3128,48 @@ gui_mch_set_curtab(int nr)
31163128
31173129#endif
31183130
3131+ #ifdef FEAT_GUI_DARKTHEME
3132+ extern BOOL win10_22H2_or_later ; // this is in os_win32.c
3133+
3134+ void
3135+ gui_mch_set_dark_theme (int dark )
3136+ {
3137+ if (!win10_22H2_or_later )
3138+ return ;
3139+
3140+ if (pDwmSetWindowAttribute != NULL )
3141+ pDwmSetWindowAttribute (s_hwnd , DWMWA_USE_IMMERSIVE_DARK_MODE , & dark ,
3142+ sizeof (dark ));
3143+
3144+ if (pSetPreferredAppMode != NULL )
3145+ pSetPreferredAppMode (dark );
3146+
3147+ if (pFlushMenuThemes != NULL )
3148+ pFlushMenuThemes ();
3149+ }
3150+
3151+ static void
3152+ dyn_uxtheme_load (void )
3153+ {
3154+ hUxThemeLib = vimLoadLib ("uxtheme.dll" );
3155+ if (hUxThemeLib == NULL )
3156+ return ;
3157+
3158+ pSetPreferredAppMode = (DWORD (WINAPI * )(DWORD ))
3159+ GetProcAddress (hUxThemeLib , MAKEINTRESOURCE (135 ));
3160+ pFlushMenuThemes = (void (WINAPI * )(void ))
3161+ GetProcAddress (hUxThemeLib , MAKEINTRESOURCE (136 ));
3162+
3163+ if (pSetPreferredAppMode == NULL || pFlushMenuThemes == NULL )
3164+ {
3165+ FreeLibrary (hUxThemeLib );
3166+ hUxThemeLib = NULL ;
3167+ return ;
3168+ }
3169+ }
3170+
3171+ #endif // FEAT_GUI_DARKTHEME
3172+
31193173/*
31203174 * ":simalt" command.
31213175 */
@@ -5646,6 +5700,10 @@ gui_mch_init(void)
56465700
56475701 load_dpi_func ();
56485702
5703+ #ifdef FEAT_GUI_DARKTHEME
5704+ dyn_uxtheme_load ();
5705+ #endif
5706+
56495707 dyn_dwm_load ();
56505708
56515709 s_dpi = pGetDpiForSystem ();
0 commit comments