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 {
Trunc;
}
-LinkCount :: #type u32;
+LinkCount :: #type u64;
FileStat :: struct {
dev : Device;
// 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;
}
}
+var requested_file_data = {};
+
window.ONYX_MODULES.push({
module_name: "js_events",
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;
+ },
});
+
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 {
KeyUp :: 0x05;
Resize :: 0x06;
+
+ FileDropped :: 0x08;
+ FileRequest :: 0x09;
}
DomEvent :: 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) {
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);
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;
/* 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" ---
#load "./js_events"
+#load "./request_file"
\ No newline at end of file
--- /dev/null
+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
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;
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 {