Fixed a crash on iOS when none of the orientations in Info.plist match the SDL window's actual orientation.

Fixes bug #2967.
This commit is contained in:
Alex Szpakowski 2015-05-05 16:16:10 -03:00
parent 74d83ead35
commit d603bb30e6
2 changed files with 28 additions and 11 deletions

View file

@ -1082,7 +1082,7 @@
29B97313FDCFA39411CA2CEA /* Project object */ = { 29B97313FDCFA39411CA2CEA /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastUpgradeCheck = 0420; LastUpgradeCheck = 0630;
}; };
buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SDL" */; buildConfigurationList = C01FCF4E08A954540054247B /* Build configuration list for PBXProject "SDL" */;
compatibilityVersion = "Xcode 3.2"; compatibilityVersion = "Xcode 3.2";
@ -1253,7 +1253,8 @@
GCC_OPTIMIZATION_LEVEL = 0; GCC_OPTIMIZATION_LEVEL = 0;
GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 3.1.3; IPHONEOS_DEPLOYMENT_TARGET = 5.1.1;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
}; };
@ -1265,7 +1266,7 @@
"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_SYMBOLS_PRIVATE_EXTERN = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 3.1.3; IPHONEOS_DEPLOYMENT_TARGET = 5.1.1;
SDKROOT = iphoneos; SDKROOT = iphoneos;
TARGETED_DEVICE_FAMILY = "1,2"; TARGETED_DEVICE_FAMILY = "1,2";
}; };
@ -1278,10 +1279,10 @@
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
COPY_PHASE_STRIP = NO; COPY_PHASE_STRIP = NO;
IPHONEOS_DEPLOYMENT_TARGET = 5.1.1;
GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES; GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES;
GCC_WARN_STRICT_SELECTOR_MATCH = YES; GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNDECLARED_SELECTOR = YES;
IPHONEOS_DEPLOYMENT_TARGET = 5.1.1;
PRODUCT_NAME = SDL2; PRODUCT_NAME = SDL2;
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
}; };
@ -1294,10 +1295,10 @@
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
COPY_PHASE_STRIP = YES; COPY_PHASE_STRIP = YES;
IPHONEOS_DEPLOYMENT_TARGET = 5.1.1;
GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES; GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES;
GCC_WARN_STRICT_SELECTOR_MATCH = YES; GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNDECLARED_SELECTOR = YES;
IPHONEOS_DEPLOYMENT_TARGET = 5.1.1;
PRODUCT_NAME = SDL2; PRODUCT_NAME = SDL2;
SKIP_INSTALL = YES; SKIP_INSTALL = YES;
}; };

View file

@ -191,13 +191,10 @@ UIKit_CreateWindow(_THIS, SDL_Window *window)
} }
if (data.uiscreen == [UIScreen mainScreen]) { if (data.uiscreen == [UIScreen mainScreen]) {
NSUInteger orientations = UIKit_GetSupportedOrientations(window);
UIApplication *app = [UIApplication sharedApplication];
if (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) { if (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) {
app.statusBarHidden = YES; [UIApplication sharedApplication].statusBarHidden = YES;
} else { } else {
app.statusBarHidden = NO; [UIApplication sharedApplication].statusBarHidden = NO;
} }
} }
@ -345,9 +342,21 @@ NSUInteger
UIKit_GetSupportedOrientations(SDL_Window * window) UIKit_GetSupportedOrientations(SDL_Window * window)
{ {
const char *hint = SDL_GetHint(SDL_HINT_ORIENTATIONS); const char *hint = SDL_GetHint(SDL_HINT_ORIENTATIONS);
NSUInteger validOrientations = UIInterfaceOrientationMaskAll;
NSUInteger orientationMask = 0; NSUInteger orientationMask = 0;
@autoreleasepool { @autoreleasepool {
SDL_WindowData *data = (__bridge SDL_WindowData *) window->driverdata;
UIApplication *app = [UIApplication sharedApplication];
/* Get all possible valid orientations. If the app delegate doesn't tell
* us, we get the orientations from Info.plist via UIApplication. */
if ([app.delegate respondsToSelector:@selector(application:supportedInterfaceOrientationsForWindow:)]) {
validOrientations = [app.delegate application:app supportedInterfaceOrientationsForWindow:data.uiwindow];
} else if ([app respondsToSelector:@selector(supportedInterfaceOrientationsForWindow:)]) {
validOrientations = [app supportedInterfaceOrientationsForWindow:data.uiwindow];
}
if (hint != NULL) { if (hint != NULL) {
NSArray *orientations = [@(hint) componentsSeparatedByString:@" "]; NSArray *orientations = [@(hint) componentsSeparatedByString:@" "];
@ -379,10 +388,17 @@ UIKit_GetSupportedOrientations(SDL_Window * window)
} }
} }
/* Don't allow upside-down orientation on the phone, so answering calls is in the natural orientation */ /* Don't allow upside-down orientation on phones, so answering calls is in the natural orientation */
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) { if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
orientationMask &= ~UIInterfaceOrientationMaskPortraitUpsideDown; orientationMask &= ~UIInterfaceOrientationMaskPortraitUpsideDown;
} }
/* If none of the specified orientations are actually supported by the
* app, we'll revert to what the app supports. An exception would be
* thrown by the system otherwise. */
if ((validOrientations & orientationMask) == 0) {
orientationMask = validOrientations;
}
} }
return orientationMask; return orientationMask;