added dynamic file requests to js_events library
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 11 Jul 2021 20:52:48 +0000 (15:52 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sun, 11 Jul 2021 20:52:48 +0000 (15:52 -0500)
core/conv.onyx
core/wasi/wasi.onyx
modules/js_events/js_events.js
modules/js_events/js_events.onyx
modules/js_events/module.onyx
modules/js_events/request_file.onyx [new file with mode: 0644]
modules/ui/input.onyx
modules/ui/ui.onyx

index 782749b6a7817aa9140ae185d522ef023b2a0f9e..c4f68ade33154ebf855565d95eba51b4433aba33 100644 (file)
@@ -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 {
index 4a31ab88928035642818abaab2f0a3eca64f3be5..4a873baa5b791a0e6e167f0944919783a83b8b02 100644 (file)
@@ -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;
index 4ff47d315c9fc0f38cb45a305b9a21848ea5a797..546bec2225c05e1ffcacf2b1c86ddeb8605cb9b2 100644 (file)
@@ -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;
+    },
 });
+
index ae73ff9b3a30f1903ae8bb22e5e71fd5af99e324..6959e4253172579547034d251da4440d24081ccb 100644 (file)
@@ -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" ---
index a4abd4c94abe16556432c3aa1b80805ccf7f04f0..9e086256636fb427462e89ddfb5a78ed9f968e58 100644 (file)
@@ -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 (file)
index 0000000..f283838
--- /dev/null
@@ -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
index 5406e4c1db6d78b265c34df603e446d4e82862ec..b127b5b059d3983cd2ddad0c4c49dbed40190ff8 100644 (file)
@@ -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;
index b6d942093d6cb438766184574d6a307e11f16eb7..cddd660b2c62b447364887d7aba3dbf7d5ad18bd 100644 (file)
@@ -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 {