aboutsummaryrefslogtreecommitdiff
path: root/modules/TUI/windows.jai
diff options
context:
space:
mode:
authordam <dam@gudinoff>2024-04-30 00:05:26 +0100
committerdam <dam@gudinoff>2024-04-30 00:05:26 +0100
commitd7c2c312fe2ac08cadc3534a0a35357ef50cca20 (patch)
treecfaa0289011dfe5e33e55e78c5fffa4e4ea0663e /modules/TUI/windows.jai
parent1f2afe4db186342bda551e96bcd1d9b029d7c5ba (diff)
downloadtask-time-tracker-d7c2c312fe2ac08cadc3534a0a35357ef50cca20.tar.zst
task-time-tracker-d7c2c312fe2ac08cadc3534a0a35357ef50cca20.zip
WIP : Add logger and cleanup TUI module.
Diffstat (limited to 'modules/TUI/windows.jai')
-rw-r--r--modules/TUI/windows.jai118
1 files changed, 59 insertions, 59 deletions
diff --git a/modules/TUI/windows.jai b/modules/TUI/windows.jai
index 5755ef4..608266d 100644
--- a/modules/TUI/windows.jai
+++ b/modules/TUI/windows.jai
@@ -9,47 +9,30 @@
CP_UTF8 :: 65001;
// https://learn.microsoft.com/windows/win32/winprog/windows-data-types
- LPVOID :: *void;
- BOOL :: bool;
- CHAR :: s8;
- WCHAR :: s16;
- SHORT :: s16;
- USHORT :: u16;
- WORD :: u16;
- DWORD :: u32;
- LPDWORD :: *u32;
- UINT :: u32;
-
- PINPUT_RECORD :: *INPUT_RECORD;
-
- // https://learn.microsoft.com/en-us/windows/console/readconsoleinput
- ReadConsoleInputW :: (hConsoleInput: HANDLE, lpBuffer: PINPUT_RECORD, nLength: DWORD, lpNumberOfEventsRead: LPDWORD) -> success: bool #foreign kernel32;
-
- // https://learn.microsoft.com/windows/console/readconsole
- ReadConsoleW :: (hConsoleInput: HANDLE, lpBuffer: LPVOID, nNumberOfchars_to_read: DWORD, lpNumberOfchars_read: LPVOID, pInputControl: LPVOID) -> success: bool #foreign kernel32;
-
- // https://learn.microsoft.com/windows/console/flushconsoleinputbuffer
- FlushConsoleInputBuffer :: (hConsoleInput: HANDLE) -> bool #foreign kernel32;
-
- // https://learn.microsoft.com/windows/console/getnumberofconsoleinputevents
- GetNumberOfConsoleInputEvents :: (hConsoleInput: HANDLE, lpcNumberOfEvents: LPDWORD) -> bool #foreign kernel32;
-
- // https://learn.microsoft.com/en-us/windows/console/peekconsoleinput
- PeekConsoleInputW :: (hConsoleInput: HANDLE, lpBuffer: PINPUT_RECORD, nLength: DWORD, lpNumberOfEventsRead: LPDWORD) -> bool #foreign kernel32;
+ LPVOID :: *void;
+ BOOL :: bool;
+ CHAR :: s8;
+ WCHAR :: s16;
+ SHORT :: s16;
+ WORD :: u16;
+ DWORD :: u32;
+ LPDWORD :: *u32;
+ UINT :: u32;
+ PINPUT_RECORD :: *INPUT_RECORD;
// https://learn.microsoft.com/en-us/windows/console/setconsolemode
// https://learn.microsoft.com/en-us/windows/console/high-level-console-modes
Console_Input_Mode :: enum_flags u32 {
- ENABLE_PROCESSED_INPUT; // If enable, control keys (Ctrl+C, Backspace, ...) are processed by the system.
- ENABLE_LINE_INPUT; // If enable, ReadFile or ReadConsole function return on CR; otherwise they return when one or more characters are available.
- ENABLE_ECHO_INPUT; // Echoes input on screen. Only available if ENABLE_LINE_INPUT is set.
+ ENABLE_PROCESSED_INPUT; // If set, control sequences are processed by the system.
+ ENABLE_LINE_INPUT; // If set, ReadFile and ReadConsole function return on CR; otherwise return when characters are available.
+ ENABLE_ECHO_INPUT; // If set, Echoes input on screen. Only available if ENABLE_LINE_INPUT is set.
ENABLE_WINDOW_INPUT;
- ENABLE_MOUSE_INPUT; // Makes mouse events available to the ReadConsoleInput function.
- ENABLE_INSERT_MODE; // If enabled, text entered will be inserted at the current cursor location and all text following that location will not be overwritten. When disabled, all following text will be overwritten.
+ ENABLE_MOUSE_INPUT;
+ ENABLE_INSERT_MODE;
_UNUSED_0040_;
_UNUSED_0080_;
_UNUSED_0100_;
- ENABLE_VIRTUAL_TERMINAL_INPUT; // If enable, makes user input available to the ReadConsole function.
+ ENABLE_VIRTUAL_TERMINAL_INPUT; // If set, makes user input available to the ReadConsole function.
_UNUSED_0400_;
_UNUSED_0800_;
}
@@ -57,11 +40,11 @@
// https://learn.microsoft.com/en-us/windows/console/setconsolemode
// https://learn.microsoft.com/en-us/windows/console/high-level-console-modes
Console_Output_Mode :: enum_flags u32 {
- ENABLE_PROCESSED_OUTPUT; //
- ENABLE_WRAP_AT_EOL_OUTPUT; //
- ENABLE_VIRTUAL_TERMINAL_PROCESSING; //
- DISABLE_NEWLINE_AUTO_RETURN; //
- ENABLE_LVB_GRID_WORLDWIDE; //
+ ENABLE_PROCESSED_OUTPUT; // If set, ASCII control sequences are processed by the system.
+ ENABLE_WRAP_AT_EOL_OUTPUT; // If set, the cursor moves to the beginning of the next row when it reaches the end of the current row.
+ ENABLE_VIRTUAL_TERMINAL_PROCESSING; // If set, VT100 control sequences are processed by the system.
+ DISABLE_NEWLINE_AUTO_RETURN;
+ ENABLE_LVB_GRID_WORLDWIDE;
_UNUSED_0020_;
_UNUSED_0040_;
_UNUSED_0080_;
@@ -123,6 +106,23 @@
bSetFocus : BOOL;
}
+ // https://learn.microsoft.com/en-us/windows/console/readconsoleinput
+ ReadConsoleInputW :: (hConsoleInput: HANDLE, lpBuffer: PINPUT_RECORD, nLength: DWORD, lpNumberOfEventsRead: LPDWORD) -> success: bool #foreign kernel32;
+
+ // https://learn.microsoft.com/windows/console/readconsole
+ ReadConsoleW :: (hConsoleInput: HANDLE, lpBuffer: LPVOID, nNumberOfchars_to_read: DWORD, lpNumberOfchars_read: LPVOID, pInputControl: LPVOID) -> success: bool #foreign kernel32;
+
+ // https://learn.microsoft.com/windows/console/flushconsoleinputbuffer
+ FlushConsoleInputBuffer :: (hConsoleInput: HANDLE) -> bool #foreign kernel32;
+
+ // https://learn.microsoft.com/windows/console/getnumberofconsoleinputevents
+ GetNumberOfConsoleInputEvents :: (hConsoleInput: HANDLE, lpcNumberOfEvents: LPDWORD) -> bool #foreign kernel32;
+
+ // https://learn.microsoft.com/en-us/windows/console/peekconsoleinput
+ PeekConsoleInputW :: (hConsoleInput: HANDLE, lpBuffer: PINPUT_RECORD, nLength: DWORD, lpNumberOfEventsRead: LPDWORD) -> bool #foreign kernel32;
+
+////////////////////////////////////////////////////////////////////////////////
+
stdin: HANDLE;
initial_stdin_mode: u32;
raw_stdin_mode: Console_Input_Mode;
@@ -135,6 +135,7 @@
widechar_buffer: [512] u16;
+////////////////////////////////////////////////////////////////////////////////
peek_input :: inline () -> INPUT_RECORD, success := true {
record: INPUT_RECORD;
@@ -172,19 +173,19 @@ count_input :: inline () -> u32, success := true {
#scope_export
-OS_prepare_terminal :: () {
+OS_prepare_terminal :: () -> success := true {
// stdin
stdin = GetStdHandle(STD_INPUT_HANDLE);
if stdin == INVALID_HANDLE_VALUE {
error_code, error_string := get_error_value_and_string();
log_error("Invalid input handler: code %, %", error_code, error_string);
- return;
+ return false;
}
if xx GetConsoleMode(stdin, *initial_stdin_mode) == false {
error_code, error_string := get_error_value_and_string();
log_error("Failed to get input mode: code %, %", error_code, error_string);
- return;
+ return false;
}
raw_stdin_mode = (cast(Console_Input_Mode) initial_stdin_mode);
raw_stdin_mode |= (.ENABLE_VIRTUAL_TERMINAL_INPUT);
@@ -193,7 +194,7 @@ OS_prepare_terminal :: () {
if xx SetConsoleMode(stdin, xx raw_stdin_mode) == false {
error_code, error_string := get_error_value_and_string();
log_error("Failed to set input mode: code %, %", error_code, error_string);
- return;
+ return false;
}
// stdout
@@ -201,12 +202,12 @@ OS_prepare_terminal :: () {
if stdout == INVALID_HANDLE_VALUE {
error_code, error_string := get_error_value_and_string();
log_error("Invalid output handler: code %, %", error_code, error_string);
- return;
+ return false;
}
if xx GetConsoleMode(stdout, *initial_stdout_mode) == false {
error_code, error_string := get_error_value_and_string();
log_error("Failed to get output mode: code %, %", error_code, error_string);
- return;
+ return false;
}
raw_stdout_mode = (cast(Console_Output_Mode) initial_stdout_mode);
raw_stdout_mode |= (.ENABLE_VIRTUAL_TERMINAL_PROCESSING | .ENABLE_PROCESSED_OUTPUT | .ENABLE_WRAP_AT_EOL_OUTPUT);
@@ -214,7 +215,7 @@ OS_prepare_terminal :: () {
if xx SetConsoleMode(stdout, xx raw_stdout_mode) == false {
error_code, error_string := get_error_value_and_string();
log_error("Failed to set output mode: code %, %", error_code, error_string);
- return;
+ return false;
}
// Acording to [documentation](https://learn.microsoft.com/en-us/windows/win32/intl/code-pages)
@@ -223,26 +224,27 @@ OS_prepare_terminal :: () {
// As long we use the Unicode functions, we shouldn't need to set the code page to UTF8.
// SetConsoleCP(CP_UTF8);
// SetConsoleOutputCP(CP_UTF8);
+
+ return;
}
-OS_reset_terminal :: () {
+OS_reset_terminal :: () -> success := true {
if xx SetConsoleMode(stdin, initial_stdin_mode) == false {
error_code, error_string := get_error_value_and_string();
log_error("Failed to reset input mode: code %, %", error_code, error_string);
- return;
+ return false;
}
if xx SetConsoleMode(stdout, initial_stdout_mode) == false {
error_code, error_string := get_error_value_and_string();
log_error("Failed to reset output mode: code %, %", error_code, error_string);
- return;
+ return false;
}
+ return;
}
OS_flush_input :: inline () {
- /*
- This API is not recommended and does not have a virtual terminal equivalent.
- Attempting to empty the input queue all at once can destroy state in the queue in an unexpected manner.
- */
+ // This API is not recommended and does not have a virtual terminal equivalent.
+ // Attempting to empty the input queue all at once can destroy state in the queue in an unexpected manner.
if FlushConsoleInputBuffer(stdin) == false {
error_code, error_string := get_error_value_and_string();
log_error("Failed to flush input: code %, %", error_code, error_string);
@@ -318,13 +320,11 @@ OS_read_input :: (buffer: *u8, bytes_to_read: s64) -> bytes_read: s64, success :
// 0: do not wait
// -1: wait indefinitely
OS_wait_for_input :: (timeout_milliseconds: s32 = -1) -> is_input_available: bool, success := true {
- /*
- The Windows API provides all input events (keyboard, mouse, window resize) on a single input buffer.
- To make it match this module's API, we need to do some pre-processing while waiting for input.
- This means that OS_wait_for_input will peek at the input events, signal if a window resize is found,
- and discard unwanted events (like button release events).
- A similar logic is applied in OS_read_input.
- */
+ // The Windows API provides all input events (keyboard, mouse, window resize) on a single input buffer.
+ // To make it match this module's API, we need to do some pre-processing while waiting for input.
+ // This means that OS_wait_for_input will peek at the input events, signal if a window resize is found,
+ // and discard unwanted events (like button release events).
+ // A similar logic is applied in OS_read_input.
expiration := current_time_monotonic() + to_apollo(timeout_milliseconds / 1000.0);