From 772a821ce17588a35f4d89ec42fa1821011b6666 Mon Sep 17 00:00:00 2001 From: iddev5 Date: Wed, 8 Jun 2022 13:20:59 +0530 Subject: [PATCH] mach: wasm: Implement setShouldClose for wasm --- src/platform/mach.js | 4 ++++ src/platform/wasm.zig | 5 ++++- www/template.html | 11 +++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/platform/mach.js b/src/platform/mach.js index e16e8281..168cffb5 100644 --- a/src/platform/mach.js +++ b/src/platform/mach.js @@ -274,6 +274,10 @@ const mach = { return cv.canvas.height; }, + machEmitCloseEvent() { + window.dispatchEvent(new Event("mach-close")); + }, + machEventShift() { if (mach.events.length < 0) return 0; diff --git a/src/platform/wasm.zig b/src/platform/wasm.zig index 35bae28a..ae6cf379 100644 --- a/src/platform/wasm.zig +++ b/src/platform/wasm.zig @@ -13,6 +13,7 @@ const js = struct { extern fn machCanvasGetWindowHeight(canvas: CanvasId) u32; extern fn machCanvasGetFramebufferWidth(canvas: CanvasId) u32; extern fn machCanvasGetFramebufferHeight(canvas: CanvasId) u32; + extern fn machEmitCloseEvent() void; extern fn machEventShift() i32; extern fn machEventShiftFloat() f64; extern fn machChangeShift() u32; @@ -63,7 +64,9 @@ pub const Platform = struct { js.machCanvasSetTitle(platform.id, title.ptr, title.len); } - pub fn setShouldClose(_: *Platform, _: bool) void {} + pub fn setShouldClose(_: *Platform, value: bool) void { + if (value) js.machEmitCloseEvent(); + } pub fn getFramebufferSize(platform: *Platform) structs.Size { return platform.last_framebuffer_size; diff --git a/www/template.html b/www/template.html index 55792135..84eedd27 100644 --- a/www/template.html +++ b/www/template.html @@ -24,12 +24,19 @@ mach.init(instance); instance.exports.wasmInit(); + let frame = true; let update = function() {{ + if (!frame) return; instance.exports.wasmUpdate(); - requestAnimationFrame(update); + window.requestAnimationFrame(update); }}; - requestAnimationFrame(update); + window.requestAnimationFrame(update); + + window.addEventListener("mach-close", () => {{ + instance.exports.wasmDeinit(); + frame = false; + }}); }}) .catch(err => console.error(err));