|
@@ -24,15 +24,103 @@
|
|
|
|
|
|
#include "SDL.h"
|
|
|
#include "SDL_uikitvideo.h"
|
|
|
-
|
|
|
+#include "SDL_uikitwindow.h"
|
|
|
|
|
|
/* Display a UIKit message box */
|
|
|
|
|
|
static SDL_bool s_showingMessageBox = SDL_FALSE;
|
|
|
|
|
|
+SDL_bool
|
|
|
+UIKit_ShowingMessageBox()
|
|
|
+{
|
|
|
+ return s_showingMessageBox;
|
|
|
+}
|
|
|
+
|
|
|
+static void
|
|
|
+UIKit_WaitUntilMessageBoxClosed(const SDL_MessageBoxData *messageboxdata, int *clickedindex)
|
|
|
+{
|
|
|
+ *clickedindex = messageboxdata->numbuttons;
|
|
|
+
|
|
|
+ @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;
|
|
|
+@property (nonatomic, assign) int *clickedIndex;
|
|
|
|
|
|
@end
|
|
|
|
|
@@ -40,52 +128,62 @@ static SDL_bool s_showingMessageBox = SDL_FALSE;
|
|
|
|
|
|
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
|
|
|
{
|
|
|
- _clickedIndex = (int)buttonIndex;
|
|
|
+ if (_clickedIndex != NULL) {
|
|
|
+ *_clickedIndex = (int) buttonIndex;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@end
|
|
|
+#endif /* __IPHONE_OS_VERSION_MIN_REQUIRED < 80000 */
|
|
|
|
|
|
-
|
|
|
-SDL_bool
|
|
|
-UIKit_ShowingMessageBox()
|
|
|
-{
|
|
|
- return s_showingMessageBox;
|
|
|
-}
|
|
|
-
|
|
|
-int
|
|
|
-UIKit_ShowMessageBox(const SDL_MessageBoxData *messageboxdata, int *buttonid)
|
|
|
+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];
|
|
|
+ SDLAlertViewDelegate *delegate = [[SDLAlertViewDelegate alloc] init];
|
|
|
|
|
|
- @autoreleasepool {
|
|
|
- UIAlertView *alert = [[UIAlertView alloc] init];
|
|
|
- SDLAlertViewDelegate *delegate = [[SDLAlertViewDelegate alloc] init];
|
|
|
+ alert.delegate = delegate;
|
|
|
+ alert.title = @(messageboxdata->title);
|
|
|
+ alert.message = @(messageboxdata->message);
|
|
|
|
|
|
- alert.delegate = delegate;
|
|
|
- alert.title = @(messageboxdata->title);
|
|
|
- alert.message = @(messageboxdata->message);
|
|
|
+ for (i = 0; i < messageboxdata->numbuttons; i++) {
|
|
|
+ [alert addButtonWithTitle:@(buttons[i].text)];
|
|
|
+ }
|
|
|
|
|
|
- for (i = 0; i < messageboxdata->numbuttons; ++i) {
|
|
|
- [alert addButtonWithTitle:@(buttons[i].text)];
|
|
|
- }
|
|
|
+ delegate.clickedIndex = &clickedindex;
|
|
|
|
|
|
- /* Set up for showing the alert */
|
|
|
- delegate.clickedIndex = messageboxdata->numbuttons;
|
|
|
+ [alert show];
|
|
|
|
|
|
- [alert show];
|
|
|
+ UIKit_WaitUntilMessageBoxClosed(messageboxdata, &clickedindex);
|
|
|
|
|
|
- /* 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 (delegate.clickedIndex == messageboxdata->numbuttons) {
|
|
|
- [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
|
|
|
- }
|
|
|
- s_showingMessageBox = SDL_FALSE;
|
|
|
+ alert.delegate = nil;
|
|
|
|
|
|
- *buttonid = messageboxdata->buttons[delegate.clickedIndex].buttonid;
|
|
|
+ *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);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- alert.delegate = nil;
|
|
|
+ if (!success) {
|
|
|
+ return SDL_SetError("Could not show message box.");
|
|
|
}
|
|
|
|
|
|
return 0;
|