From cb190b8270a08c0aa166187810997059137946b0 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Mon, 11 Nov 2013 22:43:05 -0800 Subject: [PATCH] Fixed assertion when quickly toggling from fullscreen back to fullscreen: "Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'backgroundWindows not nil in enterFullScreenTransitionWithOptions:animated:activatingIt:'" To reproduce this, run testsprite2, press Alt-Enter once, again while it's animating to fullscreen, and then again while it's animating out of fullscreen. --- src/video/cocoa/SDL_cocoawindow.m | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/src/video/cocoa/SDL_cocoawindow.m b/src/video/cocoa/SDL_cocoawindow.m index be6f6cf29d978..1cd9b63a7eadd 100644 --- a/src/video/cocoa/SDL_cocoawindow.m +++ b/src/video/cocoa/SDL_cocoawindow.m @@ -184,10 +184,6 @@ -(void) resumeVisibleObservation } } --(BOOL) canSetFullscreenState:(BOOL) state; -{ -} - -(BOOL) setFullscreenState:(BOOL) state; { SDL_Window *window = _data->window; @@ -228,7 +224,7 @@ -(BOOL) setFullscreenState:(BOOL) state; return YES; } - [nswindow performSelector: @selector(toggleFullScreen:) withObject:nswindow]; + [nswindow performSelectorOnMainThread: @selector(toggleFullScreen:) withObject:nswindow waitUntilDone:NO]; return YES; } @@ -433,12 +429,15 @@ - (void)windowWillEnterFullScreen:(NSNotification *)aNotification [nswindow setStyleMask:NSBorderlessWindowMask]; } } + isFullscreen = YES; inFullscreenTransition = YES; } - (void)windowDidEnterFullScreen:(NSNotification *)aNotification { + SDL_Window *window = _data->window; + inFullscreenTransition = NO; if (pendingWindowOperation == PENDING_OPERATION_LEAVE_FULLSCREEN) { @@ -446,6 +445,11 @@ - (void)windowDidEnterFullScreen:(NSNotification *)aNotification [self setFullscreenState:NO]; } else { pendingWindowOperation = PENDING_OPERATION_NONE; + /* Force the size change event in case it was delivered earlier + while the window was still animating into place. + */ + window->w = 0; + window->h = 0; [self windowDidResize:aNotification]; } } @@ -465,6 +469,7 @@ - (void)windowWillExitFullScreen:(NSNotification *)aNotification - (void)windowDidExitFullScreen:(NSNotification *)aNotification { + SDL_Window *window = _data->window; NSWindow *nswindow = _data->nswindow; inFullscreenTransition = NO; @@ -477,6 +482,11 @@ - (void)windowDidExitFullScreen:(NSNotification *)aNotification [nswindow miniaturize:nil]; } else { pendingWindowOperation = PENDING_OPERATION_NONE; + /* Force the size change event in case it was delivered earlier + while the window was still animating into place. + */ + window->w = 0; + window->h = 0; [self windowDidResize:aNotification]; } }