From 3fbb32826b5417ba0204119b81e90f406b55c2c9 Mon Sep 17 00:00:00 2001 From: Ronald Date: Sun, 26 Oct 2025 13:33:13 +0000 Subject: [PATCH] Start drawing UI in C --- c/main.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/c/main.c b/c/main.c index 2556d14..e52facd 100644 --- a/c/main.c +++ b/c/main.c @@ -19,6 +19,11 @@ #define MOVE_CURSOR_RIGHT "\x1b[1C" #define MOVE_CURSOR_LEFT "\x1b[1D" +#define MOVE_CURSOR_UP_X "\x1b[%dA" +#define MOVE_CURSOR_DOWN_X "\x1b[%dB" +#define MOVE_CURSOR_RIGHT_X "\x1b[%dC" +#define MOVE_CURSOR_LEFT_X "\x1b[%dD" + // man console_codes // Directions @@ -33,13 +38,13 @@ typedef struct { int number_of_display_lines; int number_of_display_columns; bool resized; + bool update_display; bool should_exit; struct termios original_termios; } State; static State state = {0}; - void sigwinch_handler(int signal) { fprintf(stderr, "INFO: received signal \"%s\"\n", strsignal(signal)); @@ -82,6 +87,18 @@ void enable_raw_mode(void) } } +int draw_ui(void) +{ + get_terminal_size(); + + printf("%s%s", CLEAR_SCREEN, MOVE_CURSOR_HOME); + + for (int i = 0; i < state.number_of_display_lines; i++) { + printf(" ~ \n"); + printf(MOVE_CURSOR_LEFT_X, state.number_of_display_columns); + } +} + int main(void) { // TODO: switch to sigaction @@ -96,10 +113,18 @@ int main(void) printf(MOVE_CURSOR_HOME); fflush(stdout); - get_terminal_size(&state); + get_terminal_size(); + + state.update_display = true; char c; while (true) { + if (state.update_display) { + draw_ui(); + + state.update_display = false; + } + ssize_t n = read(STDIN_FILENO, &c, 1); if (n == -1) continue; @@ -108,14 +133,18 @@ int main(void) switch (c) { case 'h': printf("%s%s", MOVE_CURSOR_LEFT, MOVE_CURSOR_LEFT); + state.update_display = true; break; case 'j': printf("%s%s", MOVE_CURSOR_DOWN, MOVE_CURSOR_LEFT); + state.update_display = true; break; case 'k': printf("%s%s", MOVE_CURSOR_UP, MOVE_CURSOR_LEFT); + state.update_display = true; break; case 'l': + state.update_display = true; break; }