From 029e0193c56e4e038c2494d6077a9fbd156d8581 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Wed, 23 Jul 2014 21:55:42 -0300 Subject: [PATCH] Fixed SDL_SetWindowFullscreen on iOS for the last time, hopefully. Fixed iOS version checking code. --- src/video/uikit/SDL_uikitopengles.m | 12 +++--------- src/video/uikit/SDL_uikitopenglview.m | 4 ++-- src/video/uikit/SDL_uikitvideo.h | 2 ++ src/video/uikit/SDL_uikitvideo.m | 20 ++++++++++++++++++++ src/video/uikit/SDL_uikitwindow.m | 26 ++++++++------------------ 5 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/video/uikit/SDL_uikitopengles.m b/src/video/uikit/SDL_uikitopengles.m index aeb81e61df3e1..0b4a684edcdb3 100644 --- a/src/video/uikit/SDL_uikitopengles.m +++ b/src/video/uikit/SDL_uikitopengles.m @@ -116,6 +116,7 @@ void UIKit_GL_SwapWindow(_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 @@ void UIKit_GL_SwapWindow(_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 @@ void UIKit_GL_SwapWindow(_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 @@ void UIKit_GL_SwapWindow(_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 40127c0556f80..7daa12f65fe6a 100644 --- a/src/video/uikit/SDL_uikitopenglview.m +++ b/src/video/uikit/SDL_uikitopenglview.m @@ -26,6 +26,7 @@ #include #include "SDL_uikitopenglview.h" #include "SDL_uikitmessagebox.h" +#include "SDL_uikitvideo.h" @implementation SDL_uikitopenglview { @@ -89,8 +90,7 @@ - (id)initWithFrame:(CGRect)frame 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 819f93aff50c5..dec49cd287cd4 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 e4266ea2e7278..01783b248af34 100644 --- a/src/video/uikit/SDL_uikitvideo.m +++ b/src/video/uikit/SDL_uikitvideo.m @@ -130,6 +130,26 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device) 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 b636ed7da32d4..02dafd6d94ea7 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 @@ static int SetupWindowData(_THIS, SDL_Window *window, UIWindow *uiwindow, SDL_bo 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 @@ static int SetupWindowData(_THIS, SDL_Window *window, UIWindow *uiwindow, SDL_bo [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.