From 737be31c63fb170f9c2853725fdcc4fb34989c2f Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Mon, 1 Dec 2025 23:33:30 -0500
Subject: [PATCH] emscripten: Prevent fullscreen transitions while one is
already in progress.
Fixes #14533.
---
src/video/emscripten/SDL_emscriptenevents.c | 2 ++
src/video/emscripten/SDL_emscriptenvideo.c | 13 +++++++++++++
src/video/emscripten/SDL_emscriptenvideo.h | 1 +
3 files changed, 16 insertions(+)
diff --git a/src/video/emscripten/SDL_emscriptenevents.c b/src/video/emscripten/SDL_emscriptenevents.c
index 66cb71c2b1861..938acb2523849 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 dc3a9680905d1..a9a5d2eef0274 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 4abe2cf5f708c..03ba2635ef11f 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;