Skip to content

Commit 23dbf74

Browse files
committed
Remove singletons from Emscripten code
1 parent a23f974 commit 23dbf74

File tree

4 files changed

+184
-65
lines changed

4 files changed

+184
-65
lines changed

src/video/emscripten/SDL_emscriptenevents.c

Lines changed: 97 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -794,14 +794,26 @@ EMSCRIPTEN_KEEPALIVE void Emscripten_HandlePointerGeneric(SDL_WindowData *window
794794
static void Emscripten_set_pointer_event_callbacks(SDL_WindowData *data)
795795
{
796796
MAIN_THREAD_EM_ASM({
797-
var target = document.querySelector(UTF8ToString($1));
797+
var id = UTF8ToString($1);
798+
var target = document.querySelector(id);
798799
if (target) {
799800
var data = $0;
800801

801-
if (typeof(Module['SDL3']) === 'undefined') {
802+
if (!Module['SDL3']) {
802803
Module['SDL3'] = {};
803804
}
805+
804806
var SDL3 = Module['SDL3'];
807+
if (!SDL3['window_data']) {
808+
SDL3['window_data'] = {};
809+
}
810+
811+
var window_datas = SDL3['window_data'];
812+
if (!window_datas[id]) {
813+
window_datas[id] = {};
814+
}
815+
816+
var window_data = window_datas[id];
805817

806818
var makePointerEventCStruct = function(event) {
807819
var ptr = 0;
@@ -827,42 +839,45 @@ static void Emscripten_set_pointer_event_callbacks(SDL_WindowData *data)
827839
return ptr;
828840
};
829841

830-
SDL3.eventHandlerPointerEnter = function(event) {
842+
window_data.eventHandlerPointerEnter = function(event) {
831843
var d = makePointerEventCStruct(event); if (d != 0) { _Emscripten_HandlePointerEnter(data, d); _SDL_free(d); }
832844
};
833-
target.addEventListener("pointerenter", SDL3.eventHandlerPointerEnter);
845+
target.addEventListener("pointerenter", window_data.eventHandlerPointerEnter);
834846

835-
SDL3.eventHandlerPointerLeave = function(event) {
847+
window_data.eventHandlerPointerLeave = function(event) {
836848
var d = makePointerEventCStruct(event); if (d != 0) { _Emscripten_HandlePointerLeave(data, d); _SDL_free(d); }
837849
};
838-
target.addEventListener("pointerleave", SDL3.eventHandlerPointerLeave);
839-
target.addEventListener("pointercancel", SDL3.eventHandlerPointerLeave); // catch this, just in case.
850+
target.addEventListener("pointerleave", window_data.eventHandlerPointerLeave);
851+
target.addEventListener("pointercancel", window_data.eventHandlerPointerLeave); // catch this, just in case.
840852

841-
SDL3.eventHandlerPointerGeneric = function(event) {
853+
window_data.eventHandlerPointerGeneric = function(event) {
842854
var d = makePointerEventCStruct(event); if (d != 0) { _Emscripten_HandlePointerGeneric(data, d); _SDL_free(d); }
843855
};
844-
target.addEventListener("pointerdown", SDL3.eventHandlerPointerGeneric);
845-
target.addEventListener("pointerup", SDL3.eventHandlerPointerGeneric);
846-
target.addEventListener("pointermove", SDL3.eventHandlerPointerGeneric);
856+
target.addEventListener("pointerdown", window_data.eventHandlerPointerGeneric);
857+
target.addEventListener("pointerup", window_data.eventHandlerPointerGeneric);
858+
target.addEventListener("pointermove", window_data.eventHandlerPointerGeneric);
847859
}
848860
}, data, data->canvas_id, sizeof (Emscripten_PointerEvent));
849861
}
850862

851863
static void Emscripten_unset_pointer_event_callbacks(SDL_WindowData *data)
852864
{
853865
MAIN_THREAD_EM_ASM({
854-
var target = document.querySelector(UTF8ToString($0));
866+
var id = UTF8ToString($0);
867+
var target = document.querySelector(id);
855868
if (target) {
856869
var SDL3 = Module['SDL3'];
857-
target.removeEventListener("pointerenter", SDL3.eventHandlerPointerEnter);
858-
target.removeEventListener("pointerleave", SDL3.eventHandlerPointerLeave);
859-
target.removeEventListener("pointercancel", SDL3.eventHandlerPointerLeave);
860-
target.removeEventListener("pointerdown", SDL3.eventHandlerPointerGeneric);
861-
target.removeEventListener("pointerup", SDL3.eventHandlerPointerGeneric);
862-
target.removeEventListener("pointermove", SDL3.eventHandlerPointerGeneric);
863-
SDL3.eventHandlerPointerEnter = undefined;
864-
SDL3.eventHandlerPointerLeave = undefined;
865-
SDL3.eventHandlerPointerGeneric = undefined;
870+
var window_datas = SDL3['window_data'];
871+
var window_data = window_datas[id];
872+
target.removeEventListener("pointerenter", window_data.eventHandlerPointerEnter);
873+
target.removeEventListener("pointerleave", window_data.eventHandlerPointerLeave);
874+
target.removeEventListener("pointercancel", window_data.eventHandlerPointerLeave);
875+
target.removeEventListener("pointerdown", window_data.eventHandlerPointerGeneric);
876+
target.removeEventListener("pointerup", window_data.eventHandlerPointerGeneric);
877+
target.removeEventListener("pointermove", window_data.eventHandlerPointerGeneric);
878+
window_data.eventHandlerPointerEnter = undefined;
879+
window_data.eventHandlerPointerLeave = undefined;
880+
window_data.eventHandlerPointerGeneric = undefined;
866881
}
867882
}, data->canvas_id);
868883
}
@@ -899,14 +914,26 @@ EM_JS_DEPS(dragndrop, "$writeArrayToMemory");
899914
static void Emscripten_set_drag_event_callbacks(SDL_WindowData *data)
900915
{
901916
MAIN_THREAD_EM_ASM({
902-
var target = document.querySelector(UTF8ToString($1));
917+
var id = UTF8ToString($1);
918+
var target = document.querySelector(id);
903919
if (target) {
904920
var data = $0;
905921

906-
if (typeof(Module['SDL3']) === 'undefined') {
922+
if (!Module['SDL3']) {
907923
Module['SDL3'] = {};
908924
}
925+
909926
var SDL3 = Module['SDL3'];
927+
if (!SDL3['window_data']) {
928+
SDL3['window_data'] = {};
929+
}
930+
931+
var window_datas = SDL3['window_data'];
932+
if (!window_datas[id]) {
933+
window_datas[id] = {};
934+
}
935+
936+
var window_data = window_datas[id];
910937

911938
var makeDropEventCStruct = function(event) {
912939
var ptr = 0;
@@ -920,15 +947,23 @@ static void Emscripten_set_drag_event_callbacks(SDL_WindowData *data)
920947
return ptr;
921948
};
922949

923-
SDL3.eventHandlerDropDragover = function(event) {
950+
window_data.eventHandlerDropDragover = function(event) {
924951
event.preventDefault();
925952
var d = makeDropEventCStruct(event); if (d != 0) { _Emscripten_SendDragEvent(data, d); _SDL_free(d); }
926953
};
927-
target.addEventListener("dragover", SDL3.eventHandlerDropDragover);
954+
target.addEventListener("dragover", window_data.eventHandlerDropDragover);
955+
956+
window_data.drop_count = 0;
957+
try
958+
{
959+
FS.mkdir("/tmp/filedrop")
960+
}
961+
catch(e)
962+
{
963+
// Throws if the directory already exists
964+
}
928965

929-
SDL3.drop_count = 0;
930-
FS.mkdir("/tmp/filedrop");
931-
SDL3.eventHandlerDropDrop = function(event) {
966+
window_data.eventHandlerDropDrop = function(event) {
932967
event.preventDefault();
933968
if (event.dataTransfer.types.includes("text/plain")) {
934969
let plain_text = stringToNewUTF8(event.dataTransfer.getData("text/plain"));
@@ -940,8 +975,8 @@ static void Emscripten_set_drag_event_callbacks(SDL_WindowData *data)
940975
const file_reader = new FileReader();
941976
file_reader.readAsArrayBuffer(file);
942977
file_reader.onload = function(event) {
943-
const fs_dropdir = `/tmp/filedrop/${SDL3.drop_count}`;
944-
SDL3.drop_count += 1;
978+
const fs_dropdir = `/tmp/filedrop/${window_data.drop_count}`;
979+
window_data.drop_count += 1;
945980

946981
const fs_filepath = `${fs_dropdir}/${file.name}`;
947982
const c_fs_filepath = stringToNewUTF8(fs_filepath);
@@ -960,29 +995,44 @@ static void Emscripten_set_drag_event_callbacks(SDL_WindowData *data)
960995
}
961996
_Emscripten_SendDragCompleteEvent(data);
962997
};
963-
target.addEventListener("drop", SDL3.eventHandlerDropDrop);
998+
target.addEventListener("drop", window_data.eventHandlerDropDrop);
964999

965-
SDL3.eventHandlerDropDragend = function(event) {
1000+
window_data.eventHandlerDropDragend = function(event) {
9661001
event.preventDefault();
9671002
_Emscripten_SendDragCompleteEvent(data);
9681003
};
969-
target.addEventListener("dragend", SDL3.eventHandlerDropDragend);
970-
target.addEventListener("dragleave", SDL3.eventHandlerDropDragend);
1004+
target.addEventListener("dragend", window_data.eventHandlerDropDragend);
1005+
target.addEventListener("dragleave", window_data.eventHandlerDropDragend);
9711006
}
9721007
}, data, data->canvas_id, sizeof (Emscripten_DropEvent));
9731008
}
9741009

9751010
static void Emscripten_unset_drag_event_callbacks(SDL_WindowData *data)
9761011
{
9771012
MAIN_THREAD_EM_ASM({
978-
var target = document.querySelector(UTF8ToString($0));
1013+
var id = UTF8ToString($0);
1014+
var target = document.querySelector(id);
9791015
if (target) {
9801016
var SDL3 = Module['SDL3'];
981-
target.removeEventListener("dragleave", SDL3.eventHandlerDropDragend);
982-
target.removeEventListener("dragend", SDL3.eventHandlerDropDragend);
983-
target.removeEventListener("drop", SDL3.eventHandlerDropDrop);
984-
SDL3.drop_count = undefined;
1017+
var window_datas = SDL3['window_data'];
1018+
var window_data = window_datas[id];
1019+
target.removeEventListener("dragleave", window_data.eventHandlerDropDragend);
1020+
target.removeEventListener("dragend", window_data.eventHandlerDropDragend);
1021+
target.removeEventListener("drop", window_data.eventHandlerDropDrop);
1022+
window_data.drop_count = undefined;
1023+
1024+
function safeRemoveDir(path) {
1025+
try
1026+
{
1027+
FS.rmdir(path);
1028+
}
1029+
catch(e)
1030+
{
1031+
// Throws if directory doesn't exist
1032+
}
1033+
}
9851034

1035+
const path = "/tmp/filedrop";
9861036
function recursive_remove(dirpath) {
9871037
FS.readdir(dirpath).forEach((filename) => {
9881038
const p = `${dirpath}/${filename}`;
@@ -993,14 +1043,14 @@ static void Emscripten_unset_drag_event_callbacks(SDL_WindowData *data)
9931043
recursive_remove(p);
9941044
}
9951045
});
996-
FS.rmdir(dirpath);
997-
}("/tmp/filedrop");
998-
999-
FS.rmdir("/tmp/filedrop");
1000-
target.removeEventListener("dragover", SDL3.eventHandlerDropDragover);
1001-
SDL3.eventHandlerDropDragover = undefined;
1002-
SDL3.eventHandlerDropDrop = undefined;
1003-
SDL3.eventHandlerDropDragend = undefined;
1046+
safeRemoveDir(dirpath);
1047+
}(path);
1048+
1049+
safeRemoveDir(path);
1050+
target.removeEventListener("dragover", window_data.eventHandlerDropDragover);
1051+
window_data.eventHandlerDropDragover = undefined;
1052+
window_data.eventHandlerDropDrop = undefined;
1053+
window_data.eventHandlerDropDragend = undefined;
10041054
}
10051055
}, data->canvas_id);
10061056
}

src/video/emscripten/SDL_emscriptenframebuffer.c

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -74,30 +74,43 @@ bool Emscripten_UpdateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *wind
7474
var canvasId = UTF8ToString($3);
7575
var canvas = document.querySelector(canvasId);
7676

77-
//TODO: this should store a context per canvas
78-
if (!Module['SDL3']) Module['SDL3'] = {};
77+
if (!Module['SDL3']) {
78+
Module['SDL3'] = {};
79+
}
80+
7981
var SDL3 = Module['SDL3'];
80-
if (SDL3.ctxCanvas !== canvas) {
81-
SDL3.ctx = Module['createContext'](canvas, false, true);
82-
SDL3.ctxCanvas = canvas;
82+
if (!SDL3['window_data']) {
83+
SDL3['window_data'] = {};
84+
}
85+
86+
var window_datas = SDL3['window_data'];
87+
if (!window_datas[canvasId]) {
88+
window_datas[canvasId] = {};
8389
}
84-
if (SDL3.w !== w || SDL3.h !== h || SDL3.imageCtx !== SDL3.ctx) {
85-
SDL3.image = SDL3.ctx.createImageData(w, h);
86-
SDL3.w = w;
87-
SDL3.h = h;
88-
SDL3.imageCtx = SDL3.ctx;
90+
91+
var window_data = window_datas[canvasId];
92+
93+
if (window_data.canvas !== canvas) {
94+
window_data.ctx = Module['createContext'](canvas, false, true);
95+
window_data.canvas = canvas;
8996
}
90-
var data = SDL3.image.data;
97+
if (window_data.w !== w || window_data.h !== h) {
98+
window_data.image = window_data.ctx.createImageData(w, h);
99+
window_data.w = w;
100+
window_data.h = h;
101+
}
102+
103+
var data = window_data.image.data;
91104
var src = pixels / 4;
92105
var dst = 0;
93106
var num;
94107

95-
if (SDL3.data32Data !== data) {
96-
SDL3.data32 = new Int32Array(data.buffer);
97-
SDL3.data8 = new Uint8Array(data.buffer);
98-
SDL3.data32Data = data;
108+
if (window_data.data32Data !== data) {
109+
window_data.data32 = new Int32Array(data.buffer);
110+
window_data.data8 = new Uint8Array(data.buffer);
111+
window_data.data32Data = data;
99112
}
100-
var data32 = SDL3.data32;
113+
var data32 = window_data.data32;
101114
num = data32.length;
102115
// logically we need to do
103116
// while (dst < num) {
@@ -108,7 +121,7 @@ bool Emscripten_UpdateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *wind
108121
// native SDL_memcpy efficiencies, and the remaining loop
109122
// just stores, not load + store, so it is faster
110123
data32.set(HEAP32.subarray(src, src + num));
111-
var data8 = SDL3.data8;
124+
var data8 = window_data.data8;
112125
var i = 3;
113126
var j = i + 4*num;
114127
if (num % 8 == 0) {
@@ -138,7 +151,7 @@ bool Emscripten_UpdateWindowFramebuffer(SDL_VideoDevice *_this, SDL_Window *wind
138151
}
139152
}
140153

141-
SDL3.ctx.putImageData(SDL3.image, 0, 0);
154+
window_data.ctx.putImageData(window_data.image, 0, 0);
142155
}, surface->w, surface->h, surface->pixels, data->canvas_id);
143156
/* *INDENT-ON* */ // clang-format on
144157

0 commit comments

Comments
 (0)