changeset 2385:a126b04b9996

iOS: dwcompat now builds on iOS as well... Fixes for running dwtest.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Tue, 23 Mar 2021 20:02:07 +0000
parents 32ebd33be56b
children 47b214db2465
files dwcompat.c dwcompat.h ios/dw.m
diffstat 3 files changed, 39 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/dwcompat.c	Sun Mar 21 22:48:28 2021 +0000
+++ b/dwcompat.c	Tue Mar 23 20:02:07 2021 +0000
@@ -12,8 +12,8 @@
 #include "dwcompat.h"
 #include "dw.h"
 
-#if defined(__UNIX__) || defined(__MAC__)
-#if defined(__FreeBSD__) || defined(__MAC__)
+#if defined(__UNIX__) || defined(__MAC__) || defined(__IOS__)
+#if defined(__FreeBSD__) || defined(__MAC__) || defined(__IOS__)
 #include <sys/param.h>
 #include <sys/ucred.h>
 #include <sys/mount.h>
@@ -30,7 +30,7 @@
 #include <time.h>
 #include <errno.h>
 
-#if defined(__UNIX__) || defined(__MAC__)
+#if defined(__UNIX__) || defined(__MAC__) || defined(__IOS__)
 void msleep(long period)
 {
 #ifdef __sun__
@@ -80,7 +80,7 @@
 }
 
 /* Get around getmntinfo() not being thread safe */
-#if defined(__FreeBSD__) || defined(__MAC__)
+#if defined(__FreeBSD__) || defined(__MAC__) || defined(__IOS__)
 int _getmntinfo_r(struct statfs **mntbufp, int flags)
 {
 	static HMTX mutex = 0;
@@ -127,7 +127,7 @@
 		return 0;
 
 	return (long double)((double)spc*(double)bps*(double)fc);
-#elif defined(__FreeBSD__) || defined(__MAC__)
+#elif defined(__FreeBSD__) || defined(__MAC__) || defined(__IOS__)
 	struct statfs *fsp = NULL;
 	int entries, index = 1;
 
@@ -233,7 +233,7 @@
 		return 0;
 
 	return (long double)((double)spc*(double)bps*(double)tc);
-#elif defined(__FreeBSD__) || defined(__MAC__)
+#elif defined(__FreeBSD__) || defined(__MAC__) || defined(__IOS__)
 	struct statfs *fsp = NULL;
 	int entries, index = 1;
 
@@ -332,7 +332,7 @@
 
 	if(GetVolumeInformation(buffer, volname, 100, &spc, &bps, &fc, NULL, 0) != 0)
 		return 1;
-#elif defined(__FreeBSD__) || defined(__MAC__)
+#elif defined(__FreeBSD__) || defined(__MAC__) || defined(__IOS__)
 	struct statfs *fsp = NULL;
 	int entries, index = 1;
 
@@ -402,8 +402,8 @@
 
 void API getfsname(int drive, char *buf, int len)
 {
-#if defined(__UNIX__) || defined(__MAC__) 
-#if defined(__FreeBSD__) || defined(__MAC__)
+#if defined(__UNIX__) || defined(__MAC__) || defined(__IOS__)
+#if defined(__FreeBSD__) || defined(__MAC__) || defined(__IOS__)
 	struct statfs *fsp = NULL;
 	int entries, index = 1;
 
--- a/dwcompat.h	Sun Mar 21 22:48:28 2021 +0000
+++ b/dwcompat.h	Tue Mar 23 20:02:07 2021 +0000
@@ -4,8 +4,10 @@
 #define _DWCOMPAT_H
 
 /* This header includes and defines everything needed for a given OS/compiler */
-#if defined(__UNIX__) || defined(__MAC__)
+#if defined(__UNIX__) || defined(__MAC__) || defined(__IOS__)
+#ifndef __IOS__
 #include "dwconfig.h"
+#endif
 
 /* Attempt to include 64 bit file functions on various unix flavors */
 #ifndef _FILE_OFFSET_BITS
--- a/ios/dw.m	Sun Mar 21 22:48:28 2021 +0000
+++ b/ios/dw.m	Tue Mar 23 20:02:07 2021 +0000
@@ -580,7 +580,15 @@
 } DWBitBlt;
 
 /* Subclass for a test object type */
-@interface DWObject : NSObject {}
+@interface DWObject : NSObject
+{
+    /* A normally hidden window, at the top of the view hierarchy.
+     * Since iOS messageboxes and such require a view controller,
+     * we show this hidden window when necessary and use it during
+     * the creation of alerts and dialog boxes that don't have one.
+     */
+    UIWindow *hiddenWindow;
+}
 -(void)uselessThread:(id)sender;
 -(void)menuHandler:(id)param;
 -(void)doBitBlt:(id)param;
@@ -839,6 +847,14 @@
 @end
 
 @implementation DWObject
+-(id)init
+{
+    hiddenWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
+    [hiddenWindow setBackgroundColor:[UIColor clearColor]];
+    [hiddenWindow setWindowLevel:UIWindowLevelAlert];
+    [hiddenWindow setHidden:YES];
+    return [super init];
+}
 -(void)uselessThread:(id)sender { /* Thread only to initialize threading */ }
 -(void)menuHandler:(id)param
 {
@@ -867,7 +883,12 @@
         action = [UIAlertAction actionWithTitle:[params objectAtIndex:5] style:UIAlertActionStyleDefault
                                         handler:^(UIAlertAction * action) { iResponse = 3; }];
 
-    [alert presentViewController:alert animated:YES completion:nil];
+    /* Unhide our hidden window and make it key */
+    [hiddenWindow setHidden:NO];
+    [hiddenWindow makeKeyAndVisible];
+    [[hiddenWindow rootViewController] presentViewController:alert animated:YES completion:nil];
+    /* Once the dialog is gone we can rehide our window */
+    [hiddenWindow setHidden:YES];
     [alert release];
     [params addObject:[NSNumber numberWithInteger:iResponse]];
 }
@@ -7275,6 +7296,9 @@
 {
     DW_FUNCTION_INIT;
     DWWindow *window = [[DWWindow alloc] init];
+    DWView *view = [[DWView alloc] init];
+
+    [window addSubview:view];
 
     /* TODO: Handle style flags */
     if(@available(iOS 13.0, *)) {
@@ -7396,7 +7420,7 @@
     }
     if([object isMemberOfClass:[DWButton class]])
     {
-        [object setTextColor:(fg ? fg : [UIColor labelColor])];
+       [[object titleLabel] setTextColor:(fg ? fg : [UIColor labelColor])];
     }
     if([object isKindOfClass:[UITextField class]] || [object isKindOfClass:[UIButton class]])
     {