From ce1fbe04773a06484c010de40e9abd15f61a164f Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 27 Mar 2011 01:35:19 -0400 Subject: [PATCH] iOS: Report both landscape and portrait orientation as display modes. --- src/video/uikit/SDL_uikitvideo.m | 56 ++++++++++++++++++++++++++++--- src/video/uikit/SDL_uikitwindow.m | 23 ++++++++++--- 2 files changed, 70 insertions(+), 9 deletions(-) diff --git a/src/video/uikit/SDL_uikitvideo.m b/src/video/uikit/SDL_uikitvideo.m index b18af49f9..8e9ad2df9 100644 --- a/src/video/uikit/SDL_uikitvideo.m +++ b/src/video/uikit/SDL_uikitvideo.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]; + } } } diff --git a/src/video/uikit/SDL_uikitwindow.m b/src/video/uikit/SDL_uikitwindow.m index dc3ffb10c..946531313 100644 --- a/src/video/uikit/SDL_uikitwindow.m +++ b/src/video/uikit/SDL_uikitwindow.m @@ -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; }