This repository has been archived by the owner. It is now read-only.
Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
with
190 additions
and 123 deletions.
@@ -0,0 +1,35 @@ | ||
/* | ||
Simple DirectMedia Layer | ||
Copyright (C) 1997-2011 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. | ||
*/ | ||
|
||
#import <UIKit/UIKit.h> | ||
|
||
#include "SDL_video.h" | ||
|
||
|
||
@interface SDL_uikitviewcontroller : UIViewController { | ||
@private | ||
SDL_Window *window; | ||
} | ||
- (id)initWithSDLWindow:(SDL_Window *)_window; | ||
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orient; | ||
- (void)loadView; | ||
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation; | ||
@end |
@@ -0,0 +1,146 @@ | ||
/* | ||
Simple DirectMedia Layer | ||
Copyright (C) 1997-2011 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_config.h" | ||
|
||
#include "SDL_video.h" | ||
#include "SDL_assert.h" | ||
#include "SDL_hints.h" | ||
#include "../SDL_sysvideo.h" | ||
#include "../../events/SDL_events_c.h" | ||
|
||
#include "SDL_uikitwindow.h" | ||
|
||
#import "SDL_uikitviewcontroller.h" | ||
|
||
|
||
@implementation SDL_uikitviewcontroller | ||
|
||
- (id)initWithSDLWindow:(SDL_Window *)_window { | ||
if ((self = [self init]) == nil) { | ||
return nil; | ||
} | ||
self->window = _window; | ||
return self; | ||
} | ||
|
||
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orient { | ||
const char *orientationsCString; | ||
if ((orientationsCString = SDL_GetHint(SDL_HINT_ORIENTATIONS)) != NULL) { | ||
BOOL rotate = NO; | ||
NSString *orientationsNSString = [NSString stringWithCString:orientationsCString | ||
encoding:NSUTF8StringEncoding]; | ||
NSArray *orientations = [orientationsNSString componentsSeparatedByCharactersInSet: | ||
[NSCharacterSet characterSetWithCharactersInString:@" "]]; | ||
|
||
switch (orient) { | ||
case UIInterfaceOrientationLandscapeLeft: | ||
rotate = [orientations containsObject:@"LandscapeLeft"]; | ||
break; | ||
|
||
case UIInterfaceOrientationLandscapeRight: | ||
rotate = [orientations containsObject:@"LandscapeRight"]; | ||
break; | ||
|
||
case UIInterfaceOrientationPortrait: | ||
rotate = [orientations containsObject:@"Portrait"]; | ||
break; | ||
|
||
case UIInterfaceOrientationPortraitUpsideDown: | ||
rotate = [orientations containsObject:@"PortraitUpsideDown"]; | ||
break; | ||
|
||
default: break; | ||
} | ||
|
||
return rotate; | ||
} | ||
|
||
if (self->window->flags & SDL_WINDOW_RESIZABLE) { | ||
return YES; // any orientation is okay. | ||
} | ||
|
||
// If not resizable, allow device to orient to other matching sizes | ||
// (that is, let the user turn the device upside down...same screen | ||
// dimensions, but it lets the user place the device where it's most | ||
// comfortable in relation to its physical buttons, headphone jack, etc). | ||
switch (orient) { | ||
case UIInterfaceOrientationLandscapeLeft: | ||
case UIInterfaceOrientationLandscapeRight: | ||
return (self->window->w >= self->window->h); | ||
|
||
case UIInterfaceOrientationPortrait: | ||
case UIInterfaceOrientationPortraitUpsideDown: | ||
return (self->window->h >= self->window->w); | ||
|
||
default: break; | ||
} | ||
|
||
return NO; // Nothing else is acceptable. | ||
} | ||
|
||
- (void)loadView { | ||
// do nothing. | ||
} | ||
|
||
// Send a resized event when the orientation changes. | ||
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { | ||
if ((self->window->flags & SDL_WINDOW_RESIZABLE) == 0) { | ||
return; // don't care, we're just flipping over in this case. | ||
} | ||
|
||
const UIInterfaceOrientation toInterfaceOrientation = [self interfaceOrientation]; | ||
SDL_WindowData *data = self->window->driverdata; | ||
UIWindow *uiwindow = data->uiwindow; | ||
UIScreen *uiscreen = [uiwindow screen]; | ||
const int noborder = self->window->flags & SDL_WINDOW_BORDERLESS; | ||
CGRect frame = noborder ? [uiscreen bounds] : [uiscreen applicationFrame]; | ||
const CGSize size = frame.size; | ||
int w, h; | ||
|
||
switch (toInterfaceOrientation) { | ||
case UIInterfaceOrientationPortrait: | ||
case UIInterfaceOrientationPortraitUpsideDown: | ||
w = (size.width < size.height) ? size.width : size.height; | ||
h = (size.width > size.height) ? size.width : size.height; | ||
break; | ||
|
||
case UIInterfaceOrientationLandscapeLeft: | ||
case UIInterfaceOrientationLandscapeRight: | ||
w = (size.width > size.height) ? size.width : size.height; | ||
h = (size.width < size.height) ? size.width : size.height; | ||
break; | ||
|
||
default: | ||
SDL_assert(0 && "Unexpected interface orientation!"); | ||
return; | ||
} | ||
|
||
frame.size.width = w; | ||
frame.size.height = h; | ||
frame.origin.x = 0; | ||
frame.origin.y = 0; | ||
|
||
[uiwindow setFrame:frame]; | ||
[data->view updateFrame]; | ||
SDL_SendWindowEvent(self->window, SDL_WINDOWEVENT_RESIZED, w, h); | ||
} | ||
|
||
@end |