diff --git a/src/video/emscripten/SDL_emscriptenevents.c b/src/video/emscripten/SDL_emscriptenevents.c index 66cb71c2b1..938acb2523 100644 --- a/src/video/emscripten/SDL_emscriptenevents.c +++ b/src/video/emscripten/SDL_emscriptenevents.c @@ -480,6 +480,8 @@ static EM_BOOL Emscripten_HandleFullscreenChange(int eventType, const Emscripten { SDL_WindowData *window_data = userData; + window_data->fullscreen_change_in_progress = false; + if (fullscreenChangeEvent->isFullscreen) { SDL_SendWindowEvent(window_data->window, SDL_EVENT_WINDOW_ENTER_FULLSCREEN, 0, 0); window_data->fullscreen_mode_flags = 0; diff --git a/src/video/emscripten/SDL_emscriptenvideo.c b/src/video/emscripten/SDL_emscriptenvideo.c index dc3a968090..a9a5d2eef0 100644 --- a/src/video/emscripten/SDL_emscriptenvideo.c +++ b/src/video/emscripten/SDL_emscriptenvideo.c @@ -674,6 +674,17 @@ static SDL_FullscreenResult Emscripten_SetWindowFullscreen(SDL_VideoDevice *_thi if (window->internal) { data = window->internal; + if (data->fullscreen_change_in_progress) { + return SDL_FULLSCREEN_FAILED;; + } + + EmscriptenFullscreenChangeEvent fsevent; + if (emscripten_get_fullscreen_status(&fsevent) == EMSCRIPTEN_RESULT_SUCCESS) { + if ((fullscreen == SDL_FULLSCREEN_OP_ENTER) == fsevent.isFullscreen) { + return SDL_FULLSCREEN_SUCCEEDED; // already there. + } + } + if (fullscreen) { EmscriptenFullscreenStrategy strategy; bool is_fullscreen_desktop = !window->fullscreen_exclusive; @@ -704,8 +715,10 @@ static SDL_FullscreenResult Emscripten_SetWindowFullscreen(SDL_VideoDevice *_thi } if (res == EMSCRIPTEN_RESULT_SUCCESS) { + data->fullscreen_change_in_progress = true; // even on success, this might animate to the new state. return SDL_FULLSCREEN_SUCCEEDED; } else if (res == EMSCRIPTEN_RESULT_DEFERRED) { + data->fullscreen_change_in_progress = true; return SDL_FULLSCREEN_PENDING; } else { return SDL_FULLSCREEN_FAILED; diff --git a/src/video/emscripten/SDL_emscriptenvideo.h b/src/video/emscripten/SDL_emscriptenvideo.h index 4abe2cf5f7..03ba2635ef 100644 --- a/src/video/emscripten/SDL_emscriptenvideo.h +++ b/src/video/emscripten/SDL_emscriptenvideo.h @@ -46,6 +46,7 @@ struct SDL_WindowData Uint32 fullscreen_mode_flags; bool fullscreen_resize; + bool fullscreen_change_in_progress; bool has_pointer_lock;