mirror of https://github.com/encounter/SDL.git
iOS: show message boxes using the new UIAlertController APIs when supported, rather than the deprecated UIAlertView.
UIAlertController is also supported on tvOS, whereas UIAlertView is not.
This commit is contained in:
parent
774b077513
commit
ab2a350033
|
@ -181,7 +181,7 @@ SDL_SYS_AddJoystickDevice(GCController *controller, SDL_bool accelerometer)
|
||||||
#endif /* !SDL_EVENTS_DISABLED */
|
#endif /* !SDL_EVENTS_DISABLED */
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_JoystickDeviceItem *
|
static SDL_JoystickDeviceItem *
|
||||||
SDL_SYS_RemoveJoystickDevice(SDL_JoystickDeviceItem *device)
|
SDL_SYS_RemoveJoystickDevice(SDL_JoystickDeviceItem *device)
|
||||||
{
|
{
|
||||||
SDL_JoystickDeviceItem *prev = NULL;
|
SDL_JoystickDeviceItem *prev = NULL;
|
||||||
|
@ -374,12 +374,14 @@ SDL_SYS_JoystickOpen(SDL_Joystick * joystick, int device_index)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Function to determine if this joystick is attached to the system right now */
|
/* Function to determine if this joystick is attached to the system right now */
|
||||||
SDL_bool SDL_SYS_JoystickAttached(SDL_Joystick *joystick)
|
SDL_bool
|
||||||
|
SDL_SYS_JoystickAttached(SDL_Joystick *joystick)
|
||||||
{
|
{
|
||||||
return joystick->hwdata != NULL;
|
return joystick->hwdata != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void SDL_SYS_AccelerometerUpdate(SDL_Joystick * joystick)
|
static void
|
||||||
|
SDL_SYS_AccelerometerUpdate(SDL_Joystick * joystick)
|
||||||
{
|
{
|
||||||
const float maxgforce = SDL_IPHONE_MAX_GFORCE;
|
const float maxgforce = SDL_IPHONE_MAX_GFORCE;
|
||||||
const SInt16 maxsint16 = 0x7FFF;
|
const SInt16 maxsint16 = 0x7FFF;
|
||||||
|
@ -579,7 +581,8 @@ SDL_SYS_JoystickQuit(void)
|
||||||
numjoysticks = 0;
|
numjoysticks = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID( int device_index )
|
SDL_JoystickGUID
|
||||||
|
SDL_SYS_JoystickGetDeviceGUID( int device_index )
|
||||||
{
|
{
|
||||||
SDL_JoystickDeviceItem *device = GetDeviceForIndex(device_index);
|
SDL_JoystickDeviceItem *device = GetDeviceForIndex(device_index);
|
||||||
SDL_JoystickGUID guid;
|
SDL_JoystickGUID guid;
|
||||||
|
@ -591,7 +594,8 @@ SDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID( int device_index )
|
||||||
return guid;
|
return guid;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_JoystickGUID SDL_SYS_JoystickGetGUID(SDL_Joystick * joystick)
|
SDL_JoystickGUID
|
||||||
|
SDL_SYS_JoystickGetGUID(SDL_Joystick * joystick)
|
||||||
{
|
{
|
||||||
SDL_JoystickGUID guid;
|
SDL_JoystickGUID guid;
|
||||||
if (joystick->hwdata) {
|
if (joystick->hwdata) {
|
||||||
|
|
|
@ -24,41 +24,126 @@
|
||||||
|
|
||||||
#include "SDL.h"
|
#include "SDL.h"
|
||||||
#include "SDL_uikitvideo.h"
|
#include "SDL_uikitvideo.h"
|
||||||
|
#include "SDL_uikitwindow.h"
|
||||||
|
|
||||||
/* Display a UIKit message box */
|
/* Display a UIKit message box */
|
||||||
|
|
||||||
static SDL_bool s_showingMessageBox = SDL_FALSE;
|
static SDL_bool s_showingMessageBox = SDL_FALSE;
|
||||||
|
|
||||||
@interface SDLAlertViewDelegate : NSObject <UIAlertViewDelegate>
|
|
||||||
|
|
||||||
@property (nonatomic, assign) int clickedIndex;
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
@implementation SDLAlertViewDelegate
|
|
||||||
|
|
||||||
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
|
|
||||||
{
|
|
||||||
_clickedIndex = (int)buttonIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
||||||
|
|
||||||
|
|
||||||
SDL_bool
|
SDL_bool
|
||||||
UIKit_ShowingMessageBox()
|
UIKit_ShowingMessageBox()
|
||||||
{
|
{
|
||||||
return s_showingMessageBox;
|
return s_showingMessageBox;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
static void
|
||||||
UIKit_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
UIKit_WaitUntilMessageBoxClosed(const SDL_MessageBoxData *messageboxdata, int *clickedindex)
|
||||||
{
|
{
|
||||||
int i;
|
*clickedindex = messageboxdata->numbuttons;
|
||||||
const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons;
|
|
||||||
|
|
||||||
@autoreleasepool {
|
@autoreleasepool {
|
||||||
|
/* Run the main event loop until the alert has finished */
|
||||||
|
/* Note that this needs to be done on the main thread */
|
||||||
|
s_showingMessageBox = SDL_TRUE;
|
||||||
|
while ((*clickedindex) == messageboxdata->numbuttons) {
|
||||||
|
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
|
||||||
|
}
|
||||||
|
s_showingMessageBox = SDL_FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static BOOL
|
||||||
|
UIKit_ShowMessageBoxAlertController(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||||
|
{
|
||||||
|
#ifdef __IPHONE_8_0
|
||||||
|
int i;
|
||||||
|
int __block clickedindex = messageboxdata->numbuttons;
|
||||||
|
const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons;
|
||||||
|
UIWindow *window = nil;
|
||||||
|
UIWindow *alertwindow = nil;
|
||||||
|
|
||||||
|
if (![UIAlertController class]) {
|
||||||
|
return NO;
|
||||||
|
}
|
||||||
|
|
||||||
|
UIAlertController *alert;
|
||||||
|
alert = [UIAlertController alertControllerWithTitle:@(messageboxdata->title)
|
||||||
|
message:@(messageboxdata->message)
|
||||||
|
preferredStyle:UIAlertControllerStyleAlert];
|
||||||
|
|
||||||
|
for (i = 0; i < messageboxdata->numbuttons; i++) {
|
||||||
|
UIAlertAction *action;
|
||||||
|
UIAlertActionStyle style = UIAlertActionStyleDefault;
|
||||||
|
|
||||||
|
if (buttons[i].flags & SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT) {
|
||||||
|
style = UIAlertActionStyleCancel;
|
||||||
|
}
|
||||||
|
|
||||||
|
action = [UIAlertAction actionWithTitle:@(buttons[i].text)
|
||||||
|
style:style
|
||||||
|
handler:^(UIAlertAction *action) {
|
||||||
|
clickedindex = i;
|
||||||
|
}];
|
||||||
|
[alert addAction:action];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (messageboxdata->window) {
|
||||||
|
SDL_WindowData *data = (__bridge SDL_WindowData *) messageboxdata->window->driverdata;
|
||||||
|
window = data.uiwindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window == nil || window.rootViewController == nil) {
|
||||||
|
alertwindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
|
||||||
|
alertwindow.rootViewController = [UIViewController new];
|
||||||
|
alertwindow.windowLevel = UIWindowLevelAlert;
|
||||||
|
|
||||||
|
window = alertwindow;
|
||||||
|
|
||||||
|
[alertwindow makeKeyAndVisible];
|
||||||
|
}
|
||||||
|
|
||||||
|
[window.rootViewController presentViewController:alert animated:YES completion:nil];
|
||||||
|
UIKit_WaitUntilMessageBoxClosed(messageboxdata, &clickedindex);
|
||||||
|
|
||||||
|
if (alertwindow) {
|
||||||
|
alertwindow.hidden = YES;
|
||||||
|
}
|
||||||
|
|
||||||
|
*buttonid = messageboxdata->buttons[clickedindex].buttonid;
|
||||||
|
return YES;
|
||||||
|
#else
|
||||||
|
return NO;
|
||||||
|
#endif /* __IPHONE_8_0 */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* UIAlertView is deprecated in iOS 8+ in favor of UIAlertController. */
|
||||||
|
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000
|
||||||
|
@interface SDLAlertViewDelegate : NSObject <UIAlertViewDelegate>
|
||||||
|
|
||||||
|
@property (nonatomic, assign) int *clickedIndex;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation SDLAlertViewDelegate
|
||||||
|
|
||||||
|
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
|
||||||
|
{
|
||||||
|
if (_clickedIndex != NULL) {
|
||||||
|
*_clickedIndex = (int) buttonIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
#endif /* __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 */
|
||||||
|
|
||||||
|
static BOOL
|
||||||
|
UIKit_ShowMessageBoxAlertView(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||||
|
{
|
||||||
|
/* UIAlertView is deprecated in iOS 8+ in favor of UIAlertController. */
|
||||||
|
#if __IPHONE_OS_VERSION_MIN_REQUIRED < 80000
|
||||||
|
int i;
|
||||||
|
int clickedindex = messageboxdata->numbuttons;
|
||||||
|
const SDL_MessageBoxButtonData *buttons = messageboxdata->buttons;
|
||||||
UIAlertView *alert = [[UIAlertView alloc] init];
|
UIAlertView *alert = [[UIAlertView alloc] init];
|
||||||
SDLAlertViewDelegate *delegate = [[SDLAlertViewDelegate alloc] init];
|
SDLAlertViewDelegate *delegate = [[SDLAlertViewDelegate alloc] init];
|
||||||
|
|
||||||
|
@ -66,26 +151,39 @@ UIKit_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||||
alert.title = @(messageboxdata->title);
|
alert.title = @(messageboxdata->title);
|
||||||
alert.message = @(messageboxdata->message);
|
alert.message = @(messageboxdata->message);
|
||||||
|
|
||||||
for (i = 0; i < messageboxdata->numbuttons; ++i) {
|
for (i = 0; i < messageboxdata->numbuttons; i++) {
|
||||||
[alert addButtonWithTitle:@(buttons[i].text)];
|
[alert addButtonWithTitle:@(buttons[i].text)];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up for showing the alert */
|
delegate.clickedIndex = &clickedindex;
|
||||||
delegate.clickedIndex = messageboxdata->numbuttons;
|
|
||||||
|
|
||||||
[alert show];
|
[alert show];
|
||||||
|
|
||||||
/* Run the main event loop until the alert has finished */
|
UIKit_WaitUntilMessageBoxClosed(messageboxdata, &clickedindex);
|
||||||
/* Note that this needs to be done on the main thread */
|
|
||||||
s_showingMessageBox = SDL_TRUE;
|
|
||||||
while (delegate.clickedIndex == messageboxdata->numbuttons) {
|
|
||||||
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
|
|
||||||
}
|
|
||||||
s_showingMessageBox = SDL_FALSE;
|
|
||||||
|
|
||||||
*buttonid = messageboxdata->buttons[delegate.clickedIndex].buttonid;
|
|
||||||
|
|
||||||
alert.delegate = nil;
|
alert.delegate = nil;
|
||||||
|
|
||||||
|
*buttonid = messageboxdata->buttons[clickedindex].buttonid;
|
||||||
|
return YES;
|
||||||
|
#else
|
||||||
|
return NO;
|
||||||
|
#endif /* __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 */
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
UIKit_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
||||||
|
{
|
||||||
|
BOOL success = NO;
|
||||||
|
|
||||||
|
@autoreleasepool {
|
||||||
|
success = UIKit_ShowMessageBoxAlertController(messageboxdata, buttonid);
|
||||||
|
if (!success) {
|
||||||
|
success = UIKit_ShowMessageBoxAlertView(messageboxdata, buttonid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!success) {
|
||||||
|
return SDL_SetError("Could not show message box.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -52,8 +52,6 @@
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
static int UIKit_GL_Initialize(_THIS);
|
|
||||||
|
|
||||||
void *
|
void *
|
||||||
UIKit_GL_GetProcAddress(_THIS, const char *proc)
|
UIKit_GL_GetProcAddress(_THIS, const char *proc)
|
||||||
{
|
{
|
||||||
|
|
|
@ -47,9 +47,7 @@
|
||||||
- (void)loadView;
|
- (void)loadView;
|
||||||
- (void)viewDidLayoutSubviews;
|
- (void)viewDidLayoutSubviews;
|
||||||
- (NSUInteger)supportedInterfaceOrientations;
|
- (NSUInteger)supportedInterfaceOrientations;
|
||||||
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)orient;
|
|
||||||
- (BOOL)prefersStatusBarHidden;
|
- (BOOL)prefersStatusBarHidden;
|
||||||
- (UIStatusBarStyle)preferredStatusBarStyle;
|
|
||||||
|
|
||||||
#if SDL_IPHONE_KEYBOARD
|
#if SDL_IPHONE_KEYBOARD
|
||||||
- (void)showKeyboard;
|
- (void)showKeyboard;
|
||||||
|
|
|
@ -135,12 +135,6 @@
|
||||||
return (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) != 0;
|
return (window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS)) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (UIStatusBarStyle)preferredStatusBarStyle
|
|
||||||
{
|
|
||||||
/* We assume most SDL apps don't have a bright white background. */
|
|
||||||
return UIStatusBarStyleLightContent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
---- Keyboard related functionality below this line ----
|
---- Keyboard related functionality below this line ----
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue