aboutsummaryrefslogtreecommitdiff
path: root/TUI/module.jai
diff options
context:
space:
mode:
authordam <dam@gudinoff>2023-09-23 10:58:35 +0100
committerdam <dam@gudinoff>2023-09-23 10:58:35 +0100
commit8b640d9e236641eefea93338e3a7092678e3c5e5 (patch)
tree94a787527055ca5ffb58257852c50f7c23dbbed3 /TUI/module.jai
parent1b76de83f52f7199a51e8e5d563b4ddfa8e2f289 (diff)
downloadtask-time-tracker-8b640d9e236641eefea93338e3a7092678e3c5e5.tar.zst
task-time-tracker-8b640d9e236641eefea93338e3a7092678e3c5e5.zip
Implemented basic read_input for windows.
Diffstat (limited to 'TUI/module.jai')
-rw-r--r--TUI/module.jai102
1 files changed, 32 insertions, 70 deletions
diff --git a/TUI/module.jai b/TUI/module.jai
index fae022f..3298e59 100644
--- a/TUI/module.jai
+++ b/TUI/module.jai
@@ -88,16 +88,16 @@ Commands :: struct {
// TODO Maybe rename to "setup()"
start :: () {
- OS_prepare_terminal();
write_strings(Commands.HideCursor, Commands.SaveCursorPosition, Commands.EnterAlternateBuffer, Commands.SetUTF8);
+ OS_prepare_terminal();
isTUIActive = true;
}
// TODO Maybe rename to "reset()"
stop :: () {
isTUIActive = false;
- write_strings(Commands.EnterMainBuffer, Commands.RestoreCursorPosition, Commands.ShowCursor);
OS_reset_terminal();
+ write_strings(Commands.EnterMainBuffer, Commands.RestoreCursorPosition, Commands.ShowCursor);
}
draw_box :: (x: int, y: int, width: int, height: int) {
@@ -167,8 +167,11 @@ set_cursor_position :: (row: int, column: int) {
get_cursor_position :: () -> row: int, column: int {
assert(isTUIActive, "TUI is not active."); // TODO
+
+ // TODO Hide input echo.
+
write_string(Commands.QueryCursorPosition); // Returned
- input := read_input(false);
+ input := read_input(.MACHINE);
// Result: \e[21;1R
assert(
input.data[0] == #char "\e" &&
@@ -184,32 +187,25 @@ get_cursor_position :: () -> row: int, column: int {
return row, column;
}
-read_input :: (blocking: bool = true) -> string {
- return OS_read_input(blocking);
+Input_Mode :: enum u8 {
+ HUMAN; // Shows cursor, echoes input, and expects an enter at the end of the line.
+ MACHINE; // Hides cursor, hides input, and reads right away once the first input is available.
}
-// read_input: () -> string;
-
-#if OS == .WINDOWS {
+read_input :: (mode: Input_Mode = .HUMAN) -> string {
+ if mode == .HUMAN write_string(Commands.ShowCursor);
+ defer if mode == .HUMAN write_string(Commands.HideCursor);
+ return OS_read_input(mode);
+}
- OS_read_input :: (blocking: bool) -> string {
- result: string = ---;
- MAX_BYTES_TO_READ :: 1024;
- temp : [MAX_BYTES_TO_READ] u8;
- bytes_read : s32;
- if ReadConsoleA(stdin, temp.data, xx temp.count, *bytes_read) {
- result.data = alloc(bytes_read);
- result.count = bytes_read;
- memcpy(result.data, temp.data, bytes_read);
- }
- return result;
- };
+#if OS == .WINDOWS {
+ // Prototyping zone... keep clear!
}
else #if OS == .LINUX || OS == .MACOS {
-
- OS_read_input :: (blocking: bool) -> string {
+ // Prototyping zone... keep clear!
+ OS_read_input :: (mode: Input_Mode) -> string {
term : My_Termios;
tcgetattr(STDIN_FILENO, *term);
@@ -228,7 +224,7 @@ else #if OS == .LINUX || OS == .MACOS {
IXON; // Enable start/stop output control.
IXOFF; // Enable start/stop input control.
IXANY; // Any character will restart after stop.
- __NOT_USED__;
+ __NOT_USED__;
IMAXBEL; // Ring bell when input queue is full.
IUCLC; // Translate upper case input to lower case.
}
@@ -253,58 +249,24 @@ else #if OS == .LINUX || OS == .MACOS {
NOKERNINFO; // Disable VSTATUS.
PENDIN; // Retype pending input (state).
NOFLSH; // Disable flush after interrupt.
-
+
}
backup: My_Termios;
tcgetattr(STDIN_FILENO, *backup);
- if blocking {
- // write_number(term.c_iflag, 2);
- // write_string(":");
- // write_number(term.c_lflag, 2);
- // write_string(":");
- // write_number(__term.c_iflag, 2);
- // write_string(":");
- // write_number(__term.c_lflag, 2);
-
- // c_iflag
- // 10
- // 8
- // 0101 0101 0000 0000 : __term
- // 1111 1010 0001 0100 : &MASK
- // 0101 0000 0000 0000 :
-
- // 0101 0101 0000 0000 : NOW
-
-
- // c_lflag
- // 15
- // 3
- // 1
- // 0
- // 1000 1010 0011 1011 : __term
- // 0111 1111 1011 0100 : &MASK
- // 0000 1010 0011 0000 :
-
- // 1000 1010 0011 1011 : NOW
-
-
- // print("%\n", term.c_iflag, to_standard_error = true);
- // print("%\n", term.c_lflag, to_standard_error = true);
- // print("%\n", term, to_standard_error = true);
-
- // term = __term;
- term.c_iflag |= xx cast(Input_Modes)(.IXOFF | .ICRNL);
- term.c_lflag |= xx cast(Local_Modes)(.NOKERNINFO | .ECHO | .ECHOE | .ECHOKE);
- }
- else {
- iflags: Input_Modes = (.IGNBRK | .BRKINT | .PARMRK | .ISTRIP | .INLCR | .IGNCR | .ICRNL | .IXON);
- term.c_iflag &= xx ~(iflags);
- lflags: Local_Modes = (.ECHO | .ECHONL | .ICANON | .IEXTEN);
- term.c_lflag &= xx ~lflags;
+ if mode == {
+ case .HUMAN;
+ term.c_iflag |= xx cast(Input_Modes)(.IXOFF | .ICRNL);
+ term.c_lflag |= xx cast(Local_Modes)(.NOKERNINFO | .ECHO | .ECHOE | .ECHOKE);
+
+ case .MACHINE;
+ iflags: Input_Modes = (.IGNBRK | .BRKINT | .PARMRK | .ISTRIP | .INLCR | .IGNCR | .ICRNL | .IXON);
+ term.c_iflag &= xx ~(iflags);
+ lflags: Local_Modes = (.ECHO | .ECHONL | .ICANON | .IEXTEN);
+ term.c_lflag &= xx ~lflags;
}
-
+
// term.c_iflag &= 0xFFFFFA14;// ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON);
// term.c_oflag &= 0xFFFFFFFE;// ~OPOST;
// term.c_lflag &= 0xFFFF7FB4;// ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
@@ -331,7 +293,7 @@ else #if OS == .LINUX || OS == .MACOS {
// result = to_string(buffer.data, bytes_read); // TODO WIP WIP WIP This is still using the stack allocated buffer and WILL FAIL!
tcsetattr(STDIN_FILENO, 0, *backup);
-
+
return result;
};
}