diff --git a/frontend/frontend_ios.c b/frontend/frontend_ios.c
index 9b80a511b6..9748afef13 100644
--- a/frontend/frontend_ios.c
+++ b/frontend/frontend_ios.c
@@ -14,6 +14,9 @@
* If not, see .
*/
+#include
+
+#include "../ios/RetroArch/rarch_wrapper.h"
#include "../general.h"
#include "../conf/config_file.h"
#include "../file.h"
@@ -22,7 +25,7 @@
#include "../frontend/menu/rgui.h"
#endif
-void ios_free_main_wrap(struct rarch_main_wrap* wrap)
+static void ios_free_main_wrap(struct rarch_main_wrap* wrap)
{
if (wrap)
{
@@ -38,13 +41,15 @@ void ios_free_main_wrap(struct rarch_main_wrap* wrap)
void rarch_main_ios(void* args)
{
- rarch_init_msg_queue();
- menu_init();
+ struct rarch_main_wrap* argdata = (struct rarch_main_wrap*)args;
+ int init_ret = rarch_main_init_wrap(argdata);
+ ios_free_main_wrap(argdata);
-
- int init_ret;
- if ((init_ret = rarch_main_init_wrap((struct rarch_main_wrap*)args))) return;
- ios_free_main_wrap(args);
+ if (init_ret)
+ {
+ dispatch_async_f(dispatch_get_main_queue(), (void*)1, ios_rarch_exited);
+ return;
+ }
#ifdef HAVE_RGUI
menu_init();
@@ -110,4 +115,6 @@ void rarch_main_ios(void* args)
#endif
rarch_main_clear_state();
+
+ dispatch_async_f(dispatch_get_main_queue(), 0, ios_rarch_exited);
}
diff --git a/ios/RetroArch/RetroArch_iOS.m b/ios/RetroArch/RetroArch_iOS.m
index 539dc9e56c..6891ea802a 100644
--- a/ios/RetroArch/RetroArch_iOS.m
+++ b/ios/RetroArch/RetroArch_iOS.m
@@ -30,7 +30,6 @@
// From frontend/frontend_ios.c
extern void rarch_main_ios(void* args);
-extern void ios_free_main_wrap(struct rarch_main_wrap* wrap);
@implementation RetroArch_iOS
{
@@ -144,17 +143,17 @@ extern void ios_free_main_wrap(struct rarch_main_wrap* wrap);
config_file_free(conf);
}
-#if 0
-- (void)closeGame
+- (void)rarchExited:(BOOL)successful
{
+ if (!successful)
+ {
+ [RetroArch_iOS displayErrorMessage:@"Failed to load game."];
+ }
+
if (_isRunning)
{
_isRunning = false;
-
- rarch_main_deinit();
- rarch_deinit_msg_queue();
- rarch_main_clear_state();
-
+
// Stop bluetooth (might be annoying but forgetting could eat battery of device AND wiimote)
[self stopBluetooth];
@@ -163,7 +162,6 @@ extern void ios_free_main_wrap(struct rarch_main_wrap* wrap);
[self popViewControllerAnimated:NO];
}
}
-#endif
- (void)refreshConfig
{
@@ -285,3 +283,7 @@ extern void ios_free_main_wrap(struct rarch_main_wrap* wrap);
@end
+void ios_rarch_exited(void* result)
+{
+ [[RetroArch_iOS get] rarchExited:result ? NO : YES];
+}
diff --git a/ios/RetroArch/rarch_wrapper.h b/ios/RetroArch/rarch_wrapper.h
index bde784b4ca..e191e5a356 100644
--- a/ios/RetroArch/rarch_wrapper.h
+++ b/ios/RetroArch/rarch_wrapper.h
@@ -16,8 +16,10 @@
#ifndef __IOS_RARCH_WRAPPER_H__
#define __IOS_RARCH_WRAPPER_H__
-// These functions must only be called in gfx/context/ioseagl_ctx.c
+// These functions should only be called as arguments to dispatch_sync
+void ios_rarch_exited(void* result);
+// These functions must only be called in gfx/context/ioseagl_ctx.c
bool ios_init_game_view();
void ios_destroy_game_view();
void ios_flip_game_view();