changeset 2099:296a3872ddd9

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
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 12 Jun 2020 20:40:47 +0000
parents 665d87a50eac
children 12a9546c3e03
files dwtest.c mac/dw.m win/dw.c
diffstat 3 files changed, 36 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- 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);
 
--- 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;
--- 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: