From b546db2f854e885100bcb67991418cfff815ead2 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 9 Oct 2020 12:58:28 -0700 Subject: [PATCH] Only watch for display connect/disconnect events while the video subsystem is initialized --- src/video/uikit/SDL_uikitappdelegate.m | 20 ------------ src/video/uikit/SDL_uikitmodes.m | 42 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 20 deletions(-) diff --git a/src/video/uikit/SDL_uikitappdelegate.m b/src/video/uikit/SDL_uikitappdelegate.m index a38f00b2a..5cc7b1e48 100644 --- a/src/video/uikit/SDL_uikitappdelegate.m +++ b/src/video/uikit/SDL_uikitappdelegate.m @@ -349,14 +349,6 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh) - (void)postFinishLaunch { - NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; - - [center addObserver:self selector:@selector(handleScreenDidConnectNotification:) - name:UIScreenDidConnectNotification object:nil]; - [center addObserver:self selector:@selector(handleScreenDidDisconnectNotification:) - name:UIScreenDidDisconnectNotification object:nil]; - - /* Hide the launch screen the next time the run loop is run. SDL apps will * have a chance to load resources while the launch screen is still up. */ [self performSelector:@selector(hideLaunchScreen) withObject:nil afterDelay:0.0]; @@ -528,18 +520,6 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh) #endif -- (void)handleScreenDidConnectNotification:(NSNotification*)aNotification -{ - UIScreen *uiscreen = [aNotification object]; - UIKit_AddDisplay(uiscreen, SDL_TRUE); -} - -- (void)handleScreenDidDisconnectNotification:(NSNotification*)aNotification -{ - UIScreen *uiscreen = [aNotification object]; - UIKit_DelDisplay(uiscreen); -} - @end #endif /* SDL_VIDEO_DRIVER_UIKIT */ diff --git a/src/video/uikit/SDL_uikitmodes.m b/src/video/uikit/SDL_uikitmodes.m index e978c1054..98e470c9d 100644 --- a/src/video/uikit/SDL_uikitmodes.m +++ b/src/video/uikit/SDL_uikitmodes.m @@ -181,6 +181,44 @@ @end +@interface SDL_DisplayWatch : NSObject +@end + +@implementation SDL_DisplayWatch + ++ (void)start +{ + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + + [center addObserver:self selector:@selector(screenConnected:) + name:UIScreenDidConnectNotification object:nil]; + [center addObserver:self selector:@selector(screenDisconnected:) + name:UIScreenDidDisconnectNotification object:nil]; +} + ++ (void)stop +{ + NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; + + [center removeObserver:self + name:UIScreenDidConnectNotification object:nil]; + [center removeObserver:self + name:UIScreenDidDisconnectNotification object:nil]; +} + ++ (void)screenConnected:(NSNotification*)notification +{ + UIScreen *uiscreen = [notification object]; + UIKit_AddDisplay(uiscreen, SDL_TRUE); +} + ++ (void)screenDisconnected:(NSNotification*)notification +{ + UIScreen *uiscreen = [notification object]; + UIKit_DelDisplay(uiscreen); +} + +@end static int UIKit_AllocateDisplayModeData(SDL_DisplayMode * mode, @@ -349,6 +387,8 @@ UIKit_InitModes(_THIS) #if !TARGET_OS_TV SDL_OnApplicationDidChangeStatusBarOrientation(); #endif + + [SDL_DisplayWatch start]; } return 0; @@ -482,6 +522,8 @@ UIKit_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect) void UIKit_QuitModes(_THIS) { + [SDL_DisplayWatch stop]; + /* Release Objective-C objects, so higher level doesn't free() them. */ int i, j; @autoreleasepool {