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) {