Commit 029e0193c56e4e038c2494d6077a9fbd156d8581

Alex Szpakowski 2014-07-23T21:55:42

Fixed SDL_SetWindowFullscreen on iOS for the last time, hopefully. Fixed iOS version checking code.

diff --git a/src/video/uikit/SDL_uikitopengles.m b/src/video/uikit/SDL_uikitopengles.m
index aeb81e6..0b4a684 100644
--- a/src/video/uikit/SDL_uikitopengles.m
+++ b/src/video/uikit/SDL_uikitopengles.m
@@ -116,6 +116,7 @@ UIKit_GL_CreateContext(_THIS, SDL_Window * window)
     SDL_uikitopenglview *view;
     SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
     UIWindow *uiwindow = data->uiwindow;
+    CGRect frame = UIKit_ComputeViewFrame(window, uiwindow.screen);
     EAGLSharegroup *share_group = nil;
     CGFloat scale = 1.0;
 
@@ -124,7 +125,7 @@ UIKit_GL_CreateContext(_THIS, SDL_Window * window)
            dimensions of the OpenGL view will match the pixel dimensions of the
            screen rather than the dimensions in points.
          */
-        scale = [uiwindow screen].scale;
+        scale = uiwindow.screen.scale;
     }
 
     if (_this->gl_config.share_with_current_context) {
@@ -132,13 +133,6 @@ UIKit_GL_CreateContext(_THIS, SDL_Window * window)
         share_group = [view.context sharegroup];
     }
 
-    CGRect frame;
-    if (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) {
-        frame = [[uiwindow screen] bounds];
-    } else {
-        frame = [[uiwindow screen] applicationFrame];
-    }
-
     /* construct our view, passing in SDL's OpenGL configuration data */
     view = [[SDL_uikitopenglview alloc] initWithFrame: frame
                                                 scale: scale
@@ -175,7 +169,7 @@ UIKit_GL_CreateContext(_THIS, SDL_Window * window)
     }
 
     /* Make this window the current mouse focus for touch input */
-    if ([uiwindow screen] == [UIScreen mainScreen]) {
+    if (uiwindow.screen == [UIScreen mainScreen]) {
         SDL_SetMouseFocus(window);
         SDL_SetKeyboardFocus(window);
     }
diff --git a/src/video/uikit/SDL_uikitopenglview.m b/src/video/uikit/SDL_uikitopenglview.m
index 40127c0..7daa12f 100644
--- a/src/video/uikit/SDL_uikitopenglview.m
+++ b/src/video/uikit/SDL_uikitopenglview.m
@@ -26,6 +26,7 @@
 #include <OpenGLES/EAGLDrawable.h>
 #include "SDL_uikitopenglview.h"
 #include "SDL_uikitmessagebox.h"
+#include "SDL_uikitvideo.h"
 
 
 @implementation SDL_uikitopenglview {
@@ -89,8 +90,7 @@
             return nil;
         }
 
-        BOOL hasiOS7 = [[UIDevice currentDevice].systemVersion compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending;
-        if (sRGB && hasiOS7) {
+        if (sRGB && UIKit_IsSystemVersionAtLeast(@"7.0")) {
              /* sRGB EAGL drawable support was added in iOS 7 */
             colorFormat = kEAGLColorFormatSRGBA8;
         } else if (rBits >= 8 && gBits >= 8 && bBits >= 8) {
diff --git a/src/video/uikit/SDL_uikitvideo.h b/src/video/uikit/SDL_uikitvideo.h
index 819f93a..dec49cd 100644
--- a/src/video/uikit/SDL_uikitvideo.h
+++ b/src/video/uikit/SDL_uikitvideo.h
@@ -25,6 +25,8 @@
 
 #include "../SDL_sysvideo.h"
 
+BOOL UIKit_IsSystemVersionAtLeast(NSString *version);
+CGRect UIKit_ComputeViewFrame(SDL_Window *window, UIScreen *screen);
 
 #endif /* _SDL_uikitvideo_h */
 
diff --git a/src/video/uikit/SDL_uikitvideo.m b/src/video/uikit/SDL_uikitvideo.m
index e4266ea..01783b2 100644
--- a/src/video/uikit/SDL_uikitvideo.m
+++ b/src/video/uikit/SDL_uikitvideo.m
@@ -130,6 +130,26 @@ UIKit_VideoQuit(_THIS)
     UIKit_QuitModes(_this);
 }
 
+BOOL
+UIKit_IsSystemVersionAtLeast(NSString *version)
+{
+    NSString *sysversion = [UIDevice currentDevice].systemVersion;
+    return [sysversion compare:version options:NSNumericSearch] != NSOrderedAscending;
+}
+
+CGRect
+UIKit_ComputeViewFrame(SDL_Window *window, UIScreen *screen)
+{
+    BOOL hasiOS7 = UIKit_IsSystemVersionAtLeast(@"7.0");
+
+    if (hasiOS7 || (window->flags & (SDL_WINDOW_BORDERLESS|SDL_WINDOW_FULLSCREEN))) {
+        /* The view should always show behind the status bar in iOS 7+. */
+        return screen.bounds;
+    } else {
+        return screen.applicationFrame;
+    }
+}
+
 /*
  * iOS log support.
  *
diff --git a/src/video/uikit/SDL_uikitwindow.m b/src/video/uikit/SDL_uikitwindow.m
index b636ed7..02dafd6 100644
--- a/src/video/uikit/SDL_uikitwindow.m
+++ b/src/video/uikit/SDL_uikitwindow.m
@@ -62,16 +62,11 @@ static int SetupWindowData(_THIS, SDL_Window *window, UIWindow *uiwindow, SDL_bo
         window->x = 0;
         window->y = 0;
 
-        CGRect bounds;
-        if (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) {
-            bounds = [displaydata->uiscreen bounds];
-        } else {
-            bounds = [displaydata->uiscreen applicationFrame];
-        }
+        CGRect frame = UIKit_ComputeViewFrame(window, displaydata->uiscreen);
 
         /* Get frame dimensions */
-        int width = (int) bounds.size.width;
-        int height = (int) bounds.size.height;
+        int width = (int) frame.size.width;
+        int height = (int) frame.size.height;
 
         /* Make sure the width/height are oriented correctly */
         if (UIKit_IsDisplayLandscape(displaydata->uiscreen) != (width > height)) {
@@ -239,7 +234,7 @@ UIKit_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
     SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
     SDL_WindowData *windowdata = (SDL_WindowData *) window->driverdata;
     SDL_uikitviewcontroller *viewcontroller = windowdata->viewcontroller;
-    CGRect bounds;
+    CGRect frame;
 
     if (fullscreen || (window->flags & SDL_WINDOW_BORDERLESS)) {
         [UIApplication sharedApplication].statusBarHidden = YES;
@@ -252,20 +247,15 @@ UIKit_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
         [viewcontroller setNeedsStatusBarAppearanceUpdate];
     }
 
-    if (fullscreen || (window->flags & SDL_WINDOW_BORDERLESS)) {
-        bounds = [displaydata->uiscreen bounds];
-    } else {
-        bounds = [displaydata->uiscreen applicationFrame];
-    }
-
     /* Update the view's frame to account for the status bar change. */
-    windowdata->view.frame = bounds;
+    frame = UIKit_ComputeViewFrame(window, displaydata->uiscreen);
+    windowdata->view.frame = frame;
     [windowdata->view setNeedsLayout];
     [windowdata->view layoutIfNeeded];
 
     /* Get frame dimensions */
-    int width = (int) bounds.size.width;
-    int height = (int) bounds.size.height;
+    int width = (int) frame.size.width;
+    int height = (int) frame.size.height;
 
     /* We can pick either width or height here and we'll rotate the
        screen to match, so we pick the closest to what we wanted.