diff options
Diffstat (limited to '3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.m')
-rw-r--r-- | 3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.m | 535 |
1 files changed, 0 insertions, 535 deletions
diff --git a/3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.m b/3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.m deleted file mode 100644 index c94c78a4168..00000000000 --- a/3rdparty/SDL2/src/video/uikit/SDL_uikitappdelegate.m +++ /dev/null @@ -1,535 +0,0 @@ -/* - Simple DirectMedia Layer - Copyright (C) 1997-2016 Sam Lantinga <slouken@libsdl.org> - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ -#include "../../SDL_internal.h" - -#if SDL_VIDEO_DRIVER_UIKIT - -#include "../SDL_sysvideo.h" -#include "SDL_assert.h" -#include "SDL_hints.h" -#include "SDL_system.h" -#include "SDL_main.h" - -#import "SDL_uikitappdelegate.h" -#import "SDL_uikitmodes.h" -#import "SDL_uikitwindow.h" - -#include "../../events/SDL_events_c.h" - -#ifdef main -#undef main -#endif - -static int forward_argc; -static char **forward_argv; -static int exit_status; - -int main(int argc, char **argv) -{ - int i; - - /* store arguments */ - forward_argc = argc; - forward_argv = (char **)malloc((argc+1) * sizeof(char *)); - for (i = 0; i < argc; i++) { - forward_argv[i] = malloc( (strlen(argv[i])+1) * sizeof(char)); - strcpy(forward_argv[i], argv[i]); - } - forward_argv[i] = NULL; - - /* Give over control to run loop, SDLUIKitDelegate will handle most things from here */ - @autoreleasepool { - UIApplicationMain(argc, argv, nil, [SDLUIKitDelegate getAppDelegateClassName]); - } - - /* free the memory we used to hold copies of argc and argv */ - for (i = 0; i < forward_argc; i++) { - free(forward_argv[i]); - } - free(forward_argv); - - return exit_status; -} - -static void -SDL_IdleTimerDisabledChanged(void *userdata, const char *name, const char *oldValue, const char *hint) -{ - BOOL disable = (hint && *hint != '0'); - [UIApplication sharedApplication].idleTimerDisabled = disable; -} - -#if !TARGET_OS_TV -/* Load a launch image using the old UILaunchImageFile-era naming rules. */ -static UIImage * -SDL_LoadLaunchImageNamed(NSString *name, int screenh) -{ - UIInterfaceOrientation curorient = [UIApplication sharedApplication].statusBarOrientation; - UIUserInterfaceIdiom idiom = [UIDevice currentDevice].userInterfaceIdiom; - UIImage *image = nil; - - if (idiom == UIUserInterfaceIdiomPhone && screenh == 568) { - /* The image name for the iPhone 5 uses its height as a suffix. */ - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-568h", name]]; - } else if (idiom == UIUserInterfaceIdiomPad) { - /* iPad apps can launch in any orientation. */ - if (UIInterfaceOrientationIsLandscape(curorient)) { - if (curorient == UIInterfaceOrientationLandscapeLeft) { - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-LandscapeLeft", name]]; - } else { - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-LandscapeRight", name]]; - } - if (!image) { - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-Landscape", name]]; - } - } else { - if (curorient == UIInterfaceOrientationPortraitUpsideDown) { - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-PortraitUpsideDown", name]]; - } - if (!image) { - image = [UIImage imageNamed:[NSString stringWithFormat:@"%@-Portrait", name]]; - } - } - } - - if (!image) { - image = [UIImage imageNamed:name]; - } - - return image; -} -#endif /* !TARGET_OS_TV */ - -@interface SDLLaunchScreenController () - -#if !TARGET_OS_TV -- (NSUInteger)supportedInterfaceOrientations; -#endif - -@end - -@implementation SDLLaunchScreenController - -- (instancetype)init -{ - return [self initWithNibName:nil bundle:[NSBundle mainBundle]]; -} - -- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - if (!(self = [super initWithNibName:nil bundle:nil])) { - return nil; - } - - NSString *screenname = nibNameOrNil; - NSBundle *bundle = nibBundleOrNil; - BOOL atleastiOS8 = UIKit_IsSystemVersionAtLeast(8.0); - - /* Launch screens were added in iOS 8. Otherwise we use launch images. */ - if (screenname && atleastiOS8) { - @try { - self.view = [bundle loadNibNamed:screenname owner:self options:nil][0]; - } - @catch (NSException *exception) { - /* If a launch screen name is specified but it fails to load, iOS - * displays a blank screen rather than falling back to an image. */ - return nil; - } - } - - if (!self.view) { - NSArray *launchimages = [bundle objectForInfoDictionaryKey:@"UILaunchImages"]; - NSString *imagename = nil; - UIImage *image = nil; - - int screenw = (int)([UIScreen mainScreen].bounds.size.width + 0.5); - int screenh = (int)([UIScreen mainScreen].bounds.size.height + 0.5); - -#if !TARGET_OS_TV - UIInterfaceOrientation curorient = [UIApplication sharedApplication].statusBarOrientation; - - /* We always want portrait-oriented size, to match UILaunchImageSize. */ - if (screenw > screenh) { - int width = screenw; - screenw = screenh; - screenh = width; - } -#endif - - /* Xcode 5 introduced a dictionary of launch images in Info.plist. */ - if (launchimages) { - for (NSDictionary *dict in launchimages) { - NSString *minversion = dict[@"UILaunchImageMinimumOSVersion"]; - NSString *sizestring = dict[@"UILaunchImageSize"]; - - /* Ignore this image if the current version is too low. */ - if (minversion && !UIKit_IsSystemVersionAtLeast(minversion.doubleValue)) { - continue; - } - - /* Ignore this image if the size doesn't match. */ - if (sizestring) { - CGSize size = CGSizeFromString(sizestring); - if ((int)(size.width + 0.5) != screenw || (int)(size.height + 0.5) != screenh) { - continue; - } - } - -#if !TARGET_OS_TV - UIInterfaceOrientationMask orientmask = UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown; - NSString *orientstring = dict[@"UILaunchImageOrientation"]; - - if (orientstring) { - if ([orientstring isEqualToString:@"PortraitUpsideDown"]) { - orientmask = UIInterfaceOrientationMaskPortraitUpsideDown; - } else if ([orientstring isEqualToString:@"Landscape"]) { - orientmask = UIInterfaceOrientationMaskLandscape; - } else if ([orientstring isEqualToString:@"LandscapeLeft"]) { - orientmask = UIInterfaceOrientationMaskLandscapeLeft; - } else if ([orientstring isEqualToString:@"LandscapeRight"]) { - orientmask = UIInterfaceOrientationMaskLandscapeRight; - } - } - - /* Ignore this image if the orientation doesn't match. */ - if ((orientmask & (1 << curorient)) == 0) { - continue; - } -#endif - - imagename = dict[@"UILaunchImageName"]; - } - - if (imagename) { - image = [UIImage imageNamed:imagename]; - } - } -#if !TARGET_OS_TV - else { - imagename = [bundle objectForInfoDictionaryKey:@"UILaunchImageFile"]; - - if (imagename) { - image = SDL_LoadLaunchImageNamed(imagename, screenh); - } - - if (!image) { - image = SDL_LoadLaunchImageNamed(@"Default", screenh); - } - } -#endif - - if (image) { - UIImageView *view = [[UIImageView alloc] initWithFrame:[UIScreen mainScreen].bounds]; - UIImageOrientation imageorient = UIImageOrientationUp; - -#if !TARGET_OS_TV - /* Bugs observed / workaround tested in iOS 8.3, 7.1, and 6.1. */ - if (UIInterfaceOrientationIsLandscape(curorient)) { - if (atleastiOS8 && image.size.width < image.size.height) { - /* On iOS 8, portrait launch images displayed in forced- - * landscape mode (e.g. a standard Default.png on an iPhone - * when Info.plist only supports landscape orientations) need - * to be rotated to display in the expected orientation. */ - if (curorient == UIInterfaceOrientationLandscapeLeft) { - imageorient = UIImageOrientationRight; - } else if (curorient == UIInterfaceOrientationLandscapeRight) { - imageorient = UIImageOrientationLeft; - } - } else if (!atleastiOS8 && image.size.width > image.size.height) { - /* On iOS 7 and below, landscape launch images displayed in - * landscape mode (e.g. landscape iPad launch images) need - * to be rotated to display in the expected orientation. */ - if (curorient == UIInterfaceOrientationLandscapeLeft) { - imageorient = UIImageOrientationLeft; - } else if (curorient == UIInterfaceOrientationLandscapeRight) { - imageorient = UIImageOrientationRight; - } - } - } -#endif - - /* Create the properly oriented image. */ - view.image = [[UIImage alloc] initWithCGImage:image.CGImage scale:image.scale orientation:imageorient]; - - self.view = view; - } - } - - return self; -} - -- (void)loadView -{ - /* Do nothing. */ -} - -#if !TARGET_OS_TV -- (BOOL)shouldAutorotate -{ - /* If YES, the launch image will be incorrectly rotated in some cases. */ - return NO; -} - -- (NSUInteger)supportedInterfaceOrientations -{ - /* We keep the supported orientations unrestricted to avoid the case where - * there are no common orientations between the ones set in Info.plist and - * the ones set here (it will cause an exception in that case.) */ - return UIInterfaceOrientationMaskAll; -} -#endif /* !TARGET_OS_TV */ - -@end - -@implementation SDLUIKitDelegate { - UIWindow *launchWindow; -} - -/* convenience method */ -+ (id)sharedAppDelegate -{ - /* the delegate is set in UIApplicationMain(), which is guaranteed to be - * called before this method */ - return [UIApplication sharedApplication].delegate; -} - -+ (NSString *)getAppDelegateClassName -{ - /* subclassing notice: when you subclass this appdelegate, make sure to add - * a category to override this method and return the actual name of the - * delegate */ - return @"SDLUIKitDelegate"; -} - -- (void)hideLaunchScreen -{ - UIWindow *window = launchWindow; - - if (!window || window.hidden) { - return; - } - - launchWindow = nil; - - /* Do a nice animated fade-out (roughly matches the real launch behavior.) */ - [UIView animateWithDuration:0.2 animations:^{ - window.alpha = 0.0; - } completion:^(BOOL finished) { - window.hidden = YES; - }]; -} - -- (void)postFinishLaunch -{ - /* Hide the launch screen the next time the run loop is run. SDL apps will - * have a chance to load resources while the launch screen is still up. */ - [self performSelector:@selector(hideLaunchScreen) withObject:nil afterDelay:0.0]; - - /* run the user's application, passing argc and argv */ - SDL_iPhoneSetEventPump(SDL_TRUE); - exit_status = SDL_main(forward_argc, forward_argv); - SDL_iPhoneSetEventPump(SDL_FALSE); - - if (launchWindow) { - launchWindow.hidden = YES; - launchWindow = nil; - } - - /* exit, passing the return status from the user's application */ - /* We don't actually exit to support applications that do setup in their - * main function and then allow the Cocoa event loop to run. */ - /* exit(exit_status); */ -} - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - NSBundle *bundle = [NSBundle mainBundle]; - -#if SDL_IPHONE_LAUNCHSCREEN - /* The normal launch screen is displayed until didFinishLaunching returns, - * but SDL_main is called after that happens and there may be a noticeable - * delay between the start of SDL_main and when the first real frame is - * displayed (e.g. if resources are loaded before SDL_GL_SwapWindow is - * called), so we show the launch screen programmatically until the first - * time events are pumped. */ - UIViewController *vc = nil; - NSString *screenname = nil; - - /* tvOS only uses a plain launch image. */ -#if !TARGET_OS_TV - screenname = [bundle objectForInfoDictionaryKey:@"UILaunchStoryboardName"]; - - if (screenname && UIKit_IsSystemVersionAtLeast(8.0)) { - @try { - /* The launch storyboard is actually a nib in some older versions of - * Xcode. We'll try to load it as a storyboard first, as it's more - * modern. */ - UIStoryboard *storyboard = [UIStoryboard storyboardWithName:screenname bundle:bundle]; - vc = [storyboard instantiateInitialViewController]; - } - @catch (NSException *exception) { - /* Do nothing (there's more code to execute below). */ - } - } -#endif - - if (vc == nil) { - vc = [[SDLLaunchScreenController alloc] initWithNibName:screenname bundle:bundle]; - } - - if (vc.view) { - launchWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; - - /* We don't want the launch window immediately hidden when a real SDL - * window is shown - we fade it out ourselves when we're ready. */ - launchWindow.windowLevel = UIWindowLevelNormal + 1.0; - - /* Show the window but don't make it key. Events should always go to - * other windows when possible. */ - launchWindow.hidden = NO; - - launchWindow.rootViewController = vc; - } -#endif - - /* Set working directory to resource path */ - [[NSFileManager defaultManager] changeCurrentDirectoryPath:[bundle resourcePath]]; - - /* register a callback for the idletimer hint */ - SDL_AddHintCallback(SDL_HINT_IDLE_TIMER_DISABLED, - SDL_IdleTimerDisabledChanged, NULL); - - SDL_SetMainReady(); - [self performSelector:@selector(postFinishLaunch) withObject:nil afterDelay:0.0]; - - return YES; -} - -- (void)applicationWillTerminate:(UIApplication *)application -{ - SDL_SendAppEvent(SDL_APP_TERMINATING); -} - -- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application -{ - SDL_SendAppEvent(SDL_APP_LOWMEMORY); -} - -#if !TARGET_OS_TV -- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation -{ - BOOL isLandscape = UIInterfaceOrientationIsLandscape(application.statusBarOrientation); - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - - if (_this && _this->num_displays > 0) { - SDL_DisplayMode *desktopmode = &_this->displays[0].desktop_mode; - SDL_DisplayMode *currentmode = &_this->displays[0].current_mode; - - /* The desktop display mode should be kept in sync with the screen - * orientation so that updating a window's fullscreen state to - * SDL_WINDOW_FULLSCREEN_DESKTOP keeps the window dimensions in the - * correct orientation. */ - if (isLandscape != (desktopmode->w > desktopmode->h)) { - int height = desktopmode->w; - desktopmode->w = desktopmode->h; - desktopmode->h = height; - } - - /* Same deal with the current mode + SDL_GetCurrentDisplayMode. */ - if (isLandscape != (currentmode->w > currentmode->h)) { - int height = currentmode->w; - currentmode->w = currentmode->h; - currentmode->h = height; - } - } -} -#endif - -- (void)applicationWillResignActive:(UIApplication*)application -{ - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - if (_this) { - SDL_Window *window; - for (window = _this->windows; window != nil; window = window->next) { - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0); - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MINIMIZED, 0, 0); - } - } - SDL_SendAppEvent(SDL_APP_WILLENTERBACKGROUND); -} - -- (void)applicationDidEnterBackground:(UIApplication*)application -{ - SDL_SendAppEvent(SDL_APP_DIDENTERBACKGROUND); -} - -- (void)applicationWillEnterForeground:(UIApplication*)application -{ - SDL_SendAppEvent(SDL_APP_WILLENTERFOREGROUND); -} - -- (void)applicationDidBecomeActive:(UIApplication*)application -{ - SDL_SendAppEvent(SDL_APP_DIDENTERFOREGROUND); - - SDL_VideoDevice *_this = SDL_GetVideoDevice(); - if (_this) { - SDL_Window *window; - for (window = _this->windows; window != nil; window = window->next) { - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_FOCUS_GAINED, 0, 0); - SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESTORED, 0, 0); - } - } -} - -- (void)sendDropFileForURL:(NSURL *)url -{ - NSURL *fileURL = url.filePathURL; - if (fileURL != nil) { - SDL_SendDropFile(NULL, fileURL.path.UTF8String); - } else { - SDL_SendDropFile(NULL, url.absoluteString.UTF8String); - } - SDL_SendDropComplete(NULL); -} - -#if TARGET_OS_TV -/* TODO: Use this on iOS 9+ as well? */ -- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options -{ - /* TODO: Handle options */ - [self sendDropFileForURL:url]; - return YES; -} -#endif /* TARGET_OS_TV */ - -#if !TARGET_OS_TV -- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation -{ - [self sendDropFileForURL:url]; - return YES; -} -#endif /* !TARGET_OS_TV */ - -@end - -#endif /* SDL_VIDEO_DRIVER_UIKIT */ - -/* vi: set ts=4 sw=4 expandtab: */ |