From: Brendan Hansen Date: Sun, 11 Jul 2021 20:52:48 +0000 (-0500) Subject: added dynamic file requests to js_events library X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=445c2f15634052aab600f689f71e0f4dcdadcecb;p=onyx.git added dynamic file requests to js_events library --- diff --git a/core/conv.onyx b/core/conv.onyx index 782749b6..c4f68ade 100644 --- a/core/conv.onyx +++ b/core/conv.onyx @@ -442,10 +442,12 @@ str_format_va :: (format: str, buffer: [] u8, va: [] any) -> str { if formatting.pretty_printing { output->write(#char "\n"); - for i: formatting.indentation - 1 do output->write(#char " "); + for i: formatting.indentation do output->write(#char " "); + output->write("}"); + + } else { + output->write(" }"); } - - output->write(" }"); } if info.kind == .Function { diff --git a/core/wasi/wasi.onyx b/core/wasi/wasi.onyx index 4a31ab88..4a873baa 100644 --- a/core/wasi/wasi.onyx +++ b/core/wasi/wasi.onyx @@ -207,7 +207,7 @@ OFlags :: enum #flags (u16) { Trunc; } -LinkCount :: #type u32; +LinkCount :: #type u64; FileStat :: struct { dev : Device; @@ -225,8 +225,14 @@ FileStat :: struct { // a 32-bit value, not 64-bit, which means the offsets were // incorrect. I fixed it for now, but when wasmtime updates // the size of 'LinkCount' needs to be changed. + // + // EVEN ANGRIER(Brendan Hansen): ACTUALLY, I realized today + // that it has changed (at least for Wasmer). There was not + // any mention of this on any release documents, but hey, I + // guess this can actually be 64-bits now. // - brendanfh 2020/12/05 // - brendanfh 2020/12/07 + // - brendanfh 2021/07/10 nlink : LinkCount; size : Filesize; diff --git a/modules/js_events/js_events.js b/modules/js_events/js_events.js index 4ff47d31..546bec22 100644 --- a/modules/js_events/js_events.js +++ b/modules/js_events/js_events.js @@ -19,6 +19,8 @@ function push_event_to_buffer(esp, event_size, event_kind, data) { } } +var requested_file_data = {}; + window.ONYX_MODULES.push({ module_name: "js_events", @@ -109,4 +111,41 @@ window.ONYX_MODULES.push({ return false; }; }, + + request_file(esp, event_size, filename_ptr, filename_len, fileid) { + esp /= 4; + + var path_memory = new Uint8Array(ONYX_MEMORY.buffer, filename_ptr, filename_len); + var path = new TextDecoder("utf-8").decode(path_memory); + console.log(path); + + fetch(path) + .then(response => response.arrayBuffer()) + .then(array_buffer => { + requested_file_data[fileid] = array_buffer; + + push_event_to_buffer(esp, event_size, 0x09, [ 0x01, fileid, array_buffer.byteLength ]); + }) + .catch((error) => { + push_event_to_buffer(esp, event_size, 0x09, [ 0x02, fileid, 0 ]); + }); + }, + + get_requested_file_data(fileid, bufferptr, bufferlen) { + var file_data = requested_file_data[fileid]; + if (file_data == null) return 0; + + if (bufferlen < file_data.byteLength) return 0; + + let WASM_U8 = new Uint8Array(ONYX_MEMORY.buffer); + var u8_data = new Uint8Array(file_data); + + WASM_U8.set(u8_data, bufferptr); + + requested_file_data[fileid] = null; + delete requested_file_data[fileid]; + + return 1; + }, }); + diff --git a/modules/js_events/js_events.onyx b/modules/js_events/js_events.onyx index ae73ff9b..6959e425 100644 --- a/modules/js_events/js_events.onyx +++ b/modules/js_events/js_events.onyx @@ -5,7 +5,7 @@ package js_events -#private_file Num_Buffered_Events :: 16 +#private_file Max_Buffered_Events :: 16 // NOTE: These need to match exactly what is in the corresponding javascript DomEventKind :: enum { @@ -20,6 +20,9 @@ DomEventKind :: enum { KeyUp :: 0x05; Resize :: 0x06; + + FileDropped :: 0x08; + FileRequest :: 0x09; } DomEvent :: struct { @@ -73,12 +76,23 @@ ResizeEvent :: struct { height : u32; } +FileEvent :: struct { + use dom : DomEvent; + + Status :: enum (u32) { Success :: 0x01; Failed :: 0x02; }; + status : Status; + + file_id : u32; + size : u32; +} + Event :: struct #union { use dom : DomEvent; keyboard : KeyboardEvent; mouse : MouseEvent; resize : ResizeEvent; + file : FileEvent; } clear_event :: (ev: ^Event) { @@ -88,7 +102,7 @@ clear_event :: (ev: ^Event) { init :: () { event_storage.event_count = 0; - event_storage.max_events = Num_Buffered_Events; + event_storage.max_events = Max_Buffered_Events; for ^ev: event_storage.event_buffer do clear_event(ev); @@ -101,9 +115,9 @@ consume :: () -> Iterator(^Event) { if event_storage.event_count == 0 do return null, false; @CodeGeneration // This instruction (and all instructions involving Event) generate a TON of instructions because Event is a union. - processing_event := event_storage.event_buffer[0]; + processing_event = event_storage.event_buffer[0]; - for i: 0 .. Num_Buffered_Events - 2 { + for i: 0 .. Max_Buffered_Events - 2 { event_storage.event_buffer[i] = event_storage.event_buffer[i + 1]; } event_storage.event_count -= 1; @@ -116,11 +130,11 @@ consume :: () -> Iterator(^Event) { /* Private members */ -#private_file EventStorage :: struct { +#private EventStorage :: struct { event_count : u32; max_events : u32; - event_buffer : [Num_Buffered_Events] Event; + event_buffer : [Max_Buffered_Events] Event; } -#private_file event_storage : EventStorage; -#private_file event_setup :: (event_storage: ^EventStorage, event_size: u32) -> void #foreign "js_events" "setup" --- +#private event_storage : EventStorage; +#private event_setup :: (event_storage: ^EventStorage, event_size: u32) -> void #foreign "js_events" "setup" --- diff --git a/modules/js_events/module.onyx b/modules/js_events/module.onyx index a4abd4c9..9e086256 100644 --- a/modules/js_events/module.onyx +++ b/modules/js_events/module.onyx @@ -1,2 +1,3 @@ #load "./js_events" +#load "./request_file" \ No newline at end of file diff --git a/modules/js_events/request_file.onyx b/modules/js_events/request_file.onyx new file mode 100644 index 00000000..f283838e --- /dev/null +++ b/modules/js_events/request_file.onyx @@ -0,0 +1,19 @@ +package js_events + +#private_file next_request_id := 0; + +request_file :: (filepath: str) -> u32 { + js_request_file :: (event_storage: ^EventStorage, event_size: u32, filepath: str, fileid: u32) -> void #foreign "js_events" "request_file" ---; + + next_request_id += 1; + fileid := next_request_id; + + js_request_file(^event_storage, sizeof Event, filepath, fileid); + return fileid; +} + +get_requested_file_data :: (fileid: u32, buffer: [] u8) -> bool { + js_get_requested_file_data :: (fileid: u32, buffer: [] u8) -> u32 #foreign "js_events" "get_requested_file_data" ---; + + return js_get_requested_file_data(fileid, buffer) == 1; +} \ No newline at end of file diff --git a/modules/ui/input.onyx b/modules/ui/input.onyx index 5406e4c1..b127b5b0 100644 --- a/modules/ui/input.onyx +++ b/modules/ui/input.onyx @@ -156,6 +156,10 @@ is_key_down :: (keycode: u32) -> bool { return s == .Down || s == .Just_Down; } +is_key_just_down :: (keycode: u32) -> bool { + return keyboard_state.state[keycode] == .Just_Down; +} + is_key_up :: (keycode: u32) -> bool { s := keyboard_state.state[keycode]; return s == .Up || s == .Just_Up; diff --git a/modules/ui/ui.onyx b/modules/ui/ui.onyx index b6d94209..cddd660b 100644 --- a/modules/ui/ui.onyx +++ b/modules/ui/ui.onyx @@ -47,6 +47,11 @@ end_frame :: () { if !hot_item_was_set do set_hot_item(0); hot_item_was_set = false; + + for ^s: keyboard_state.state { + if *s == .Just_Down do *s = .Down; + if *s == .Just_Up do *s = .Up; + } } set_active_item :: (id: UI_Id) -> bool {