zenilib: zenilib/jni/external/sdl/src/video/uikit/SDL_uikitappdelegate.m Source File

zenilib 0.5.3.0

- Main Page
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

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) {
129 orientationMask &= ~UIInterfaceOrientationMaskPortraitUpsideDown;
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 */
166 + (id) sharedAppDelegate
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 */
219 SDL_AddHintCallback(SDL_HINT_IDLE_TIMER_DISABLED,
220 SDL_IdleTimerDisabledChanged, NULL);
221
222 SDL_SetMainReady();
223 [self performSelector:@selector(postFinishLaunch) withObject:nil afterDelay:0.0];
224
225 return YES;
226 }
227
228 - (void)applicationWillTerminate:(UIApplication *)application
229 {
230 SDL_SendAppEvent(SDL_APP_TERMINATING);
231 }
232
233 - (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
234 {
235 SDL_SendAppEvent(SDL_APP_LOWMEMORY);
236 }
237
238 - (void) applicationWillResignActive:(UIApplication*)application
239 {
240 SDL_VideoDevice *_this = SDL_GetVideoDevice();
241 if (_this) {
242 SDL_Window *window;
243 for (window = _this->windows; window != nil; window = window->next) {
244 SDL_SendWindowEvent(window, SDL_WINDOWEVENT_FOCUS_LOST, 0, 0);
245 SDL_SendWindowEvent(window, SDL_WINDOWEVENT_MINIMIZED, 0, 0);
246 }
247 }
248 SDL_SendAppEvent(SDL_APP_WILLENTERBACKGROUND);
249 }
250
251 - (void) applicationDidEnterBackground:(UIApplication*)application
252 {
253 SDL_SendAppEvent(SDL_APP_DIDENTERBACKGROUND);
254 }
255
256 - (void) applicationWillEnterForeground:(UIApplication*)application
257 {
258 SDL_SendAppEvent(SDL_APP_WILLENTERFOREGROUND);
259 }
260
261 - (void) applicationDidBecomeActive:(UIApplication*)application
262 {
263 SDL_SendAppEvent(SDL_APP_DIDENTERFOREGROUND);
264
265 SDL_VideoDevice *_this = SDL_GetVideoDevice();
266 if (_this) {
267 SDL_Window *window;
268 for (window = _this->windows; window != nil; window = window->next) {
269 SDL_SendWindowEvent(window, SDL_WINDOWEVENT_FOCUS_GAINED, 0, 0);
270 SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESTORED, 0, 0);
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
SDL_Window * next
Definition: SDL_sysvideo.h:102
SDL_APP_DIDENTERFOREGROUND
Definition: SDL_events.h:83
SDL_APP_WILLENTERFOREGROUND
Definition: SDL_events.h:79
+[SDLUIKitDelegate sharedAppDelegate]
id sharedAppDelegate()
void
GLvoid **typedef void(GLAPIENTRY *PFNGLGETVERTEXATTRIBDVPROC)(GLuint
Definition: glew.h:1824
SDL_APP_LOWMEMORY
Definition: SDL_events.h:67
main
int main(int argc, char **argv)
Definition: bootstrap.cpp:102
SDL_WINDOWEVENT_MINIMIZED
Definition: SDL_video.h:146
SDL_uikitappdelegate.h
SDL_SetMainReady
DECLSPEC void SDL_SetMainReady(void)
Definition: SDL.c:97
NULL
#define NULL
Definition: ftobjs.h:61
SDL_TRUE
Definition: SDL_stdinc.h:119
free
SDL_EventEntry * free
Definition: SDL_events.c:80
init
static void init(struct bs2b *bs2b)
Definition: bs2b.c:46
height
EGLSurface EGLint EGLint EGLint EGLint height
Definition: eglext.h:293
name
EGLImageKHR EGLint * name
Definition: eglext.h:284
SDL_AddHintCallback
DECLSPEC void SDLCALL SDL_AddHintCallback(const char *name, SDL_HintCallback callback, void *userdata)
Definition: SDL_hints.c:122
SDL_SendWindowEvent
int SDL_SendWindowEvent(SDL_Window *window, Uint8 windowevent, int data1, int data2)
Definition: SDL_windowevents.c:74
SDL_FALSE
Definition: SDL_stdinc.h:118
id
GLuint id
Definition: gl2ext.h:1142
path
GLsizei const GLchar *const * path
Definition: glew.h:5828
SDL_config.h
image
EGLImageKHR image
Definition: eglext.h:88
_this
static SDL_VideoDevice * _this
Definition: SDL_video.c:92
SDL_WINDOWEVENT_FOCUS_GAINED
Definition: SDL_video.h:152
SDL_system.h
SDL_WINDOWEVENT_RESTORED
Definition: SDL_video.h:148
SDL_max
#define SDL_max(x, y)
Definition: SDL_stdinc.h:245
+[SDLUIKitDelegate getAppDelegateClassName]
NSString * getAppDelegateClassName()
SDL_WINDOWEVENT_FOCUS_LOST
Definition: SDL_video.h:153
SDL_hints.h
SDL_VideoDevice::windows
SDL_Window * windows
Definition: SDL_sysvideo.h:266
SDL_HINT_IDLE_TIMER_DISABLED
#define SDL_HINT_IDLE_TIMER_DISABLED
A variable controlling whether the idle timer is disabled on iOS.
Definition: SDL_hints.h:194
SDL_main.h
malloc
#define malloc
Definition: SDL_malloc.c:635
SDL_main
C_LINKAGE int SDL_main(int argc, char *argv[])
SDL_SendDropFile
int SDL_SendDropFile(const char *file)
Definition: SDL_dropevents.c:31
SDLUIKitDelegate
Definition: SDL_uikitappdelegate.h:24
SDL_Window
Definition: SDL_sysvideo.h:71
SDL_VideoDevice
Definition: SDL_sysvideo.h:135
SDL_GetVideoDevice
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:548
SDL_APP_WILLENTERBACKGROUND
Definition: SDL_events.h:71
SDL_APP_TERMINATING
Definition: SDL_events.h:63
SDL_SendAppEvent
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:610
UIInterfaceOrientationMaskPortraitUpsideDown
Definition: SDL_uikitvideo.h:35
i
int i
Definition: pngrutil.c:1377
UIInterfaceOrientationMaskAll
Definition: SDL_uikitvideo.h:37
SDL_uikitmodes.h
SDL_APP_DIDENTERBACKGROUND
Definition: SDL_events.h:75
SDL_assert.h
BOOL
typedef BOOL(WINAPI *PFNWGLSETSTEREOEMITTERSTATE3DLPROC)(HDC hDC
size
GLsizei size
Definition: gl2ext.h:1467