Browse Source

Merge pull request #715 from floooh/emsc-3.21

Fixes for Emscripten 3.21

Emscripten has 'deprecated' the ccall() Javascript helper function (this is now part of the 'legacy runtime' and causes linker errors. Instead of ccall, sokol_app.h and sokol_args.h now use a lower level set of JS helper functions for string argument marshalling.
Andre Weissflog 3 years ago
parent
commit
4238be9d53
4 changed files with 22 additions and 6 deletions
  1. 6 0
      CHANGELOG.md
  2. 1 1
      README.md
  3. 10 4
      sokol_app.h
  4. 5 1
      sokol_args.h

+ 6 - 0
CHANGELOG.md

@@ -1,5 +1,11 @@
 ## Updates
 
+- **10-Sep-2022**: sokol_app.h and sokol_args.h has been fixed for Emscripten 3.21, those headers
+  used the Emscripten Javascript helper function ```ccall()``` which is now part of the
+  'legacy runtime' and causes linker errors. Instead of ```ccall()``` sokol_app.h and sokol_args.h
+  now drop down to a lower level set of Emscripten JS helper functions (which hopefully won't
+  go away anytime soon).
+
 - **05-Aug-2022**: New officially supported and automatically updated language bindings for Odin:
   https://github.com/floooh/sokol-odin (also see [gen_odin.py](https://github.com/floooh/sokol/blob/master/bindgen/gen_odin.py))
 

+ 1 - 1
README.md

@@ -4,7 +4,7 @@ Simple
 [STB-style](https://github.com/nothings/stb/blob/master/docs/stb_howto.txt)
 cross-platform libraries for C and C++, written in C.
 
-[**See what's new**](https://github.com/floooh/sokol/blob/master/CHANGELOG.md) (**10-Jul-2022** sokol_app.h can now set the mouse cursor type, and assorted changes)
+[**See what's new**](https://github.com/floooh/sokol/blob/master/CHANGELOG.md) (**10-Sep-2022** an important compatibility fix for Emscripten 3.21 in sokol_app.h and sokol_args.h)
 
 [![Build](/../../actions/workflows/main.yml/badge.svg)](/../../actions/workflows/main.yml) [![Bindings](/../../actions/workflows/gen_bindings.yml/badge.svg)](/../../actions/workflows/gen_bindings.yml) [![build](https://github.com/floooh/sokol-zig/actions/workflows/main.yml/badge.svg)](https://github.com/floooh/sokol-zig/actions/workflows/main.yml) [![build](https://github.com/floooh/sokol-nim/actions/workflows/main.yml/badge.svg)](https://github.com/floooh/sokol-nim/actions/workflows/main.yml) [![Odin](https://github.com/floooh/sokol-odin/actions/workflows/main.yml/badge.svg)](https://github.com/floooh/sokol-odin/actions/workflows/main.yml)
 

+ 10 - 4
sokol_app.h

@@ -4519,7 +4519,10 @@ EM_JS(void, sapp_js_remove_beforeunload_listener, (void), {
 EM_JS(void, sapp_js_add_clipboard_listener, (void), {
     Module.sokol_paste = function(event) {
         var pasted_str = event.clipboardData.getData('text');
-        ccall('_sapp_emsc_onpaste', 'void', ['string'], [pasted_str]);
+        withStackSave(() => {
+            var cstr = allocateUTF8OnStack(pasted_str);
+            __sapp_emsc_onpaste(cstr);
+        });
     };
     window.addEventListener('paste', Module.sokol_paste);
 });
@@ -4574,7 +4577,10 @@ EM_JS(void, sapp_js_add_dragndrop_listeners, (const char* canvas_name_cstr), {
         __sapp_emsc_begin_drop(files.length);
         var i;
         for (i = 0; i < files.length; i++) {
-            ccall('_sapp_emsc_drop', 'void', ['number', 'string'], [i, files[i].name]);
+            withStackSave(() => {
+                var cstr = allocateUTF8OnStack(files[i].name);
+                __sapp_emsc_drop(i, cstr);
+            });
         }
         // FIXME? see computation of targetX/targetY in emscripten via getClientBoundingRect
         __sapp_emsc_end_drop(event.clientX, event.clientY);
@@ -4662,7 +4668,7 @@ _SOKOL_PRIVATE void _sapp_emsc_show_keyboard(bool show) {
     }
 }
 
-EM_JS(void, sapp_js_pointer_init, (const char* c_str_target), {
+EM_JS(void, sapp_js_init, (const char* c_str_target), {
     // lookup and store canvas object by name
     var target_str = UTF8ToString(c_str_target);
     Module.sapp_emsc_target = document.getElementById(target_str);
@@ -5564,7 +5570,7 @@ _SOKOL_PRIVATE EM_BOOL _sapp_emsc_frame(double time, void* userData) {
 
 _SOKOL_PRIVATE void _sapp_emsc_run(const sapp_desc* desc) {
     _sapp_init_state(desc);
-    sapp_js_pointer_init(&_sapp.html5_canvas_selector[1]);
+    sapp_js_init(&_sapp.html5_canvas_selector[1]);
     double w, h;
     if (_sapp.desc.html5_canvas_resize) {
         w = (double) _sapp_def(_sapp.desc.width, _SAPP_FALLBACK_DEFAULT_WINDOW_WIDTH);

+ 5 - 1
sokol_args.h

@@ -727,7 +727,11 @@ EM_JS(void, sargs_js_parse_url, (void), {
     for (var p = params.next(); !p.done; p = params.next()) {
         var key = p.value[0];
         var val = p.value[1];
-        var res = ccall('_sargs_add_kvp', 'void', ['string','string'], [key,val]);
+        withStackSave(() => {
+            var key_cstr = allocateUTF8OnStack(key);
+            var val_cstr = allocateUTF8OnStack(val);
+            __sargs_add_kvp(key_cstr, val_cstr)
+        });
     }
 });