aboutsummaryrefslogtreecommitdiff
path: root/TUI/module.jai
diff options
context:
space:
mode:
authordam <dam@gudinoff>2023-12-15 02:02:33 +0000
committerdam <dam@gudinoff>2023-12-15 02:02:33 +0000
commit8d06729eb3353705f5d35457c5f921407f8c0f4a (patch)
treea7fb3d6a25e7948e7556aa61be3913c3bf584890 /TUI/module.jai
parentef69c4f8daa14a580dd8bb442cae551f08711ca2 (diff)
downloadtask-time-tracker-8d06729eb3353705f5d35457c5f921407f8c0f4a.tar.zst
task-time-tracker-8d06729eb3353705f5d35457c5f921407f8c0f4a.zip
WIP: Trying to define Key.
Diffstat (limited to 'TUI/module.jai')
-rw-r--r--TUI/module.jai61
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;