Only watch for display connect/disconnect events while the video subsystem is initialized

This commit is contained in:
Sam Lantinga 2020-10-09 12:58:28 -07:00
parent 7991cc38bc
commit b546db2f85
2 changed files with 42 additions and 20 deletions

View File

@ -349,14 +349,6 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh)
- (void)postFinishLaunch - (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 /* 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. */ * have a chance to load resources while the launch screen is still up. */
[self performSelector:@selector(hideLaunchScreen) withObject:nil afterDelay:0.0]; [self performSelector:@selector(hideLaunchScreen) withObject:nil afterDelay:0.0];
@ -528,18 +520,6 @@ SDL_LoadLaunchImageNamed(NSString *name, int screenh)
#endif #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 @end
#endif /* SDL_VIDEO_DRIVER_UIKIT */ #endif /* SDL_VIDEO_DRIVER_UIKIT */

View File

@ -181,6 +181,44 @@
@end @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 static int
UIKit_AllocateDisplayModeData(SDL_DisplayMode * mode, UIKit_AllocateDisplayModeData(SDL_DisplayMode * mode,
@ -349,6 +387,8 @@ UIKit_InitModes(_THIS)
#if !TARGET_OS_TV #if !TARGET_OS_TV
SDL_OnApplicationDidChangeStatusBarOrientation(); SDL_OnApplicationDidChangeStatusBarOrientation();
#endif #endif
[SDL_DisplayWatch start];
} }
return 0; return 0;
@ -482,6 +522,8 @@ UIKit_GetDisplayUsableBounds(_THIS, SDL_VideoDisplay * display, SDL_Rect * rect)
void void
UIKit_QuitModes(_THIS) UIKit_QuitModes(_THIS)
{ {
[SDL_DisplayWatch stop];
/* Release Objective-C objects, so higher level doesn't free() them. */ /* Release Objective-C objects, so higher level doesn't free() them. */
int i, j; int i, j;
@autoreleasepool { @autoreleasepool {