# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1591994447 0 # Node ID 296a3872ddd97ec474ba6764ce797f573680cc0c # Parent 665d87a50eacc4fa04e75fa39756bd0295490668 Added a fourth dark mode option on Windows: Disabled, Basic, Full, Forced. Disabled (0) forces dark mode off on Mac and Windows. Enabled (1) System decides but only window frame is dark mode on Windows. Full (2) System decides but everything that can be dark is on Mac and Windows. Forced (3) Force dark mode on Mac and Windows regardless of system setting. Enabled (1) and Full (2) are identical on Mac. Added code to enable full dark mode in the test program. Several widgets are not able to go dark on Windows currently: Notebook, Menubar diff -r 665d87a50eac -r 296a3872ddd9 dwtest.c --- a/dwtest.c Thu Jun 11 22:21:53 2020 +0000 +++ b/dwtest.c Fri Jun 12 20:40:47 2020 +0000 @@ -1794,6 +1794,9 @@ ULONG notebookpage9; DWFEATURE feat; + /* Enable full dark mode on platforms that support it */ + dw_feature_set(DW_FEATURE_DARK_MODE, 2); + /* Initialize the Dynamic Windows engine */ dw_init(TRUE, argc, argv); diff -r 665d87a50eac -r 296a3872ddd9 mac/dw.m --- a/mac/dw.m Thu Jun 11 22:21:53 2020 +0000 +++ b/mac/dw.m Fri Jun 12 20:40:47 2020 +0000 @@ -12683,10 +12683,10 @@ if(state == DW_FEATURE_DISABLED) [DWApp setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameAqua]]; /* Enabled lets the OS decide the mode */ - else if(state == DW_FEATURE_ENABLED) + else if(state == DW_FEATURE_ENABLED || state == 2) [DWApp setAppearance:nil]; /* 2 forces dark mode aqua appearance */ - else if(state == 2) + else if(state == 3) [DWApp setAppearance:[NSAppearance appearanceNamed:NSAppearanceNameDarkAqua]]; else return DW_ERROR_GENERAL; diff -r 665d87a50eac -r 296a3872ddd9 win/dw.c --- a/win/dw.c Thu Jun 11 22:21:53 2020 +0000 +++ b/win/dw.c Fri Jun 12 20:40:47 2020 +0000 @@ -693,6 +693,7 @@ /* Set _DW_DARK_MODE_ALLOWED to FALSE to disable dark mode. * Set _DW_DARK_MODE_ALLOWED to TRUE for basic dark mode. * Set _DW_DARK_MODE_ALLOWED to 2 for full dark mode. + * Set _DW_DARK_MODE_ALLOWED to 3 for forced full dark mode. */ int _DW_DARK_MODE_ALLOWED = TRUE; int _DW_DARK_MODE_SUPPORTED = FALSE; @@ -771,6 +772,14 @@ return FALSE; } +/* Our own ShouldAppsUseDarkMode() that handles the forced option */ +BOOL _DW_ShouldAppsUseDarkMode(void) +{ + if(_DW_DARK_MODE_ALLOWED == 3) + return TRUE; + return (_ShouldAppsUseDarkMode() && !IsHighContrast()); +} + void _dw_init_dark_mode(void) { if(_DW_DARK_MODE_ALLOWED && dwVersion && huxtheme) @@ -802,7 +811,7 @@ else _SetPreferredAppMode(_AllowDark); _RefreshImmersiveColorPolicyState(); - _DW_DARK_MODE_ENABLED = _ShouldAppsUseDarkMode() && !IsHighContrast(); + _DW_DARK_MODE_ENABLED = _DW_ShouldAppsUseDarkMode(); } } } @@ -822,7 +831,7 @@ else if(_tcsnicmp(tmpbuf, TOOLBARCLASSNAME, _tcslen(TOOLBARCLASSNAME)+1) == 0) { /* If we aren't in full dark mode */ - if(_DW_DARK_MODE_ALLOWED != 2) + if(_DW_DARK_MODE_ALLOWED < 2) { /* Enable or disable visual themes */ if(_SetWindowTheme) @@ -840,7 +849,7 @@ { if(_CanThemeWindow(window)) { - if(_DW_DARK_MODE_ALLOWED == 2) + if(_DW_DARK_MODE_ALLOWED > 1) { if(_DW_DARK_MODE_ENABLED) _SetWindowTheme(window, L"DarkMode_Explorer", NULL); @@ -868,7 +877,7 @@ void RefreshTitleBarThemeColor(HWND window) { BOOL dark = FALSE; - if (_IsDarkModeAllowedForWindow(window) && _ShouldAppsUseDarkMode() && !IsHighContrast()) + if (_IsDarkModeAllowedForWindow(window) && _DW_ShouldAppsUseDarkMode()) dark = TRUE; if(HIWORD(dwVersion) < 18362) SetProp(window, TEXT("UseImmersiveDarkModeColors"), (HANDLE)DW_INT_TO_POINTER(dark)); @@ -899,7 +908,7 @@ { DWORD retval = GetSysColor(nIndex); #ifdef AEROGLASS - if(_DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_ENABLED) + if(_DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_ENABLED) { const COLORREF darkBkColor = 0x383838; const COLORREF darkTextColor = 0xFFFFFF; @@ -925,7 +934,7 @@ #ifdef AEROGLASS static HBRUSH darkBkColorBrush = 0; - if(_DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_ENABLED) + if(_DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_ENABLED) { if(!darkBkColorBrush) darkBkColorBrush = CreateSolidBrush(0x383838); @@ -2500,7 +2509,7 @@ { if(_DW_DARK_MODE_SUPPORTED && IsColorSchemeChangeMessage(mp2)) { - _DW_DARK_MODE_ENABLED = _ShouldAppsUseDarkMode() && !IsHighContrast(); + _DW_DARK_MODE_ENABLED = _DW_ShouldAppsUseDarkMode(); RefreshTitleBarThemeColor(hWnd); _dw_set_child_window_theme(hWnd, 0); @@ -2710,7 +2719,7 @@ break; #ifdef AEROGLASS case WM_THEMECHANGED: - if(_DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_SUPPORTED) + if(_DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_SUPPORTED) { SetClassLongPtr(hWnd, GCLP_HBRBACKGROUND, (LONG_PTR)_DW_GetSysColorBrush(COLOR_3DFACE)); InvalidateRect(hWnd, NULL, TRUE); @@ -3165,7 +3174,7 @@ DW_BLUE_VALUE(fore))); } #ifdef AEROGLASS - else if(thiscinfo->fore == DW_CLR_DEFAULT && _DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_ENABLED) + else if(thiscinfo->fore == DW_CLR_DEFAULT && _DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_ENABLED) SetTextColor((HDC)mp1, _DW_GetSysColor(COLOR_WINDOWTEXT)); #endif /* Handle background */ @@ -3236,7 +3245,7 @@ case WM_CTLCOLORSCROLLBAR: case WM_CTLCOLORDLG: { - if(_DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_ENABLED) + if(_DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_ENABLED) { ColorInfo *parentcinfo = (ColorInfo *)GetWindowLongPtr(hWnd, GWLP_USERDATA); int thisback = thiscinfo ? thiscinfo->back : -1; @@ -3287,7 +3296,7 @@ break; #ifdef AEROGLASS case WM_THEMECHANGED: - if(_DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_SUPPORTED) + if(_DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_SUPPORTED) { if(!continfo || continfo->cinfo.back == -1 || continfo->cinfo.back == DW_CLR_DEFAULT) { @@ -3313,7 +3322,7 @@ if(continfo->odd == DW_CLR_DEFAULT) { #ifdef AEROGLASS - if(_DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_ENABLED) + if(_DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_ENABLED) odd = RGB(100,100,100); else #endif @@ -3500,7 +3509,7 @@ #ifdef AEROGLASS if(msg == WM_THEMECHANGED) { - if(_DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_SUPPORTED) + if(_DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_SUPPORTED) { ContainerInfo *continfo = (ContainerInfo *)GetWindowLongPtr(hWnd, GWLP_USERDATA); @@ -3672,7 +3681,7 @@ return FALSE; #ifdef AEROGLASS case WM_THEMECHANGED: - if(_DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_SUPPORTED) + if(_DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_SUPPORTED) InvalidateRect(hwnd, NULL, TRUE); break; #endif @@ -3784,7 +3793,7 @@ } #ifdef AEROGLASS case WM_THEMECHANGED: - if(_DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_SUPPORTED) + if(_DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_SUPPORTED) InvalidateRect(hwnd, NULL, TRUE); break; #endif @@ -3813,7 +3822,7 @@ */ if( #ifdef AEROGLASS - (_DW_DARK_MODE_ALLOWED == 2 && _DW_DARK_MODE_ENABLED) || + (_DW_DARK_MODE_ALLOWED > 1 && _DW_DARK_MODE_ENABLED) || #endif (cinfo && cinfo->fore != -1 && cinfo->fore != DW_CLR_DEFAULT && cinfo->back !=- -1 && cinfo->back != DW_CLR_DEFAULT)) @@ -13440,8 +13449,12 @@ #ifdef AEROGLASS case DW_FEATURE_DARK_MODE: { - _DW_DARK_MODE_ALLOWED = state; - return DW_ERROR_NONE; + if(state >= 0 && state <= 4) + { + _DW_DARK_MODE_ALLOWED = state; + return DW_ERROR_NONE; + } + return DW_ERROR_GENERAL; } #endif default: