SDL OSX implementation must account for the fact that going fullscreen can fail. improve the logic around retrying, make a few attempts before failing.

This commit is contained in:
Sam Lantinga 2015-11-09 08:54:49 -08:00
parent 2d884656c4
commit 792354d6f0
2 changed files with 28 additions and 20 deletions

View File

@ -1140,7 +1140,9 @@ SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool fullscreen)
#ifdef __MACOSX__ #ifdef __MACOSX__
/* If we're switching between a fullscreen Space and "normal" fullscreen, we need to get back to normal first. */ /* If we're switching between a fullscreen Space and "normal" fullscreen, we need to get back to normal first. */
if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN)) { if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN)) {
Cocoa_SetWindowFullscreenSpace(window, SDL_FALSE); if (!Cocoa_SetWindowFullscreenSpace(window, SDL_FALSE)) {
return -1;
}
} else if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)) { } else if (fullscreen && ((window->last_fullscreen_flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN) && ((window->flags & FULLSCREEN_MASK) == SDL_WINDOW_FULLSCREEN_DESKTOP)) {
display = SDL_GetDisplayForWindow(window); display = SDL_GetDisplayForWindow(window);
SDL_SetDisplayModeForDisplay(display, NULL); SDL_SetDisplayModeForDisplay(display, NULL);
@ -1150,6 +1152,9 @@ SDL_UpdateFullscreenMode(SDL_Window * window, SDL_bool fullscreen)
} }
if (Cocoa_SetWindowFullscreenSpace(window, fullscreen)) { if (Cocoa_SetWindowFullscreenSpace(window, fullscreen)) {
if (Cocoa_IsWindowInFullscreenSpace(window) != fullscreen) {
return -1;
}
window->last_fullscreen_flags = window->flags; window->last_fullscreen_flags = window->flags;
return 0; return 0;
} }

View File

@ -646,9 +646,6 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
isFullscreenSpace = NO; isFullscreenSpace = NO;
inFullscreenTransition = NO; inFullscreenTransition = NO;
/* Try again? Not sure what else to do, the application wants to be fullscreen. */
[self setFullscreenSpace:YES];
} }
- (void)windowDidEnterFullScreen:(NSNotification *)aNotification - (void)windowDidEnterFullScreen:(NSNotification *)aNotification
@ -693,9 +690,6 @@ SetWindowStyle(SDL_Window * window, unsigned int style)
isFullscreenSpace = YES; isFullscreenSpace = YES;
inFullscreenTransition = NO; inFullscreenTransition = NO;
/* Try again? Not sure what else to do, the application wants to be non-fullscreen. */
[self setFullscreenSpace:NO];
} }
- (void)windowDidExitFullScreen:(NSNotification *)aNotification - (void)windowDidExitFullScreen:(NSNotification *)aNotification
@ -1704,21 +1698,30 @@ Cocoa_SetWindowFullscreenSpace(SDL_Window * window, SDL_bool state)
SDL_WindowData *data = (SDL_WindowData *) window->driverdata; SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
if ([data->listener setFullscreenSpace:(state ? YES : NO)]) { if ([data->listener setFullscreenSpace:(state ? YES : NO)]) {
succeeded = SDL_TRUE; const int maxattempts = 3;
int attempt = 0;
/* Wait for the transition to complete, so application changes while (++attempt <= maxattempts) {
take effect properly (e.g. setting the window size, etc.) /* Wait for the transition to complete, so application changes
*/ take effect properly (e.g. setting the window size, etc.)
const int limit = 10000; */
int count = 0; const int limit = 10000;
while ([data->listener isInFullscreenSpaceTransition]) { int count = 0;
if ( ++count == limit ) { while ([data->listener isInFullscreenSpaceTransition]) {
/* Uh oh, transition isn't completing. Should we assert? */ if ( ++count == limit ) {
break; /* Uh oh, transition isn't completing. Should we assert? */
break;
}
SDL_Delay(1);
SDL_PumpEvents();
} }
SDL_Delay(1); if ([data->listener isInFullscreenSpace] == (state ? YES : NO))
SDL_PumpEvents(); break;
/* Try again, the last attempt was interrupted by user gestures */
if (![data->listener setFullscreenSpace:(state ? YES : NO)])
break; /* ??? */
} }
/* Return TRUE to prevent non-space fullscreen logic from running */
succeeded = SDL_TRUE;
} }
return succeeded; return succeeded;