SDL: emscripten: Unify creation of Module['SDL3'] in at SDL_Init time. (f9bb0)

From f9bb023eeb0190cfdc24c87690bdfdd4663bfe01 Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Mon, 2 Feb 2026 17:16:20 -0500
Subject: [PATCH] emscripten: Unify creation of Module['SDL3'] in at SDL_Init
 time.

(cherry picked from commit 7d093940a71b395fbbd7e0ac5781007733a2a784)
---
 src/SDL.c                                        | 8 ++++++++
 src/audio/dummy/SDL_dummyaudio.c                 | 3 ---
 src/audio/emscripten/SDL_emscriptenaudio.c       | 3 ---
 src/camera/emscripten/SDL_camera_emscripten.c    | 3 ---
 src/video/emscripten/SDL_emscriptenevents.c      | 7 -------
 src/video/emscripten/SDL_emscriptenframebuffer.c | 1 -
 src/video/emscripten/SDL_emscriptenmouse.c       | 3 ---
 src/video/emscripten/SDL_emscriptenvideo.c       | 4 ----
 8 files changed, 8 insertions(+), 24 deletions(-)

diff --git a/src/SDL.c b/src/SDL.c
index facb204108c81..cf5ff5b2c117c 100644
--- a/src/SDL.c
+++ b/src/SDL.c
@@ -326,6 +326,14 @@ bool SDL_InitSubSystem(SDL_InitFlags flags)
         return SDL_SetError("Application didn't initialize properly, did you include SDL_main.h in the file containing your main() function?");
     }
 
+#ifdef SDL_PLATFORM_EMSCRIPTEN
+    MAIN_THREAD_EM_ASM({
+        if (typeof(Module['SDL3']) === 'undefined') {
+            Module['SDL3'] = {};
+        }
+    });
+#endif
+
     SDL_InitMainThread();
 
 #ifdef SDL_USE_LIBDBUS
diff --git a/src/audio/dummy/SDL_dummyaudio.c b/src/audio/dummy/SDL_dummyaudio.c
index a23dc049a4cae..b325acb7fb75e 100644
--- a/src/audio/dummy/SDL_dummyaudio.c
+++ b/src/audio/dummy/SDL_dummyaudio.c
@@ -116,9 +116,6 @@ static bool DUMMYAUDIO_Init(SDL_AudioDriverImpl *impl)
     // on Emscripten without threads, we just fire a repeating timer to consume audio.
     #if defined(SDL_PLATFORM_EMSCRIPTEN) && !defined(__EMSCRIPTEN_PTHREADS__)
     MAIN_THREAD_EM_ASM({
-        if (typeof(Module['SDL3']) === 'undefined') {
-            Module['SDL3'] = {};
-        }
         Module['SDL3'].dummy_audio = {};
         Module['SDL3'].dummy_audio.timers = [];
         Module['SDL3'].dummy_audio.timers[0] = undefined;
diff --git a/src/audio/emscripten/SDL_emscriptenaudio.c b/src/audio/emscripten/SDL_emscriptenaudio.c
index bc1b877ec49f0..3eaa8e05e039e 100644
--- a/src/audio/emscripten/SDL_emscriptenaudio.c
+++ b/src/audio/emscripten/SDL_emscriptenaudio.c
@@ -151,9 +151,6 @@ static bool EMSCRIPTENAUDIO_OpenDevice(SDL_AudioDevice *device)
 
     // create context
     const bool result = MAIN_THREAD_EM_ASM_INT({
-        if (typeof(Module['SDL3']) === 'undefined') {
-            Module['SDL3'] = {};
-        }
         var SDL3 = Module['SDL3'];
         if (typeof(SDL3.audio_playback) === 'undefined') {
             SDL3.audio_playback = {};
diff --git a/src/camera/emscripten/SDL_camera_emscripten.c b/src/camera/emscripten/SDL_camera_emscripten.c
index 6a13c3a43d7bd..85ff587d3d5b0 100644
--- a/src/camera/emscripten/SDL_camera_emscripten.c
+++ b/src/camera/emscripten/SDL_camera_emscripten.c
@@ -247,9 +247,6 @@ static void EMSCRIPTENCAMERA_DetectDevices(void)
 static bool EMSCRIPTENCAMERA_Init(SDL_CameraDriverImpl *impl)
 {
     MAIN_THREAD_EM_ASM({
-        if (typeof(Module['SDL3']) === 'undefined') {
-            Module['SDL3'] = {};
-        }
         Module['SDL3'].camera = {};
     });
 
diff --git a/src/video/emscripten/SDL_emscriptenevents.c b/src/video/emscripten/SDL_emscriptenevents.c
index cfaeea898e1e2..28e686a66fab5 100644
--- a/src/video/emscripten/SDL_emscriptenevents.c
+++ b/src/video/emscripten/SDL_emscriptenevents.c
@@ -957,9 +957,6 @@ EMSCRIPTEN_KEEPALIVE void Emscripten_HandlePointerGeneric(SDL_WindowData *window
 static void Emscripten_prep_pointer_event_callbacks(void)
 {
     MAIN_THREAD_EM_ASM({
-        if (typeof(Module['SDL3']) === 'undefined') {
-            Module['SDL3'] = {};
-        }
         var SDL3 = Module['SDL3'];
 
         if (SDL3.makePointerEventCStruct === undefined) {
@@ -1166,10 +1163,6 @@ static void Emscripten_set_drag_event_callbacks(SDL_WindowData *data)
         var target = document.querySelector(UTF8ToString($1));
         if (target) {
             var data = $0;
-
-            if (typeof(Module['SDL3']) === 'undefined') {
-                Module['SDL3'] = {};
-            }
             var SDL3 = Module['SDL3'];
 
             var makeDropEventCStruct = function(event) {
diff --git a/src/video/emscripten/SDL_emscriptenframebuffer.c b/src/video/emscripten/SDL_emscriptenframebuffer.c
index 0253237339775..87e00bbeb3a68 100644
--- a/src/video/emscripten/SDL_emscriptenframebuffer.c
+++ b/src/video/emscripten/SDL_emscriptenframebuffer.c
@@ -75,7 +75,6 @@ bool Emscripten_UpdateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *wind
         var canvas = document.querySelector(canvasId);
 
         //TODO: this should store a context per canvas
-        if (!Module['SDL3']) Module['SDL3'] = {};
         var SDL3 = Module['SDL3'];
         if (SDL3.ctxCanvas !== canvas) {
             SDL3.ctx = Browser.createContext(canvas, false, true);
diff --git a/src/video/emscripten/SDL_emscriptenmouse.c b/src/video/emscripten/SDL_emscriptenmouse.c
index 099bbacbd1e4b..c2f4b817a3c8a 100644
--- a/src/video/emscripten/SDL_emscriptenmouse.c
+++ b/src/video/emscripten/SDL_emscriptenmouse.c
@@ -228,9 +228,6 @@ void Emscripten_InitMouse(void)
 
     // Add event listeners to track mouse events on the document
     MAIN_THREAD_EM_ASM({
-        if (!Module['SDL3']) {
-            Module['SDL3'] = {};
-        }
         var SDL3 = Module['SDL3'];
         SDL3['mouse_x'] = 0;
         SDL3['mouse_y'] = 0;
diff --git a/src/video/emscripten/SDL_emscriptenvideo.c b/src/video/emscripten/SDL_emscriptenvideo.c
index d440a2ff77ed2..942809c4a26cc 100644
--- a/src/video/emscripten/SDL_emscriptenvideo.c
+++ b/src/video/emscripten/SDL_emscriptenvideo.c
@@ -101,10 +101,6 @@ static void Emscripten_ListenSystemTheme(void)
 {
     MAIN_THREAD_EM_ASM({
         if (window.matchMedia) {
-            if (typeof(Module['SDL3']) === 'undefined') {
-                Module['SDL3'] = {};
-            }
-
             var SDL3 = Module['SDL3'];
 
             SDL3.eventHandlerThemeChanged = function(event) {