@@ -20,25 +20,16 @@ use std::ffi::c_void;
2020
2121use crate :: window:: Theme ;
2222
23+ use super :: util;
24+
2325static HUXTHEME : Lazy < isize > =
2426 Lazy :: new ( || unsafe { LoadLibraryA ( s ! ( "uxtheme.dll" ) ) . unwrap_or_default ( ) . 0 as _ } ) ;
2527
26- static WIN10_BUILD_VERSION : Lazy < Option < u32 > > = Lazy :: new ( || {
27- let version = windows_version:: OsVersion :: current ( ) ;
28- if version. major == 10 && version. minor == 0 {
29- Some ( version. build )
30- } else {
31- None
32- }
33- } ) ;
34-
3528static DARK_MODE_SUPPORTED : Lazy < bool > = Lazy :: new ( || {
3629 // We won't try to do anything for windows versions < 17763
3730 // (Windows 10 October 2018 update)
38- match * WIN10_BUILD_VERSION {
39- Some ( v) => v >= 17763 ,
40- None => false ,
41- }
31+ let v = * util:: WIN_VERSION ;
32+ v. major == 10 && v. minor == 0 && v. build >= 17763
4233} ) ;
4334
4435pub fn allow_dark_mode_for_app ( is_dark_mode : bool ) {
@@ -79,19 +70,17 @@ pub fn allow_dark_mode_for_app(is_dark_mode: bool) {
7970 . map ( |handle| std:: mem:: transmute ( handle) )
8071 } ) ;
8172
82- if let Some ( ver) = * WIN10_BUILD_VERSION {
83- if ver < 18362 {
84- if let Some ( _allow_dark_mode_for_app) = * ALLOW_DARK_MODE_FOR_APP {
85- unsafe { _allow_dark_mode_for_app ( is_dark_mode) } ;
86- }
87- } else if let Some ( _set_preferred_app_mode) = * SET_PREFERRED_APP_MODE {
88- let mode = if is_dark_mode {
89- PreferredAppMode :: AllowDark
90- } else {
91- PreferredAppMode :: Default
92- } ;
93- unsafe { _set_preferred_app_mode ( mode) } ;
73+ if util:: WIN_VERSION . build < 18362 {
74+ if let Some ( _allow_dark_mode_for_app) = * ALLOW_DARK_MODE_FOR_APP {
75+ unsafe { _allow_dark_mode_for_app ( is_dark_mode) } ;
9476 }
77+ } else if let Some ( _set_preferred_app_mode) = * SET_PREFERRED_APP_MODE {
78+ let mode = if is_dark_mode {
79+ PreferredAppMode :: AllowDark
80+ } else {
81+ PreferredAppMode :: Default
82+ } ;
83+ unsafe { _set_preferred_app_mode ( mode) } ;
9584 }
9685
9786 refresh_immersive_color_policy_state ( ) ;
@@ -168,39 +157,37 @@ pub fn allow_dark_mode_for_window(hwnd: HWND, is_dark_mode: bool) {
168157}
169158
170159fn refresh_titlebar_theme_color ( hwnd : HWND , is_dark_mode : bool , redraw_title_bar : bool ) {
171- if let Some ( ver) = * WIN10_BUILD_VERSION {
172- if ver < 17763 {
173- let mut is_dark_mode_bigbool: i32 = is_dark_mode. into ( ) ;
174- unsafe {
175- let _ = SetPropW (
176- hwnd,
177- w ! ( "UseImmersiveDarkModeColors" ) ,
178- Some ( HANDLE ( & mut is_dark_mode_bigbool as * mut _ as _ ) ) ,
179- ) ;
180- }
160+ if util:: WIN_VERSION . build < 17763 {
161+ let mut is_dark_mode_bigbool: i32 = is_dark_mode. into ( ) ;
162+ unsafe {
163+ let _ = SetPropW (
164+ hwnd,
165+ w ! ( "UseImmersiveDarkModeColors" ) ,
166+ Some ( HANDLE ( & mut is_dark_mode_bigbool as * mut _ as _ ) ) ,
167+ ) ;
168+ }
169+ } else {
170+ // https://github.com/MicrosoftDocs/sdk-api/pull/966/files
171+ let dwmwa_use_immersive_dark_mode = if util:: WIN_VERSION . build > 18985 {
172+ DWMWINDOWATTRIBUTE ( 20 )
181173 } else {
182- // https://github.com/MicrosoftDocs/sdk-api/pull/966/files
183- let dwmwa_use_immersive_dark_mode = if ver > 18985 {
184- DWMWINDOWATTRIBUTE ( 20 )
185- } else {
186- DWMWINDOWATTRIBUTE ( 19 )
187- } ;
188- let dark_mode = BOOL :: from ( is_dark_mode) ;
189- unsafe {
190- let _ = DwmSetWindowAttribute (
191- hwnd,
192- dwmwa_use_immersive_dark_mode,
193- & dark_mode as * const BOOL as * const c_void ,
194- std:: mem:: size_of :: < BOOL > ( ) as u32 ,
195- ) ;
196- if redraw_title_bar {
197- if GetActiveWindow ( ) == hwnd {
198- DefWindowProcW ( hwnd, WM_NCACTIVATE , WPARAM :: default ( ) , LPARAM :: default ( ) ) ;
199- DefWindowProcW ( hwnd, WM_NCACTIVATE , WPARAM ( true . into ( ) ) , LPARAM :: default ( ) ) ;
200- } else {
201- DefWindowProcW ( hwnd, WM_NCACTIVATE , WPARAM ( true . into ( ) ) , LPARAM :: default ( ) ) ;
202- DefWindowProcW ( hwnd, WM_NCACTIVATE , WPARAM :: default ( ) , LPARAM :: default ( ) ) ;
203- }
174+ DWMWINDOWATTRIBUTE ( 19 )
175+ } ;
176+ let dark_mode = BOOL :: from ( is_dark_mode) ;
177+ unsafe {
178+ let _ = DwmSetWindowAttribute (
179+ hwnd,
180+ dwmwa_use_immersive_dark_mode,
181+ & dark_mode as * const BOOL as * const c_void ,
182+ std:: mem:: size_of :: < BOOL > ( ) as u32 ,
183+ ) ;
184+ if redraw_title_bar {
185+ if GetActiveWindow ( ) == hwnd {
186+ DefWindowProcW ( hwnd, WM_NCACTIVATE , WPARAM :: default ( ) , LPARAM :: default ( ) ) ;
187+ DefWindowProcW ( hwnd, WM_NCACTIVATE , WPARAM ( true . into ( ) ) , LPARAM :: default ( ) ) ;
188+ } else {
189+ DefWindowProcW ( hwnd, WM_NCACTIVATE , WPARAM ( true . into ( ) ) , LPARAM :: default ( ) ) ;
190+ DefWindowProcW ( hwnd, WM_NCACTIVATE , WPARAM :: default ( ) , LPARAM :: default ( ) ) ;
204191 }
205192 }
206193 }
0 commit comments