comparison win/dw.c @ 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 53523298c7c7
comparison
equal deleted inserted replaced
2047:709c205efc4d 2048:2d06f48e9d12
701 _ForceDark, 701 _ForceDark,
702 _ForceLight, 702 _ForceLight,
703 _Max 703 _Max
704 } _PreferredAppMode; 704 } _PreferredAppMode;
705 705
706 typedef enum _WINDOWCOMPOSITIONATTRIB
707 {
708 WCA_UNDEFINED = 0,
709 WCA_NCRENDERING_ENABLED = 1,
710 WCA_NCRENDERING_POLICY = 2,
711 WCA_TRANSITIONS_FORCEDISABLED = 3,
712 WCA_ALLOW_NCPAINT = 4,
713 WCA_CAPTION_BUTTON_BOUNDS = 5,
714 WCA_NONCLIENT_RTL_LAYOUT = 6,
715 WCA_FORCE_ICONIC_REPRESENTATION = 7,
716 WCA_EXTENDED_FRAME_BOUNDS = 8,
717 WCA_HAS_ICONIC_BITMAP = 9,
718 WCA_THEME_ATTRIBUTES = 10,
719 WCA_NCRENDERING_EXILED = 11,
720 WCA_NCADORNMENTINFO = 12,
721 WCA_EXCLUDED_FROM_LIVEPREVIEW = 13,
722 WCA_VIDEO_OVERLAY_ACTIVE = 14,
723 WCA_FORCE_ACTIVEWINDOW_APPEARANCE = 15,
724 WCA_DISALLOW_PEEK = 16,
725 WCA_CLOAK = 17,
726 WCA_CLOAKED = 18,
727 WCA_ACCENT_POLICY = 19,
728 WCA_FREEZE_REPRESENTATION = 20,
729 WCA_EVER_UNCLOAKED = 21,
730 WCA_VISUAL_OWNER = 22,
731 WCA_HOLOGRAPHIC = 23,
732 WCA_EXCLUDED_FROM_DDA = 24,
733 WCA_PASSIVEUPDATEMODE = 25,
734 WCA_USEDARKMODECOLORS = 26,
735 WCA_LAST = 27
736 } _WINDOWCOMPOSITIONATTRIB;
737
738 typedef struct _WINDOWCOMPOSITIONATTRIBDATA
739 {
740 _WINDOWCOMPOSITIONATTRIB Attrib;
741 PVOID pvData;
742 SIZE_T cbData;
743 } _WINDOWCOMPOSITIONATTRIBDATA;
744
706 HTHEME (WINAPI * _OpenNcThemeData)(HWND, LPCWSTR) = NULL; 745 HTHEME (WINAPI * _OpenNcThemeData)(HWND, LPCWSTR) = NULL;
707 VOID (WINAPI * _RefreshImmersiveColorPolicyState)(VOID) = NULL; 746 VOID (WINAPI * _RefreshImmersiveColorPolicyState)(VOID) = NULL;
708 BOOL (WINAPI * _GetIsImmersiveColorUsingHighContrast)(IMMERSIVE_HC_CACHE_MODE) = NULL; 747 BOOL (WINAPI * _GetIsImmersiveColorUsingHighContrast)(IMMERSIVE_HC_CACHE_MODE) = NULL;
709 BOOL (WINAPI * _ShouldAppsUseDarkMode)(VOID) = NULL; 748 BOOL (WINAPI * _ShouldAppsUseDarkMode)(VOID) = NULL;
710 BOOL (WINAPI * _AllowDarkModeForWindow)(HWND, BOOL) = NULL; 749 BOOL (WINAPI * _AllowDarkModeForWindow)(HWND, BOOL) = NULL;
711 BOOL (WINAPI * _AllowDarkModeForApp)(BOOL) = NULL; 750 BOOL (WINAPI * _AllowDarkModeForApp)(BOOL) = NULL;
712 _PreferredAppMode (WINAPI * _SetPreferredAppMode)(_PreferredAppMode) = NULL; 751 _PreferredAppMode (WINAPI * _SetPreferredAppMode)(_PreferredAppMode) = NULL;
713 BOOL (WINAPI * _IsDarkModeAllowedForWindow)(HWND) = NULL; 752 BOOL (WINAPI * _IsDarkModeAllowedForWindow)(HWND) = NULL;
714 BOOL (WINAPI * _ShouldSystemUseDarkMode)(VOID) = NULL; 753 BOOL (WINAPI * _ShouldSystemUseDarkMode)(VOID) = NULL;
754 BOOL (WINAPI* _SetWindowCompositionAttribute)(HWND, _WINDOWCOMPOSITIONATTRIBDATA *) = NULL;
715 755
716 BOOL IsHighContrast(VOID) 756 BOOL IsHighContrast(VOID)
717 { 757 {
718 HIGHCONTRASTW highContrast = { sizeof(highContrast) }; 758 HIGHCONTRASTW highContrast = { sizeof(highContrast) };
719 if(SystemParametersInfoW(SPI_GETHIGHCONTRAST, sizeof(highContrast), &highContrast, FALSE)) 759 if(SystemParametersInfoW(SPI_GETHIGHCONTRAST, sizeof(highContrast), &highContrast, FALSE))
731 _OpenNcThemeData = (HTHEME (WINAPI *)(HWND, LPCWSTR))GetProcAddress(huxtheme, MAKEINTRESOURCEA(49)); 771 _OpenNcThemeData = (HTHEME (WINAPI *)(HWND, LPCWSTR))GetProcAddress(huxtheme, MAKEINTRESOURCEA(49));
732 _RefreshImmersiveColorPolicyState = (VOID (WINAPI *)(VOID))GetProcAddress(huxtheme, MAKEINTRESOURCEA(104)); 772 _RefreshImmersiveColorPolicyState = (VOID (WINAPI *)(VOID))GetProcAddress(huxtheme, MAKEINTRESOURCEA(104));
733 _GetIsImmersiveColorUsingHighContrast = (BOOL (WINAPI *)(IMMERSIVE_HC_CACHE_MODE))GetProcAddress(huxtheme, MAKEINTRESOURCEA(106)); 773 _GetIsImmersiveColorUsingHighContrast = (BOOL (WINAPI *)(IMMERSIVE_HC_CACHE_MODE))GetProcAddress(huxtheme, MAKEINTRESOURCEA(106));
734 _ShouldAppsUseDarkMode = (BOOL (WINAPI *)(VOID))GetProcAddress(huxtheme, MAKEINTRESOURCEA(132)); 774 _ShouldAppsUseDarkMode = (BOOL (WINAPI *)(VOID))GetProcAddress(huxtheme, MAKEINTRESOURCEA(132));
735 _AllowDarkModeForWindow = (BOOL (WINAPI *)(HWND, BOOL))GetProcAddress(huxtheme, MAKEINTRESOURCEA(133)); 775 _AllowDarkModeForWindow = (BOOL (WINAPI *)(HWND, BOOL))GetProcAddress(huxtheme, MAKEINTRESOURCEA(133));
736 if(HIWORD(dwVersion) < 18334) 776 if(HIWORD(dwVersion) < 18362)
737 _AllowDarkModeForApp = (BOOL (WINAPI *)(BOOL))GetProcAddress(huxtheme, MAKEINTRESOURCEA(135)); 777 _AllowDarkModeForApp = (BOOL (WINAPI *)(BOOL))GetProcAddress(huxtheme, MAKEINTRESOURCEA(135));
738 else 778 else
739 _SetPreferredAppMode = (_PreferredAppMode (WINAPI *)(_PreferredAppMode))GetProcAddress(huxtheme, MAKEINTRESOURCEA(135)); 779 _SetPreferredAppMode = (_PreferredAppMode (WINAPI *)(_PreferredAppMode))GetProcAddress(huxtheme, MAKEINTRESOURCEA(135));
740 _IsDarkModeAllowedForWindow = (BOOL (WINAPI *)(HWND))GetProcAddress(huxtheme, MAKEINTRESOURCEA(137)); 780 _IsDarkModeAllowedForWindow = (BOOL (WINAPI *)(HWND))GetProcAddress(huxtheme, MAKEINTRESOURCEA(137));
741 _ShouldSystemUseDarkMode = (BOOL (WINAPI *)(VOID))GetProcAddress(huxtheme, MAKEINTRESOURCEA(138)); 781 _ShouldSystemUseDarkMode = (BOOL (WINAPI *)(VOID))GetProcAddress(huxtheme, MAKEINTRESOURCEA(138));
782 _SetWindowCompositionAttribute = (BOOL (WINAPI*)(HWND, _WINDOWCOMPOSITIONATTRIBDATA*))GetProcAddress(GetModuleHandle(TEXT("user32.dll")), "SetWindowCompositionAttribute");
742 } 783 }
743 /* Make sure we were able to load all the Dark Mode functions */ 784 /* Make sure we were able to load all the Dark Mode functions */
744 if(_OpenNcThemeData && _RefreshImmersiveColorPolicyState && _ShouldAppsUseDarkMode && _AllowDarkModeForWindow && 785 if(_OpenNcThemeData && _RefreshImmersiveColorPolicyState && _ShouldAppsUseDarkMode && _AllowDarkModeForWindow &&
745 (_AllowDarkModeForApp || _SetPreferredAppMode) && _IsDarkModeAllowedForWindow && _DwmSetWindowAttribute) 786 (_AllowDarkModeForApp || _SetPreferredAppMode) && _IsDarkModeAllowedForWindow &&
787 (_DwmSetWindowAttribute || _SetWindowCompositionAttribute))
746 { 788 {
747 _DW_DARK_MODE_SUPPORTED = TRUE; 789 _DW_DARK_MODE_SUPPORTED = TRUE;
748 if(_AllowDarkModeForApp) 790 if(_AllowDarkModeForApp)
749 _AllowDarkModeForApp(TRUE); 791 _AllowDarkModeForApp(TRUE);
750 else 792 else
816 void RefreshTitleBarThemeColor(HWND window) 858 void RefreshTitleBarThemeColor(HWND window)
817 { 859 {
818 BOOL dark = FALSE; 860 BOOL dark = FALSE;
819 if (_IsDarkModeAllowedForWindow(window) && _ShouldAppsUseDarkMode() && !IsHighContrast()) 861 if (_IsDarkModeAllowedForWindow(window) && _ShouldAppsUseDarkMode() && !IsHighContrast())
820 dark = TRUE; 862 dark = TRUE;
821 _DwmSetWindowAttribute(window, 19, &dark, sizeof(dark)); 863 if(HIWORD(dwVersion) < 18362)
864 SetProp(window, TEXT("UseImmersiveDarkModeColors"), (HANDLE)dark);
865 else if (_SetWindowCompositionAttribute)
866 {
867 _WINDOWCOMPOSITIONATTRIBDATA data = { WCA_USEDARKMODECOLORS, &dark, sizeof(dark) };
868 _SetWindowCompositionAttribute(window, &data);
869 } else
870 _DwmSetWindowAttribute(window, 19, &dark, sizeof(dark));
822 } 871 }
823 872
824 /* Call this on a window to apply the style */ 873 /* Call this on a window to apply the style */
825 BOOL CALLBACK _dw_set_child_window_theme(HWND window, LPARAM lParam) 874 BOOL CALLBACK _dw_set_child_window_theme(HWND window, LPARAM lParam)
826 { 875 {