123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242 |
- /*
- 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 "../src/SDL_internal.h"
- #if SDL_VIDEO_DRIVER_UIKIT
- #include "../src/video/SDL_sysvideo.h"
- #include "SDL_assert.h"
- #include "SDL_hints.h"
- #include "SDL_system.h"
- #include "SDL_main.h"
- #import "SDLPal_AppDelegate.h"
- #import "../src/video/uikit/SDL_uikitmodes.h"
- #import "../src/video/uikit/SDL_uikitwindow.h"
- #include "../src/events/SDL_events_c.h"
- #ifdef main
- #undef main
- #endif
- #include "palcfg.h"
- 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, SDLPalAppDelegate will handle most things from here */
- @autoreleasepool {
- UIApplicationMain(argc, argv, nil, [SDLPalAppDelegate 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;
- }
- @implementation SDLPalAppDelegate
- /* 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 @"SDLPalAppDelegate";
- }
- - (void)postFinishLaunch
- {
- /* 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);
- /* 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); */
- [self restart];
- }
- #undef SDL_IPHONE_LAUNCHSCREEN
- - (void)launchGame {
- SDL_SetMainReady();
- [self performSelector:@selector(postFinishLaunch) withObject:nil afterDelay:0.0];
- [self.window setBackgroundColor:[UIColor blackColor]];
- }
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- [self restart];
- return YES;
- }
- - (void)restart {
- PAL_LoadConfig(YES);
- if( gConfig.fLaunchSetting ) {
- self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
- UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Settings" bundle:nil];
- UIViewController *vc = [sb instantiateInitialViewController];
- self.window.rootViewController = vc;
- [self.window makeKeyAndVisible];
- }else{
- [self launchGame];
- }
- }
- - (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: */
|