Fixed SDL_SetWindowFullscreen on iOS for the last time, hopefully. iOS-improvements
authorAlex Szpakowski <slime73@gmail.com>
Wed, 23 Jul 2014 21:55:42 -0300
branchiOS-improvements
changeset 9502 933ed557b7c1
parent 9501 574db299498f
child 9503 bff6f1fecc5d
Fixed SDL_SetWindowFullscreen on iOS for the last time, hopefully. Fixed iOS version checking code.
src/video/uikit/SDL_uikitopengles.m
src/video/uikit/SDL_uikitopenglview.m
src/video/uikit/SDL_uikitvideo.h
src/video/uikit/SDL_uikitvideo.m
src/video/uikit/SDL_uikitwindow.m
--- a/src/video/uikit/SDL_uikitopengles.m	Wed Jul 23 03:05:31 2014 -0300
+++ b/src/video/uikit/SDL_uikitopengles.m	Wed Jul 23 21:55:42 2014 -0300
@@ -116,6 +116,7 @@
     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 @@
            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 @@
         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 @@
     }
 
     /* 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);
     }
--- a/src/video/uikit/SDL_uikitopenglview.m	Wed Jul 23 03:05:31 2014 -0300
+++ b/src/video/uikit/SDL_uikitopenglview.m	Wed Jul 23 21:55:42 2014 -0300
@@ -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) {
--- a/src/video/uikit/SDL_uikitvideo.h	Wed Jul 23 03:05:31 2014 -0300
+++ b/src/video/uikit/SDL_uikitvideo.h	Wed Jul 23 21:55:42 2014 -0300
@@ -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 */
 
--- a/src/video/uikit/SDL_uikitvideo.m	Wed Jul 23 03:05:31 2014 -0300
+++ b/src/video/uikit/SDL_uikitvideo.m	Wed Jul 23 21:55:42 2014 -0300
@@ -130,6 +130,26 @@
     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.
  *
--- a/src/video/uikit/SDL_uikitwindow.m	Wed Jul 23 03:05:31 2014 -0300
+++ b/src/video/uikit/SDL_uikitwindow.m	Wed Jul 23 21:55:42 2014 -0300
@@ -62,16 +62,11 @@
         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 @@
     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 @@
         [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.