Fixed SDL_SetWindowFullscreen on iOS for the last time, hopefully. Fixed iOS version checking code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
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.