changeset 2048:2d06f48e9d12

Win: Imported some changes from the dark mode example app I've been following. I was hoping to find some new APIs that would improve the dark mode implementation... These updates utilize new APIs for setting the dark titlebar, but does not seem to improve the dark mode appearance at all.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sat, 30 Nov 2019 10:43:55 +0000
parents 709c205efc4d
children 2bf8a22f515e
files win/dw.c
diffstat 1 files changed, 52 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/win/dw.c	Mon Nov 25 12:17:26 2019 +0000
+++ b/win/dw.c	Sat Nov 30 10:43:55 2019 +0000
@@ -703,6 +703,45 @@
    _Max
 } _PreferredAppMode;
 
+typedef enum _WINDOWCOMPOSITIONATTRIB
+{
+   WCA_UNDEFINED = 0,
+   WCA_NCRENDERING_ENABLED = 1,
+   WCA_NCRENDERING_POLICY = 2,
+   WCA_TRANSITIONS_FORCEDISABLED = 3,
+   WCA_ALLOW_NCPAINT = 4,
+   WCA_CAPTION_BUTTON_BOUNDS = 5,
+   WCA_NONCLIENT_RTL_LAYOUT = 6,
+   WCA_FORCE_ICONIC_REPRESENTATION = 7,
+   WCA_EXTENDED_FRAME_BOUNDS = 8,
+   WCA_HAS_ICONIC_BITMAP = 9,
+   WCA_THEME_ATTRIBUTES = 10,
+   WCA_NCRENDERING_EXILED = 11,
+   WCA_NCADORNMENTINFO = 12,
+   WCA_EXCLUDED_FROM_LIVEPREVIEW = 13,
+   WCA_VIDEO_OVERLAY_ACTIVE = 14,
+   WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15,
+   WCA_DISALLOW_PEEK = 16,
+   WCA_CLOAK = 17,
+   WCA_CLOAKED = 18,
+   WCA_ACCENT_POLICY = 19,
+   WCA_FREEZE_REPRESENTATION = 20,
+   WCA_EVER_UNCLOAKED = 21,
+   WCA_VISUAL_OWNER = 22,
+   WCA_HOLOGRAPHIC = 23,
+   WCA_EXCLUDED_FROM_DDA = 24,
+   WCA_PASSIVEUPDATEMODE = 25,
+   WCA_USEDARKMODECOLORS = 26,
+   WCA_LAST = 27
+} _WINDOWCOMPOSITIONATTRIB;
+
+typedef struct _WINDOWCOMPOSITIONATTRIBDATA
+{
+   _WINDOWCOMPOSITIONATTRIB Attrib;
+   PVOID pvData;
+   SIZE_T cbData;
+} _WINDOWCOMPOSITIONATTRIBDATA;
+
 HTHEME (WINAPI * _OpenNcThemeData)(HWND, LPCWSTR) = NULL; 
 VOID (WINAPI * _RefreshImmersiveColorPolicyState)(VOID) = NULL; 
 BOOL (WINAPI * _GetIsImmersiveColorUsingHighContrast)(IMMERSIVE_HC_CACHE_MODE) = NULL; 
@@ -712,6 +751,7 @@
 _PreferredAppMode (WINAPI * _SetPreferredAppMode)(_PreferredAppMode) = NULL; 
 BOOL (WINAPI * _IsDarkModeAllowedForWindow)(HWND) = NULL; 
 BOOL (WINAPI * _ShouldSystemUseDarkMode)(VOID) = NULL; 
+BOOL (WINAPI* _SetWindowCompositionAttribute)(HWND, _WINDOWCOMPOSITIONATTRIBDATA *) = NULL;
 
 BOOL IsHighContrast(VOID)
 {
@@ -733,16 +773,18 @@
          _GetIsImmersiveColorUsingHighContrast = (BOOL (WINAPI *)(IMMERSIVE_HC_CACHE_MODE))GetProcAddress(huxtheme, MAKEINTRESOURCEA(106));
          _ShouldAppsUseDarkMode = (BOOL (WINAPI *)(VOID))GetProcAddress(huxtheme, MAKEINTRESOURCEA(132));
          _AllowDarkModeForWindow = (BOOL (WINAPI *)(HWND, BOOL))GetProcAddress(huxtheme, MAKEINTRESOURCEA(133));
-         if(HIWORD(dwVersion) < 18334)
+         if(HIWORD(dwVersion) < 18362)
             _AllowDarkModeForApp = (BOOL (WINAPI *)(BOOL))GetProcAddress(huxtheme, MAKEINTRESOURCEA(135));
          else
             _SetPreferredAppMode = (_PreferredAppMode (WINAPI *)(_PreferredAppMode))GetProcAddress(huxtheme, MAKEINTRESOURCEA(135));
          _IsDarkModeAllowedForWindow = (BOOL (WINAPI *)(HWND))GetProcAddress(huxtheme, MAKEINTRESOURCEA(137));
          _ShouldSystemUseDarkMode = (BOOL (WINAPI *)(VOID))GetProcAddress(huxtheme, MAKEINTRESOURCEA(138));
+         _SetWindowCompositionAttribute = (BOOL (WINAPI*)(HWND, _WINDOWCOMPOSITIONATTRIBDATA*))GetProcAddress(GetModuleHandle(TEXT("user32.dll")), "SetWindowCompositionAttribute");
       }
       /* Make sure we were able to load all the Dark Mode functions */
       if(_OpenNcThemeData && _RefreshImmersiveColorPolicyState && _ShouldAppsUseDarkMode && _AllowDarkModeForWindow &&
-         (_AllowDarkModeForApp || _SetPreferredAppMode) && _IsDarkModeAllowedForWindow && _DwmSetWindowAttribute)
+         (_AllowDarkModeForApp || _SetPreferredAppMode) && _IsDarkModeAllowedForWindow && 
+         (_DwmSetWindowAttribute || _SetWindowCompositionAttribute))
       {
          _DW_DARK_MODE_SUPPORTED = TRUE;
          if(_AllowDarkModeForApp)
@@ -818,7 +860,14 @@
    BOOL dark = FALSE;
    if (_IsDarkModeAllowedForWindow(window) && _ShouldAppsUseDarkMode() && !IsHighContrast())
       dark = TRUE;
-   _DwmSetWindowAttribute(window, 19, &dark, sizeof(dark));
+   if(HIWORD(dwVersion) < 18362)
+      SetProp(window, TEXT("UseImmersiveDarkModeColors"), (HANDLE)dark);
+   else if (_SetWindowCompositionAttribute)
+   {
+      _WINDOWCOMPOSITIONATTRIBDATA data = { WCA_USEDARKMODECOLORS, &dark, sizeof(dark) };
+      _SetWindowCompositionAttribute(window, &data);
+   } else
+      _DwmSetWindowAttribute(window, 19, &dark, sizeof(dark));
 }
 
 /* Call this on a window to apply the style */