From 5b13136471e36872741b35dca70ec6f6f0401a7a Mon Sep 17 00:00:00 2001 From: Andrey Filipenkov Date: Sat, 6 Aug 2022 10:48:53 +0300 Subject: [PATCH] [UIKit] handle app lifecycle events in a custom object instead of AppDelegate removes the need to call SDL counterparts manually when custom AppDelegate is used --- src/video/uikit/SDL_uikitappdelegate.m | 37 ------------- src/video/uikit/SDL_uikitevents.m | 74 ++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 37 deletions(-) diff --git a/src/video/uikit/SDL_uikitappdelegate.m b/src/video/uikit/SDL_uikitappdelegate.m index 635ed7615..37bd4c786 100644 --- a/src/video/uikit/SDL_uikitappdelegate.m +++ b/src/video/uikit/SDL_uikitappdelegate.m @@ -434,43 +434,6 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh) /* Do nothing. */ } -#if !TARGET_OS_TV -- (void)application:(UIApplication *)application didChangeStatusBarOrientation:(UIInterfaceOrientation)oldStatusBarOrientation -{ - SDL_OnApplicationDidChangeStatusBarOrientation(); -} -#endif - -- (void)applicationWillTerminate:(UIApplication *)application -{ - SDL_OnApplicationWillTerminate(); -} - -- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application -{ - SDL_OnApplicationDidReceiveMemoryWarning(); -} - -- (void)applicationWillResignActive:(UIApplication*)application -{ - SDL_OnApplicationWillResignActive(); -} - -- (void)applicationDidEnterBackground:(UIApplication*)application -{ - SDL_OnApplicationDidEnterBackground(); -} - -- (void)applicationWillEnterForeground:(UIApplication*)application -{ - SDL_OnApplicationWillEnterForeground(); -} - -- (void)applicationDidBecomeActive:(UIApplication*)application -{ - SDL_OnApplicationDidBecomeActive(); -} - - (void)sendDropFileForURL:(NSURL *)url { NSURL *fileURL = url.filePathURL; diff --git a/src/video/uikit/SDL_uikitevents.m b/src/video/uikit/SDL_uikitevents.m index 286db8f33..61c57b253 100644 --- a/src/video/uikit/SDL_uikitevents.m +++ b/src/video/uikit/SDL_uikitevents.m @@ -41,10 +41,84 @@ static BOOL UIKit_EventPumpEnabled = YES; + +@interface SDL_LifecycleObserver : NSObject +@property (nonatomic, assign) BOOL isObservingNotifications; +@end + +@implementation SDL_LifecycleObserver + +- (void)eventPumpChanged +{ + NSNotificationCenter *notificationCenter = NSNotificationCenter.defaultCenter; + if (UIKit_EventPumpEnabled && !self.isObservingNotifications) { + self.isObservingNotifications = YES; + [notificationCenter addObserver:self selector:@selector(applicationDidBecomeActive) name:UIApplicationDidBecomeActiveNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(applicationWillResignActive) name:UIApplicationWillResignActiveNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(applicationDidEnterBackground) name:UIApplicationDidEnterBackgroundNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(applicationWillEnterForeground) name:UIApplicationWillEnterForegroundNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(applicationWillTerminate) name:UIApplicationWillTerminateNotification object:nil]; + [notificationCenter addObserver:self selector:@selector(applicationDidReceiveMemoryWarning) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; +#if !TARGET_OS_TV + [notificationCenter addObserver:self selector:@selector(applicationDidChangeStatusBarOrientation) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; +#endif + } else if (!UIKit_EventPumpEnabled && self.isObservingNotifications) { + self.isObservingNotifications = NO; + [notificationCenter removeObserver:self]; + } +} + +- (void)applicationDidBecomeActive +{ + SDL_OnApplicationDidBecomeActive(); +} + +- (void)applicationWillResignActive +{ + SDL_OnApplicationWillResignActive(); +} + +- (void)applicationDidEnterBackground +{ + SDL_OnApplicationDidEnterBackground(); +} + +- (void)applicationWillEnterForeground +{ + SDL_OnApplicationWillEnterForeground(); +} + +- (void)applicationWillTerminate +{ + SDL_OnApplicationWillTerminate(); +} + +- (void)applicationDidReceiveMemoryWarning +{ + SDL_OnApplicationDidReceiveMemoryWarning(); +} + +#if !TARGET_OS_TV +- (void)applicationDidChangeStatusBarOrientation +{ + SDL_OnApplicationDidChangeStatusBarOrientation(); +} +#endif + +@end + + void SDL_iPhoneSetEventPump(SDL_bool enabled) { UIKit_EventPumpEnabled = enabled; + + static SDL_LifecycleObserver *lifecycleObserver; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + lifecycleObserver = [SDL_LifecycleObserver new]; + }); + [lifecycleObserver eventPumpChanged]; } void