diff options
Diffstat (limited to 'TUI')
| -rw-r--r-- | TUI/module.jai | 61 |
1 files changed, 56 insertions, 5 deletions
diff --git a/TUI/module.jai b/TUI/module.jai index bfed510..48fca16 100644 --- a/TUI/module.jai +++ b/TUI/module.jai @@ -86,14 +86,65 @@ Commands :: struct { // TODO Maybe make the OS_* procedures as inline?! -// Let's return keys with 32bits so we can merge up to 4bytes and support UTF-8 encoding. -Key :: u32; +// We wanted the Key type to represent either UTF-8 encoded characters and also keyboard keys. +// The UTF-8 only requires up to 4 bytes, but some keyboard keys return up to 6 bytes. +// Therefore, we rounded it up to 8 bytes to support all this and more (if needed). + +Key :: union { + text: [8] u8; + code: u64; +} + +to_key :: inline (value: $T) -> Key #modify { return T == u8 || T == ([]u8) || T == string; } { + k: Key; + #if T == u8 { + k.text[0] = value; + } + #if T == ([]u8) || T == string { + size := ifx value.count > Key.text.count then Key.text.count else value.count; + // assert(size <= Key.text.count); This is now under the user responsability. + memcpy(k.text.data, value.data, size); + } + return k; +} + +operator == :: inline (a: Key, b: Key) -> bool { + return a.code == b.code; +} + +operator == :: inline (a: Key, b: $T) -> bool { + k := to_key(b); + return a.code == k.code; +} + +#run { + print("\n:::%\n", Key.text.count); + // ti := type_info(Key); + print("\n---\n%\n---\n", type_info(Key).*); + a: Key; + b: u8; + print(">%\n", a == to_key(b)); + + c: string = ""; + print(">%\n", a == to_key(c)); + + d: []u8 = xx ""; + print(">%\n", a == to_key(d)); + + print(">%\n", a == b); + print(">%\n", a == c); + print(">%\n", a == d); +} // Terminal action codes are encoded with values incompatible with UTF-8 to avoid collisions. -Keys :: enum Key { - None :: 0xFF000000; - Resize :: 0xFF000001; +Keys :: struct { + None :: #run to_key("\0"); + Resize :: #run to_key(xx 1); } +// Keys :: enum Key { + // None :: 0xFF000000; + // Resize :: 0xFF000001; +// } initialized := false; |
