21 #include "../../SDL_internal.h"
23 #if SDL_VIDEO_DRIVER_UIKIT
30 #include "../SDL_sysvideo.h"
31 #include "../SDL_pixels_c.h"
32 #include "../../events/SDL_events_c.h"
43 #include <Foundation/Foundation.h>
53 if ((
self = [super
init])) {
54 views = [NSMutableArray new];
62 @interface SDL_uikitwindow : UIWindow
64 - (
void)layoutSubviews;
68 @implementation SDL_uikitwindow
70 - (
void)layoutSubviews
79 self.frame =
self.screen.bounds;
81 [
super layoutSubviews];
103 window->driverdata = (
void *) CFBridgingRetain(
data);
105 data.uiwindow = uiwindow;
110 if (displaydata.
uiscreen != [UIScreen mainScreen]) {
117 if (displaydata.
uiscreen == [UIScreen mainScreen]) {
127 BOOL supportsLandscape = (orients & UIInterfaceOrientationMaskLandscape) != 0;
128 BOOL supportsPortrait = (orients & (UIInterfaceOrientationMaskPortrait|UIInterfaceOrientationMaskPortraitUpsideDown)) != 0;
154 [view setSDLWindow:window];
171 return SDL_SetError(
"Only one window allowed per display.");
178 const CGSize origsize =
data.uiscreen.currentMode.size;
179 if ((origsize.width == 0.0f) && (origsize.height == 0.0f)) {
204 if (
data.uiscreen == [UIScreen mainScreen]) {
206 [UIApplication sharedApplication].statusBarHidden = YES;
208 [UIApplication sharedApplication].statusBarHidden = NO;
215 UIWindow *uiwindow = [[SDL_uikitwindow alloc] initWithFrame:data.uiscreen.bounds];
218 if (
data.uiscreen != [UIScreen mainScreen]) {
219 [uiwindow setScreen:data.uiscreen];
244 [
data.uiwindow makeKeyAndVisible];
249 if (displaydata.
uiscreen == [UIScreen mainScreen]) {
282 if (
data.uiwindow.screen == [UIScreen mainScreen]) {
284 [UIApplication sharedApplication].statusBarHidden = YES;
286 [UIApplication sharedApplication].statusBarHidden = NO;
290 if ([viewcontroller respondsToSelector:
@selector(setNeedsStatusBarAppearanceUpdate)]) {
291 [viewcontroller setNeedsStatusBarAppearanceUpdate];
296 viewcontroller.view.frame = UIKit_ComputeViewFrame(
window,
data.uiwindow.screen);
299 #ifdef SDL_IPHONE_KEYBOARD
301 [viewcontroller updateKeyboard];
304 [viewcontroller.view setNeedsLayout];
305 [viewcontroller.view layoutIfNeeded];
330 NSArray *views = nil;
332 [data.viewcontroller stopAnimation];
337 views = [data.views copy];
339 [view setSDLWindow:NULL];
347 data.uiwindow.hidden = YES;
367 #if SDL_VIDEO_OPENGL_ES || SDL_VIDEO_OPENGL_ES2
368 if ([
data.viewcontroller.view isKindOfClass:[SDL_uikitopenglview
class]]) {
369 SDL_uikitopenglview *glview = (SDL_uikitopenglview *)
data.viewcontroller.view;
370 info->
info.uikit.framebuffer = glview.drawableFramebuffer;
371 info->
info.uikit.colorbuffer = glview.drawableRenderbuffer;
372 info->
info.uikit.resolveFramebuffer = glview.msaaResolveFramebuffer;
377 info->
info.uikit.framebuffer = 0;
378 info->
info.uikit.colorbuffer = 0;
379 info->
info.uikit.resolveFramebuffer = 0;
397 NSUInteger validOrientations = UIInterfaceOrientationMaskAll;
398 NSUInteger orientationMask = 0;
402 UIApplication *app = [UIApplication sharedApplication];
406 if ([app.delegate respondsToSelector:
@selector(application:supportedInterfaceOrientationsForWindow:)]) {
407 validOrientations = [app.delegate application:app supportedInterfaceOrientationsForWindow:data.uiwindow];
408 }
else if ([app respondsToSelector:
@selector(supportedInterfaceOrientationsForWindow:)]) {
409 validOrientations = [app supportedInterfaceOrientationsForWindow:data.uiwindow];
413 NSArray *orientations = [@(hint) componentsSeparatedByString:@" "];
415 if ([orientations containsObject:
@"LandscapeLeft"]) {
416 orientationMask |= UIInterfaceOrientationMaskLandscapeLeft;
418 if ([orientations containsObject:
@"LandscapeRight"]) {
419 orientationMask |= UIInterfaceOrientationMaskLandscapeRight;
421 if ([orientations containsObject:
@"Portrait"]) {
422 orientationMask |= UIInterfaceOrientationMaskPortrait;
424 if ([orientations containsObject:
@"PortraitUpsideDown"]) {
425 orientationMask |= UIInterfaceOrientationMaskPortraitUpsideDown;
431 orientationMask = UIInterfaceOrientationMaskAll;
434 if (orientationMask == 0) {
436 orientationMask |= UIInterfaceOrientationMaskLandscape;
439 orientationMask |= (UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown);
444 if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) {
445 orientationMask &= ~UIInterfaceOrientationMaskPortraitUpsideDown;
451 if ((validOrientations & orientationMask) == 0) {
452 orientationMask = validOrientations;
456 return orientationMask;
469 [
data.viewcontroller setAnimationCallback:interval
471 callbackParam:callbackParam];