Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

iOS: Report both landscape and portrait orientation as display modes.

  • Loading branch information
icculus committed Mar 27, 2011
1 parent 850751f commit ce1fbe04773a06484c010de40e9abd15f61a164f
Showing with 70 additions and 9 deletions.
  1. +51 −5 src/video/uikit/SDL_uikitvideo.m
  2. +19 −4 src/video/uikit/SDL_uikitwindow.m
@@ -119,6 +119,32 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device)
*/

static CGSize
UIKit_ForcePortrait(const CGSize size)
{
CGSize retval;
if (size.width < size.height) { // portrait
retval = size;
} else { // landscape
retval.width = size.height;
retval.height = size.width;
}
return retval;
}

static CGSize
UIKit_ForceLandscape(const CGSize size)
{
CGSize retval;
if (size.width > size.height) { // landscape
retval = size;
} else { // portrait
retval.width = size.height;
retval.height = size.width;
}
return retval;
}

static void
UIKit_GetDisplayModes(_THIS, SDL_VideoDisplay * display)
{
@@ -136,22 +162,42 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device)
mode.refresh_rate = 0;
mode.driverdata = NULL;
SDL_AddDisplayMode(display, &mode);
mode.w = (int) rect.size.height; // swap the orientation, add again.
mode.h = (int) rect.size.width;
SDL_AddDisplayMode(display, &mode);
return;
}

const int ismain = (uiscreen == [UIScreen mainScreen]);
const NSArray *modes = [uiscreen availableModes];
const NSUInteger mode_count = [modes count];
NSUInteger i;
for (i = 0; i < mode_count; i++) {
UIScreenMode *uimode = (UIScreenMode *) [modes objectAtIndex:i];
const CGSize size = [uimode size];
CGSize size = [uimode size];
mode.format = SDL_PIXELFORMAT_ABGR8888;
mode.w = (int) size.width;
mode.h = (int) size.height;
mode.refresh_rate = 0;
mode.driverdata = uimode;
[uimode retain];
SDL_AddDisplayMode(display, &mode);
mode.w = (int) size.width;
mode.h = (int) size.height;
if (SDL_AddDisplayMode(display, &mode))
[uimode retain];

if (ismain) {
// Add the mode twice, flipped to portrait and landscape.
// SDL_AddDisplayMode() will ignore duplicates.
size = UIKit_ForcePortrait([uimode size]);
mode.w = (int) size.width;
mode.h = (int) size.height;
if (SDL_AddDisplayMode(display, &mode))
[uimode retain];

size = UIKit_ForceLandscape(size);
mode.w = (int) size.width;
mode.h = (int) size.height;
if (SDL_AddDisplayMode(display, &mode))
[uimode retain];
}
}
}

@@ -63,22 +63,37 @@ static int SetupWindowData(_THIS, SDL_Window *window, UIWindow *uiwindow, SDL_bo

window->driverdata = data;

window->flags &= ~SDL_WINDOW_RESIZABLE; /* window is NEVER resizeable */
window->flags |= SDL_WINDOW_FULLSCREEN; /* window is always fullscreen */
window->flags |= SDL_WINDOW_SHOWN; /* only one window on iPod touch, always shown */
window->flags |= SDL_WINDOW_INPUT_FOCUS; /* always has input focus */

// SDL_WINDOW_BORDERLESS controls whether status bar is hidden.
// This is only set if the window is on the main screen. Other screens
// just force the window to have the borderless flag.
if ([UIScreen mainScreen] == uiscreen) {
if ([UIScreen mainScreen] != uiscreen) {
window->flags &= ~SDL_WINDOW_RESIZABLE; // window is NEVER resizeable
window->flags &= ~SDL_WINDOW_INPUT_FOCUS; // never has input focus
} else {
window->flags |= SDL_WINDOW_INPUT_FOCUS; // always has input focus

if (window->flags & SDL_WINDOW_BORDERLESS) {
[UIApplication sharedApplication].statusBarHidden = YES;
} else {
[UIApplication sharedApplication].statusBarHidden = NO;
}

// Rotate the view if we have to, but only on the main screen
// (presumably, an external display doesn't report orientation).
const CGSize uisize = [[uiscreen currentMode] size];
if ( ((window->w > window->h) && (uisize.width < uisize.height)) ||
((window->w < window->h) && (uisize.width > uisize.height)) ) {
// !!! FIXME: flip orientation.
}

if (window->flags & SDL_WINDOW_RESIZABLE) {
// !!! FIXME: register for orientation change alerts.
}
}

return 0;

}

0 comments on commit ce1fbe0

Please sign in to comment.