From 8b640d9e236641eefea93338e3a7092678e3c5e5 Mon Sep 17 00:00:00 2001 From: dam Date: Sat, 23 Sep 2023 10:58:35 +0100 Subject: Implemented basic read_input for windows. --- TUI/module.jai | 102 ++++++++++++++++++--------------------------------------- 1 file changed, 32 insertions(+), 70 deletions(-) (limited to 'TUI/module.jai') 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; }; } -- cgit v1.2.3