changeset 2456:54f760a257f3

iOS: initial support for iOS Dark Mode... untested. Part 2. Ugh in my haste to commit this, I was in the wrong Terminal window and instead committed a typo fix in the Mac code in that last commit.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 13 Apr 2021 20:01:36 +0000
parents 0315ae3a8820
children 181e48c5dc0c
files ios/dw.m
diffstat 1 files changed, 59 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/ios/dw.m	Tue Apr 13 19:44:09 2021 +0000
+++ b/ios/dw.m	Tue Apr 13 20:01:36 2021 +0000
@@ -237,6 +237,7 @@
 static int DWOSMajor, DWOSMinor, DWOSBuild;
 static char _dw_bundle_path[PATH_MAX+1] = { 0 };
 static char _dw_app_id[_DW_APP_ID_SIZE+1]= {0};
+static int _dw_dark_mode_state = DW_FEATURE_UNSUPPORTED;
 
 /* Create a default colors for a thread */
 void _dw_init_colors(void)
@@ -629,6 +630,7 @@
 -(void)menuHandler:(id)param;
 -(void)doBitBlt:(id)param;
 -(void)doFlush:(id)param;
+-(UIWindow *)hiddenWindow;
 @end
 
 API_AVAILABLE(ios(13.0))
@@ -1015,7 +1017,11 @@
     [hiddenWindow setWindowLevel:UIWindowLevelAlert+1];
     [hiddenWindow setHidden:YES];
     [hiddenWindow setRootViewController:[UIViewController new]];
-}
+    /* Handle setting the dark mode state now that DWObj is valid */
+    if(_dw_dark_mode_state != DW_FEATURE_UNSUPPORTED)
+        dw_feature_set(DW_FEATURE_DARK_MODE, _dw_dark_mode_state);
+}
+-(UIWindow *)hiddenWindow { return hiddenWindow; };
 -(void)uselessThread:(id)sender { /* Thread only to initialize threading */ }
 -(void)menuHandler:(id)param
 {
@@ -1231,6 +1237,14 @@
 
 DWObject *DWObj;
 
+/* Returns TRUE if iOS 12+ is in Dark Mode */
+BOOL _dw_is_dark(void)
+{
+    if([[[[DWObj hiddenWindow] rootViewController] traitCollection] userInterfaceStyle] == UIUserInterfaceStyleDark)
+        return YES;
+    return NO;
+}
+
 @interface DWWebView : WKWebView <WKNavigationDelegate>
 {
     void *userdata;
@@ -2000,7 +2014,10 @@
 {
     /* Update any system colors based on the Dark Mode */
     _DW_COLOR_ROW_EVEN = DW_RGB_TRANSPARENT;
-    _DW_COLOR_ROW_ODD = DW_RGB(230, 230, 230);
+    if(_dw_is_dark())
+        _DW_COLOR_ROW_ODD = DW_RGB(100, 100, 100);
+    else
+        _DW_COLOR_ROW_ODD = DW_RGB(230, 230, 230);
     /* Only refresh if we've been setup already */
     if(titles)
         [self refreshColors];
@@ -7804,6 +7821,7 @@
     DW_FUNCTION_INIT;
     DWWindow *window = [[DWWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
     DWView *view = [[DWView alloc] init];
+    UIUserInterfaceStyle style = [[DWObj hiddenWindow] overrideUserInterfaceStyle];
 
     [window setWindowLevel:UIWindowLevelNormal];
     [window setRootViewController:[[DWViewController alloc] init]];
@@ -7814,6 +7832,9 @@
     if(@available(iOS 13.0, *)) {
         [window setLargeContentTitle:[NSString stringWithUTF8String:title]];
     }
+    /* Copy the overrideUserInterfaceStyle property from the hiddenWindow */
+    if(style != UIUserInterfaceStyleUnspecified)
+        [window setOverrideUserInterfaceStyle:style];
     DW_FUNCTION_RETURN_THIS(window);
 }
 
@@ -10602,6 +10623,24 @@
         case DW_FEATURE_MLE_WORD_WRAP:
         case DW_FEATURE_UTF8_UNICODE:
             return DW_FEATURE_ENABLED;
+        case DW_FEATURE_DARK_MODE:
+        {
+            if(DWObj)
+            {
+                UIUserInterfaceStyle style = [[DWObj hiddenWindow] overrideUserInterfaceStyle];
+                
+                switch(style)
+                {
+                    case UIUserInterfaceStyleLight:
+                        return DW_FEATURE_DISABLED;
+                    case UIUserInterfaceStyleDark:
+                        return DW_DARK_MODE_FORCED;
+                    default: /* UIUserInterfaceStyleUnspecified */
+                        return DW_FEATURE_ENABLED;
+                }
+            }
+            return _dw_dark_mode_state;
+        }
         default:
             return DW_FEATURE_UNSUPPORTED;
     }
@@ -10633,6 +10672,24 @@
         case DW_FEATURE_MLE_WORD_WRAP:
         case DW_FEATURE_UTF8_UNICODE:
             return DW_ERROR_GENERAL;
+        case DW_FEATURE_DARK_MODE:
+        {
+            /* Make sure DWObj is initialized */
+            if(DWObj)
+            {
+                /* Disabled forces the non-dark aqua theme */
+                if(state == DW_FEATURE_DISABLED)
+                    [[DWObj hiddenWindow] setOverrideUserInterfaceStyle:UIUserInterfaceStyleLight];
+                /* Enabled lets the OS decide the mode */
+                else if(state == DW_FEATURE_ENABLED || state == DW_DARK_MODE_FULL)
+                    [[DWObj hiddenWindow] setOverrideUserInterfaceStyle:UIUserInterfaceStyleUnspecified];
+                /* 2 forces dark mode aqua appearance */
+                else if(state == DW_DARK_MODE_FORCED)
+                    [[DWObj hiddenWindow] setOverrideUserInterfaceStyle:UIUserInterfaceStyleDark];
+            }
+            else /* Save the requested state for dw_init() */
+                _dw_dark_mode_state = state;
+        }
         default:
             return DW_FEATURE_UNSUPPORTED;
     }