From 10ace666e1be45efbee7f3b01508dffb46af86af Mon Sep 17 00:00:00 2001
From: warmenhoven <eric@warmenhoven.org>
Date: Thu, 26 Jan 2023 14:10:01 -0500
Subject: [PATCH] On iOS, pause while in background (#14907)

---
 .../project.pbxproj                           |  4 +++
 ui/drivers/ui_cocoatouch.m                    | 36 +++++++++++++++----
 2 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/pkg/apple/RetroArch_iOS11_Metal.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS11_Metal.xcodeproj/project.pbxproj
index 51d28ebe19..d990e52cf5 100644
--- a/pkg/apple/RetroArch_iOS11_Metal.xcodeproj/project.pbxproj
+++ b/pkg/apple/RetroArch_iOS11_Metal.xcodeproj/project.pbxproj
@@ -1405,6 +1405,8 @@
 					"-DHAVE_PATCH",
 					"-DHAVE_UPDATE_CORE_INFO",
 					"-DHAVE_VULKAN",
+					"-D_7ZIP_ST",
+					"-DHAVE_7ZIP",
 				);
 				PRODUCT_BUNDLE_IDENTIFIER = com.libretro.dist.ios.RetroArch;
 				PRODUCT_NAME = RetroArch;
@@ -1513,6 +1515,8 @@
 					"-DHAVE_PATCH",
 					"-DHAVE_UPDATE_CORE_INFO",
 					"-DHAVE_VULKAN",
+					"-D_7ZIP_ST",
+					"-DHAVE_7ZIP",
 				);
 				"OTHER_CFLAGS[arch=*]" = (
 					"-DNS_BLOCK_ASSERTIONS=1",
diff --git a/ui/drivers/ui_cocoatouch.m b/ui/drivers/ui_cocoatouch.m
index 615de9f4f9..cd272686bb 100644
--- a/ui/drivers/ui_cocoatouch.m
+++ b/ui/drivers/ui_cocoatouch.m
@@ -75,6 +75,27 @@ static void rarch_draw_observer(CFRunLoopObserverRef observer,
       CFRunLoopWakeUp(CFRunLoopGetMain());
 }
 
+static void rarch_start_draw_observer()
+{
+   if (iterate_observer && CFRunLoopObserverIsValid(iterate_observer))
+       return;
+
+   if (iterate_observer != NULL)
+      CFRelease(iterate_observer);
+   iterate_observer = CFRunLoopObserverCreate(0, kCFRunLoopBeforeWaiting,
+                                              true, 0, rarch_draw_observer, 0);
+   CFRunLoopAddObserver(CFRunLoopGetMain(), iterate_observer, kCFRunLoopCommonModes);
+}
+
+static void rarch_stop_draw_observer()
+{
+    if (!iterate_observer || !CFRunLoopObserverIsValid(iterate_observer))
+        return;
+    CFRunLoopObserverInvalidate(iterate_observer);
+    CFRelease(iterate_observer);
+    iterate_observer = NULL;
+}
+
 apple_frontend_settings_t apple_frontend_settings;
 
 void get_ios_version(int *major, int *minor)
@@ -417,9 +438,7 @@ enum
 
    rarch_main(argc, argv, NULL);
 
-   iterate_observer = CFRunLoopObserverCreate(0, kCFRunLoopBeforeWaiting,
-         true, 0, rarch_draw_observer, 0);
-   CFRunLoopAddObserver(CFRunLoopGetMain(), iterate_observer, kCFRunLoopCommonModes);
+   rarch_start_draw_observer();
 
 #ifdef HAVE_MFI
    extern void *apple_gamecontroller_joypad_init(void *data);
@@ -427,17 +446,20 @@ enum
 #endif
 }
 
-- (void)applicationDidEnterBackground:(UIApplication *)application { }
+- (void)applicationDidEnterBackground:(UIApplication *)application
+{
+   rarch_stop_draw_observer();
+}
 
 - (void)applicationWillTerminate:(UIApplication *)application
 {
-   CFRunLoopObserverInvalidate(iterate_observer);
-   CFRelease(iterate_observer);
-   iterate_observer = NULL;
+   rarch_stop_draw_observer();
+   retroarch_main_quit();
 }
 
 - (void)applicationDidBecomeActive:(UIApplication *)application
 {
+   rarch_start_draw_observer();
    settings_t *settings            = config_get_ptr();
    bool ui_companion_start_on_boot = settings->bools.ui_companion_start_on_boot;