Added support for SDL_SetWindowBordered on iOS. Worked around a bug with rotating the device on iOS 8.

This commit is contained in:
Alex Szpakowski 2014-07-29 00:05:48 -03:00
parent 0e5df60538
commit 31257842ec
8 changed files with 79 additions and 51 deletions

View File

@ -346,7 +346,7 @@ extern "C" {
/** /**
* \brief If set to 1, then do not allow high-DPI windows. ("Retina" on Mac) * \brief If set to 1, then do not allow high-DPI windows. ("Retina" on Mac and iOS)
*/ */
#define SDL_HINT_VIDEO_HIGHDPI_DISABLED "SDL_VIDEO_HIGHDPI_DISABLED" #define SDL_HINT_VIDEO_HIGHDPI_DISABLED "SDL_VIDEO_HIGHDPI_DISABLED"

View File

@ -244,22 +244,29 @@ SDL_IdleTimerDisabledChanged(void *userdata, const char *name, const char *oldVa
- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation - (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation
{ {
UIInterfaceOrientation orientation = application.statusBarOrientation; BOOL isLandscape = UIInterfaceOrientationIsLandscape(application.statusBarOrientation);
SDL_VideoDevice *_this = SDL_GetVideoDevice(); SDL_VideoDevice *_this = SDL_GetVideoDevice();
if (_this && _this->num_displays > 0) { if (_this && _this->num_displays > 0) {
SDL_VideoDisplay *display = &_this->displays[0]; /* Main screen. */ SDL_DisplayMode *desktopmode = &_this->displays[0].desktop_mode;
SDL_DisplayMode *mode = &display->desktop_mode; SDL_DisplayMode *currentmode = &_this->displays[0].current_mode;
/* The desktop display mode should be kept in sync with the screen /* The desktop display mode should be kept in sync with the screen
* orientation so that updating a window's fullscreen state to * orientation so that updating a window's fullscreen state to
* SDL_WINDOW_FULLSCREEN_DESKTOP keeps the window dimensions in the * SDL_WINDOW_FULLSCREEN_DESKTOP keeps the window dimensions in the
* correct orientation. * correct orientation.
*/ */
if (UIInterfaceOrientationIsLandscape(orientation) != (mode->w > mode->h)) { if (isLandscape != (desktopmode->w > desktopmode->h)) {
int height = mode->w; int height = desktopmode->w;
mode->w = mode->h; desktopmode->w = desktopmode->h;
mode->h = height; desktopmode->h = height;
}
/* Same deal with the current mode + SDL_GetCurrentDisplayMode. */
if (isLandscape != (currentmode->w > currentmode->h)) {
int height = currentmode->w;
currentmode->w = currentmode->h;
currentmode->h = height;
} }
} }
} }

View File

@ -32,7 +32,7 @@ static SDL_bool s_showingMessageBox = SDL_FALSE;
@interface UIKit_UIAlertViewDelegate : NSObject <UIAlertViewDelegate> @interface UIKit_UIAlertViewDelegate : NSObject <UIAlertViewDelegate>
- (id)initWithButtonIndex:(int *)_buttonIndex; - (id)initWithButtonIndex:(int *)buttonIndex;
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex; - (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex;
@end @end

View File

@ -78,12 +78,11 @@ UIKit_CreateDevice(int devindex)
device->ShowWindow = UIKit_ShowWindow; device->ShowWindow = UIKit_ShowWindow;
device->HideWindow = UIKit_HideWindow; device->HideWindow = UIKit_HideWindow;
device->RaiseWindow = UIKit_RaiseWindow; device->RaiseWindow = UIKit_RaiseWindow;
device->SetWindowBordered = UIKit_SetWindowBordered;
device->SetWindowFullscreen = UIKit_SetWindowFullscreen; device->SetWindowFullscreen = UIKit_SetWindowFullscreen;
device->DestroyWindow = UIKit_DestroyWindow; device->DestroyWindow = UIKit_DestroyWindow;
device->GetWindowWMInfo = UIKit_GetWindowWMInfo; device->GetWindowWMInfo = UIKit_GetWindowWMInfo;
/* !!! FIXME: implement SetWindowBordered */
#if SDL_IPHONE_KEYBOARD #if SDL_IPHONE_KEYBOARD
device->HasScreenKeyboardSupport = UIKit_HasScreenKeyboardSupport; device->HasScreenKeyboardSupport = UIKit_HasScreenKeyboardSupport;
device->ShowScreenKeyboard = UIKit_ShowScreenKeyboard; device->ShowScreenKeyboard = UIKit_ShowScreenKeyboard;

View File

@ -51,15 +51,9 @@ void _uikit_keyboard_init();
} }
- (void)dealloc
{
[super dealloc];
}
- (id)initWithFrame:(CGRect)frame - (id)initWithFrame:(CGRect)frame
{ {
self = [super initWithFrame: frame]; if (self = [super initWithFrame: frame]) {
#if SDL_IPHONE_KEYBOARD #if SDL_IPHONE_KEYBOARD
[self initializeKeyboard]; [self initializeKeyboard];
#endif #endif
@ -68,6 +62,7 @@ void _uikit_keyboard_init();
touchId = 1; touchId = 1;
SDL_AddTouch(touchId, ""); SDL_AddTouch(touchId, "");
}
return self; return self;

View File

@ -40,12 +40,9 @@
- (id)initWithSDLWindow:(SDL_Window *)_window - (id)initWithSDLWindow:(SDL_Window *)_window
{ {
self = [self init]; if (self = [super initWithNibName:nil bundle:nil]) {
if (self == nil) {
return nil;
}
self.window = _window; self.window = _window;
}
return self; return self;
} }
@ -56,8 +53,7 @@
- (void)viewDidLayoutSubviews - (void)viewDidLayoutSubviews
{ {
SDL_WindowData *data = window->driverdata; const CGSize size = self.view.bounds.size;
const CGSize size = data->view.bounds.size;
int w = (int) size.width; int w = (int) size.width;
int h = (int) size.height; int h = (int) size.height;

View File

@ -32,6 +32,7 @@ extern int UIKit_CreateWindow(_THIS, SDL_Window * window);
extern void UIKit_ShowWindow(_THIS, SDL_Window * window); extern void UIKit_ShowWindow(_THIS, SDL_Window * window);
extern void UIKit_HideWindow(_THIS, SDL_Window * window); extern void UIKit_HideWindow(_THIS, SDL_Window * window);
extern void UIKit_RaiseWindow(_THIS, SDL_Window * window); extern void UIKit_RaiseWindow(_THIS, SDL_Window * window);
extern void UIKit_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered);
extern void UIKit_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen); extern void UIKit_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen);
extern void UIKit_DestroyWindow(_THIS, SDL_Window * window); extern void UIKit_DestroyWindow(_THIS, SDL_Window * window);
extern SDL_bool UIKit_GetWindowWMInfo(_THIS, SDL_Window * window, extern SDL_bool UIKit_GetWindowWMInfo(_THIS, SDL_Window * window,
@ -39,9 +40,13 @@ extern SDL_bool UIKit_GetWindowWMInfo(_THIS, SDL_Window * window,
@class UIWindow; @class UIWindow;
@interface SDL_uikitwindow : UIWindow
@end
struct SDL_WindowData struct SDL_WindowData
{ {
UIWindow *uiwindow; SDL_uikitwindow *uiwindow;
SDL_uikitopenglview *view; SDL_uikitopenglview *view;
SDL_uikitviewcontroller *viewcontroller; SDL_uikitviewcontroller *viewcontroller;
}; };

View File

@ -41,8 +41,23 @@
#include <Foundation/Foundation.h> #include <Foundation/Foundation.h>
@implementation SDL_uikitwindow
static int SetupWindowData(_THIS, SDL_Window *window, UIWindow *uiwindow, SDL_bool created) - (void)layoutSubviews
{
[super layoutSubviews];
/* This seems to be needed on iOS 8, otherwise the window's frame is put in
* an unexpected position when the screen or device is rotated.
* FIXME: is there a better solution to that problem than this ugly hack?
*/
self.frame = self.screen.bounds;
}
@end
static int SetupWindowData(_THIS, SDL_Window *window, SDL_uikitwindow *uiwindow, SDL_bool created)
{ {
SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window); SDL_VideoDisplay *display = SDL_GetDisplayForWindow(window);
SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata; SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
@ -181,7 +196,7 @@ UIKit_CreateWindow(_THIS, SDL_Window *window)
/* ignore the size user requested, and make a fullscreen window */ /* ignore the size user requested, and make a fullscreen window */
/* !!! FIXME: can we have a smaller view? */ /* !!! FIXME: can we have a smaller view? */
UIWindow *uiwindow = [[UIWindow alloc] initWithFrame:[data->uiscreen bounds]]; SDL_uikitwindow *uiwindow = [[SDL_uikitwindow alloc] initWithFrame:data->uiscreen.bounds];
/* put the window on an external display if appropriate. This implicitly /* put the window on an external display if appropriate. This implicitly
* does [uiwindow setframe:[uiscreen bounds]], so don't do it on the * does [uiwindow setframe:[uiscreen bounds]], so don't do it on the
@ -198,7 +213,6 @@ UIKit_CreateWindow(_THIS, SDL_Window *window)
} }
return 1; return 1;
} }
void void
@ -228,15 +242,15 @@ UIKit_RaiseWindow(_THIS, SDL_Window * window)
_this->GL_MakeCurrent(_this, _this->current_glwin, _this->current_glctx); _this->GL_MakeCurrent(_this, _this->current_glwin, _this->current_glctx);
} }
void static void
UIKit_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen) UIKit_UpdateWindowBorder(_THIS, SDL_Window * window)
{ {
SDL_DisplayData *displaydata = (SDL_DisplayData *) display->driverdata;
SDL_WindowData *windowdata = (SDL_WindowData *) window->driverdata; SDL_WindowData *windowdata = (SDL_WindowData *) window->driverdata;
SDL_uikitviewcontroller *viewcontroller = windowdata->viewcontroller; SDL_uikitviewcontroller *viewcontroller = windowdata->viewcontroller;
CGRect frame; CGRect frame;
if (fullscreen || (window->flags & SDL_WINDOW_BORDERLESS)) { if (windowdata->uiwindow.screen == [UIScreen mainScreen]) {
if (window->flags & (SDL_WINDOW_FULLSCREEN | SDL_WINDOW_BORDERLESS)) {
[UIApplication sharedApplication].statusBarHidden = YES; [UIApplication sharedApplication].statusBarHidden = YES;
} else { } else {
[UIApplication sharedApplication].statusBarHidden = NO; [UIApplication sharedApplication].statusBarHidden = NO;
@ -246,9 +260,11 @@ UIKit_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
if ([viewcontroller respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) { if ([viewcontroller respondsToSelector:@selector(setNeedsStatusBarAppearanceUpdate)]) {
[viewcontroller setNeedsStatusBarAppearanceUpdate]; [viewcontroller setNeedsStatusBarAppearanceUpdate];
} }
}
/* Update the view's frame to account for the status bar change. */ /* Update the view's frame to account for the status bar change. */
frame = UIKit_ComputeViewFrame(window, displaydata->uiscreen); frame = UIKit_ComputeViewFrame(window, windowdata->uiwindow.screen);
windowdata->view.frame = frame; windowdata->view.frame = frame;
[windowdata->view setNeedsLayout]; [windowdata->view setNeedsLayout];
[windowdata->view layoutIfNeeded]; [windowdata->view layoutIfNeeded];
@ -261,14 +277,24 @@ UIKit_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display
screen to match, so we pick the closest to what we wanted. screen to match, so we pick the closest to what we wanted.
*/ */
if (window->w >= window->h) { if (window->w >= window->h) {
window->w = SDL_max(width, height); SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, SDL_max(width, height), SDL_min(width, height));
window->h = SDL_min(width, height);
} else { } else {
window->w = SDL_min(width, height); SDL_SendWindowEvent(window, SDL_WINDOWEVENT_RESIZED, SDL_min(width, height), SDL_max(width, height));
window->h = SDL_max(width, height);
} }
} }
void
UIKit_SetWindowBordered(_THIS, SDL_Window * window, SDL_bool bordered)
{
UIKit_UpdateWindowBorder(_this, window);
}
void
UIKit_SetWindowFullscreen(_THIS, SDL_Window * window, SDL_VideoDisplay * display, SDL_bool fullscreen)
{
UIKit_UpdateWindowBorder(_this, window);
}
void void
UIKit_DestroyWindow(_THIS, SDL_Window * window) UIKit_DestroyWindow(_THIS, SDL_Window * window)
{ {