summaryrefslogtreecommitdiff
path: root/index.htm
diff options
context:
space:
mode:
Diffstat (limited to 'index.htm')
-rw-r--r--index.htm159
1 files changed, 131 insertions, 28 deletions
diff --git a/index.htm b/index.htm
index 18c110f..1207f79 100644
--- a/index.htm
+++ b/index.htm
@@ -76,7 +76,14 @@
this.sound_buffer_address = program.exports.js_sound_buffer();
this.pixels_address = program.exports.js_pixels();
- this.frames = new Float32Array(this.memory_buffer, this.sound_buffer_address, program.exports.js_max_num_sound_frames());
+ this.max_drop_size = program.exports.js_max_drop_size();
+ this.drop_address = program.exports.js_drop_buffer();
+
+ this.frames = new Float32Array(
+ this.memory_buffer,
+ this.sound_buffer_address,
+ program.exports.js_max_num_sound_frames()
+ );
let title_address = program.exports.js_title();
@@ -160,6 +167,50 @@
this.program.exports.js_keydown(ev.key, ev.mod, ev.ch);
},
+
+ dragenter : (ev) => {
+ if (this.program === undefined)
+ return;
+
+ this.program.exports.js_dragenter();
+ },
+
+ dragleave : (ev) => {
+ if (this.program === undefined)
+ return;
+
+ this.program.exports.js_dragenter();
+ },
+
+ drop : (ev) => {
+ if (this.program === undefined)
+ return;
+
+ for (let f of ev.files) {
+ if (f.name.byteLength + f.data.byteLength > this.max_drop_size) {
+ console.error("File too big");
+ continue;
+ }
+
+ new Uint8Array(
+ this.memory_buffer,
+ this.drop_address,
+ f.name.byteLength
+ ).set(
+ new Uint8Array(f.name)
+ );
+
+ new Uint8Array(
+ this.memory_buffer,
+ this.drop_address + f.name.byteLength,
+ f.data.byteLength
+ ).set(
+ new Uint8Array(f.data)
+ );
+
+ this.program.exports.js_drop(f.name.byteLength, f.data.byteLength);
+ }
+ },
};
this.port.onmessage = (ev) => {
@@ -223,35 +274,26 @@
let program = await WebAssembly.instantiate(
wasm,
{
- wasi_snapshot_preview1 : {
- clock_time_get : () => {},
- args_sizes_get : () => {},
- args_get : () => {},
- proc_exit : () => {},
- fd_close : () => {},
- fd_write : () => {},
- fd_seek : () => {},
- },
env : {
p_clipboard_write_impl : () => {},
p_time_impl : () => {},
-
- floor : () => {},
- ceil : () => {},
- sqrt : () => {},
- cbrt : () => {},
- pow : () => {},
- log : () => {},
- log2 : () => {},
- log10 : () => {},
- exp : () => {},
- sin : () => {},
- cos : () => {},
- tan : () => {},
- asin : () => {},
- acos : () => {},
- atan : () => {},
- atan2 : () => {},
+ floor : () => {},
+ ceil : () => {},
+ trunc : () => {},
+ sqrt : () => {},
+ cbrt : () => {},
+ pow : () => {},
+ log : () => {},
+ log2 : () => {},
+ log10 : () => {},
+ exp : () => {},
+ sin : () => {},
+ cos : () => {},
+ tan : () => {},
+ asin : () => {},
+ acos : () => {},
+ atan : () => {},
+ atan2 : () => {},
},
}
);
@@ -568,7 +610,6 @@
});
window.addEventListener("wheel", (ev) => {
- ev.preventDefault();
if (!sound_ready)
return;
@@ -592,6 +633,68 @@
ch : paste_ch,
});
});
+
+ canvas.addEventListener("dragover", (ev) => {
+ ev.preventDefault();
+ if (!sound_ready) {
+ ev.dataTransfer.dropEffect = "none";
+ return;
+ }
+
+ if (ev.clientX != undefined && ev.clientY != undefined)
+ sound_node.port.postMessage({
+ id : "mousemove",
+ x : ev.clientX,
+ y : ev.clientY,
+ });
+ });
+
+ canvas.addEventListener("dragenter", (ev) => {
+ ev.preventDefault();
+ if (!sound_ready)
+ return;
+
+ sound_node.port.postMessage({
+ id : "dragenter",
+ });
+ });
+
+ canvas.addEventListener("dragleave", (ev) => {
+ ev.preventDefault();
+ if (!sound_ready)
+ return;
+
+ sound_node.port.postMessage({
+ id : "dragleave",
+ });
+ });
+
+ canvas.addEventListener("drop", (ev) => {
+ ev.preventDefault();
+ if (!sound_ready)
+ return;
+
+ (async () => {
+ let files = [];
+
+ for (let f of ev.dataTransfer.files) {
+ // Copy the buffer in case the underlaying buffer's size is larger.
+ let bytes = await f.bytes();
+ let buffer = new ArrayBuffer(bytes.length);
+ new Uint8Array(buffer).set(bytes);
+
+ files.push({
+ name : new TextEncoder("utf8").encode(f.name),
+ data : buffer,
+ });
+ }
+
+ sound_node.port.postMessage({
+ id : "drop",
+ files : files,
+ });
+ })();
+ });
}
run({