zenilib  0.5.3.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
SDL_uikitappdelegate.m
Go to the documentation of this file.
1 /*
2  Simple DirectMedia Layer
3  Copyright (C) 1997-2013 Sam Lantinga <slouken@libsdl.org>
4 
5  This software is provided 'as-is', without any express or implied
6  warranty. In no event will the authors be held liable for any damages
7  arising from the use of this software.
8 
9  Permission is granted to anyone to use this software for any purpose,
10  including commercial applications, and to alter it and redistribute it
11  freely, subject to the following restrictions:
12 
13  1. The origin of this software must not be misrepresented; you must not
14  claim that you wrote the original software. If you use this software
15  in a product, an acknowledgment in the product documentation would be
16  appreciated but is not required.
17  2. Altered source versions must be plainly marked as such, and must not be
18  misrepresented as being the original software.
19  3. This notice may not be removed or altered from any source distribution.
20 */
21 #include "SDL_config.h"
22 
23 #if SDL_VIDEO_DRIVER_UIKIT
24 
25 #include "../SDL_sysvideo.h"
26 #include "SDL_assert.h"
27 #include "SDL_hints.h"
28 #include "SDL_system.h"
29 #include "SDL_main.h"
30 
31 #include "SDL_uikitappdelegate.h"
32 #include "SDL_uikitmodes.h"
33 #include "../../events/SDL_events_c.h"
34 
35 #ifdef main
36 #undef main
37 #endif
38 
39 static int forward_argc;
40 static char **forward_argv;
41 static int exit_status;
42 static UIWindow *launch_window;
43 
44 int main(int argc, char **argv)
45 {
46  int i;
47  NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
48 
49  /* store arguments */
50  forward_argc = argc;
51  forward_argv = (char **)malloc((argc+1) * sizeof(char *));
52  for (i = 0; i < argc; i++) {
53  forward_argv[i] = malloc( (strlen(argv[i])+1) * sizeof(char));
54  strcpy(forward_argv[i], argv[i]);
55  }
56  forward_argv[i] = NULL;
57 
58  /* Give over control to run loop, SDLUIKitDelegate will handle most things from here */
59  UIApplicationMain(argc, argv, NULL, [SDLUIKitDelegate getAppDelegateClassName]);
60 
61  /* free the memory we used to hold copies of argc and argv */
62  for (i = 0; i < forward_argc; i++) {
63  free(forward_argv[i]);
64  }
65  free(forward_argv);
66 
67  [pool release];
68  return exit_status;
69 }
70 
71 static void
72 SDL_IdleTimerDisabledChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
73 {
74  BOOL disable = (hint && *hint != '0');
75  [UIApplication sharedApplication].idleTimerDisabled = disable;
76 }
77 
78 @interface SDL_splashviewcontroller : UIViewController {
79  UIImageView *splash;
80  UIImage *splashPortrait;
81  UIImage *splashLandscape;
82 }
83 
84 - (void)updateSplashImage:(UIInterfaceOrientation)interfaceOrientation;
85 @end
86 
87 @implementation SDL_splashviewcontroller
88 
89 - (id)init
90 {
91  self = [super init];
92  if (self == nil) {
93  return nil;
94  }
95 
96  self->splash = [[UIImageView alloc] init];
97  [self setView:self->splash];
98 
99  CGSize size = [UIScreen mainScreen].bounds.size;
100  float height = SDL_max(size.width, size.height);
101  self->splashPortrait = [UIImage imageNamed:[NSString stringWithFormat:@"Default-%dh.png", (int)height]];
102  if (!self->splashPortrait) {
103  self->splashPortrait = [UIImage imageNamed:@"Default.png"];
104  }
105  self->splashLandscape = [UIImage imageNamed:@"Default-Landscape.png"];
106  if (!self->splashLandscape && self->splashPortrait) {
107  self->splashLandscape = [[UIImage alloc] initWithCGImage: self->splashPortrait.CGImage
108  scale: 1.0
109  orientation: UIImageOrientationRight];
110  }
111  if (self->splashPortrait) {
112  [self->splashPortrait retain];
113  }
114  if (self->splashLandscape) {
115  [self->splashLandscape retain];
116  }
117 
118  [self updateSplashImage:[[UIApplication sharedApplication] statusBarOrientation]];
119 
120  return self;
121 }
122 
123 - (NSUInteger)supportedInterfaceOrientations
124 {
125  NSUInteger orientationMask = UIInterfaceOrientationMaskAll;
126 
127  /* Don't allow upside-down orientation on the phone, so answering calls is in the natural orientation */
128  if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
130  }
131  return orientationMask;
132 }
133 
134 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orient
135 {
136  NSUInteger orientationMask = [self supportedInterfaceOrientations];
137  return (orientationMask & (1 << orient));
138 }
139 
140 - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
141 {
142  [self updateSplashImage:interfaceOrientation];
143 }
144 
145 - (void)updateSplashImage:(UIInterfaceOrientation)interfaceOrientation
146 {
147  UIImage *image;
148 
149  if (UIInterfaceOrientationIsLandscape(interfaceOrientation)) {
150  image = self->splashLandscape;
151  } else {
152  image = self->splashPortrait;
153  }
154  if (image)
155  {
156  splash.image = image;
157  }
158 }
159 
160 @end
161 
162 
163 @implementation SDLUIKitDelegate
164 
165 /* convenience method */
167 {
168  /* the delegate is set in UIApplicationMain(), which is garaunteed to be called before this method */
169  return [[UIApplication sharedApplication] delegate];
170 }
171 
172 + (NSString *)getAppDelegateClassName
173 {
174  /* subclassing notice: when you subclass this appdelegate, make sure to add a category to override
175  this method and return the actual name of the delegate */
176  return @"SDLUIKitDelegate";
177 }
178 
179 - (id)init
180 {
181  self = [super init];
182  return self;
183 }
184 
185 - (void)postFinishLaunch
186 {
187  /* run the user's application, passing argc and argv */
188  SDL_iPhoneSetEventPump(SDL_TRUE);
189  exit_status = SDL_main(forward_argc, forward_argv);
190  SDL_iPhoneSetEventPump(SDL_FALSE);
191 
192  /* If we showed a splash image, clean it up */
193  if (launch_window) {
194  [launch_window release];
195  launch_window = NULL;
196  }
197 
198  /* exit, passing the return status from the user's application */
199  /* We don't actually exit to support applications that do setup in
200  * their main function and then allow the Cocoa event loop to run.
201  */
202  /* exit(exit_status); */
203 }
204 
205 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
206 {
207  /* Keep the launch image up until we set a video mode */
208  launch_window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
209 
210  UIViewController *splashViewController = [[SDL_splashviewcontroller alloc] init];
211  launch_window.rootViewController = splashViewController;
212  [launch_window addSubview:splashViewController.view];
213  [launch_window makeKeyAndVisible];
214 
215  /* Set working directory to resource path */
216  [[NSFileManager defaultManager] changeCurrentDirectoryPath: [[NSBundle mainBundle] resourcePath]];
217 
218  /* register a callback for the idletimer hint */
220  SDL_IdleTimerDisabledChanged, NULL);
221 
223  [self performSelector:@selector(postFinishLaunch) withObject:nil afterDelay:0.0];
224 
225  return YES;
226 }
227 
228 - (void)applicationWillTerminate:(UIApplication *)application
229 {
231 }
232 
233 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
234 {
236 }
237 
238 - (void) applicationWillResignActive:(UIApplication*)application
239 {
241  if (_this) {
242  SDL_Window *window;
243  for (window = _this->windows; window != nil; window = window->next) {
246  }
247  }
249 }
250 
251 - (void) applicationDidEnterBackground:(UIApplication*)application
252 {
254 }
255 
256 - (void) applicationWillEnterForeground:(UIApplication*)application
257 {
259 }
260 
261 - (void) applicationDidBecomeActive:(UIApplication*)application
262 {
264 
266  if (_this) {
267  SDL_Window *window;
268  for (window = _this->windows; window != nil; window = window->next) {
271  }
272  }
273 }
274 
275 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
276 {
277  NSURL *fileURL = [url filePathURL];
278  if (fileURL != nil) {
279  SDL_SendDropFile([[fileURL path] UTF8String]);
280  } else {
281  SDL_SendDropFile([[url absoluteString] UTF8String]);
282  }
283  return YES;
284 }
285 
286 @end
287 
288 #endif /* SDL_VIDEO_DRIVER_UIKIT */
289 
290 /* vi: set ts=4 sw=4 expandtab: */
SDL_Window * next
Definition: SDL_sysvideo.h:102
GLvoid **typedef void(GLAPIENTRY *PFNGLGETVERTEXATTRIBDVPROC)(GLuint
Definition: glew.h:1824
int main(int argc, char **argv)
Definition: bootstrap.cpp:102
DECLSPEC void SDL_SetMainReady(void)
Definition: SDL.c:97
#define NULL
Definition: ftobjs.h:61
SDL_EventEntry * free
Definition: SDL_events.c:80
static void init(struct bs2b *bs2b)
Definition: bs2b.c:46
EGLSurface EGLint EGLint EGLint EGLint height
Definition: eglext.h:293
EGLImageKHR EGLint * name
Definition: eglext.h:284
DECLSPEC void SDLCALL SDL_AddHintCallback(const char *name, SDL_HintCallback callback, void *userdata)
Definition: SDL_hints.c:122
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
GLuint id
Definition: gl2ext.h:1142
GLsizei const GLchar *const * path
Definition: glew.h:5828
EGLImageKHR image
Definition: eglext.h:88
static SDL_VideoDevice * _this
Definition: SDL_video.c:92
#define SDL_max(x, y)
Definition: SDL_stdinc.h:245
NSString * getAppDelegateClassName()
SDL_Window * windows
Definition: SDL_sysvideo.h:266
#define SDL_HINT_IDLE_TIMER_DISABLED
A variable controlling whether the idle timer is disabled on iOS.
Definition: SDL_hints.h:194
#define malloc
Definition: SDL_malloc.c:635
C_LINKAGE int SDL_main(int argc, char *argv[])
int SDL_SendDropFile(const char *file)
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:548
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:610
int i
Definition: pngrutil.c:1377
typedef BOOL(WINAPI *PFNWGLSETSTEREOEMITTERSTATE3DLPROC)(HDC hDC
GLsizei size
Definition: gl2ext.h:1467