Loading menu.c +1 −1 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ char *menu_prompt(const menu_item *items, const unsigned int num_menu_items) { unsigned int hovered_selection_index = 0; // menu logic! TODO make this cross platform (play nice with Windows...) do { // return cursor to menu position // return cursor to menu top position for (int i = 0; i < num_menu_items; i++) { // todo to optimize, only do the erasure part if the hover selection changes printf("\033[A"); // move cursor up one line Loading menu.h +6 −0 Original line number Diff line number Diff line Loading @@ -5,11 +5,17 @@ #ifndef MENU_H #define MENU_H enum MENU_DIRECTION { DOWN, UP, }; typedef struct { char *title; char *command; } menu_item; char *menu_prompt(const menu_item *items, unsigned int num_menu_items); enum MENU_DIRECTION get_menu_direction(int selection); #endif //MENU_H utils.c +4 −9 Original line number Diff line number Diff line Loading @@ -5,14 +5,6 @@ #include <time.h> // timespec struct #include "utils.h" // terminal manipulation includes - only for non-windows #ifndef _WIN32 #include <unistd.h> // for STDIN_FILENO, used with termios #include <termios.h> // for registering raw keypresses, as in menus #else #include <conio.h> #endif void clear_screen(void) { #ifndef _WIN32 system("clear"); Loading @@ -36,12 +28,15 @@ void set_raw_terminal_configuration(void) { raw_terminal_configuration = original_terminal_configuration; // new_terminal_configuration.c_lflag &= ~ICANON & ~ECHO & ~ISIG; // disables canonical input, echo, signals (we want signals but good to know) raw_terminal_configuration.c_lflag &= ~ICANON & ~ECHO; // disables canonical input, echo tcsetattr(STDIN_FILENO, TCSANOW, &raw_terminal_configuration); // apply settings to terminal // tcsetattr(STDIN_FILENO, TCSANOW, &raw_terminal_configuration); // apply settings to terminal set_terminal_configuration(&raw_terminal_configuration); #endif } void set_original_terminal_configuration(void) { #ifndef _WIN32 // set_terminal_configuration(&original_terminal_configuration); // tcsetattr(STDIN_FILENO, TCSANOW, &original_terminal_configuration); // apply settings to terminal set_terminal_configuration(&original_terminal_configuration); #endif } Loading utils.h +8 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,14 @@ #ifndef UTILS_H #define UTILS_H // terminal manipulation includes - only for non-windows #ifndef _WIN32 #include <unistd.h> // for STDIN_FILENO, used with termios #include <termios.h> // for registering raw keypresses, as in menus #else #include <conio.h> #endif FILE *get_urandom(void); void clear_screen(void); void set_raw_terminal_configuration(void); Loading Loading
menu.c +1 −1 Original line number Diff line number Diff line Loading @@ -11,7 +11,7 @@ char *menu_prompt(const menu_item *items, const unsigned int num_menu_items) { unsigned int hovered_selection_index = 0; // menu logic! TODO make this cross platform (play nice with Windows...) do { // return cursor to menu position // return cursor to menu top position for (int i = 0; i < num_menu_items; i++) { // todo to optimize, only do the erasure part if the hover selection changes printf("\033[A"); // move cursor up one line Loading
menu.h +6 −0 Original line number Diff line number Diff line Loading @@ -5,11 +5,17 @@ #ifndef MENU_H #define MENU_H enum MENU_DIRECTION { DOWN, UP, }; typedef struct { char *title; char *command; } menu_item; char *menu_prompt(const menu_item *items, unsigned int num_menu_items); enum MENU_DIRECTION get_menu_direction(int selection); #endif //MENU_H
utils.c +4 −9 Original line number Diff line number Diff line Loading @@ -5,14 +5,6 @@ #include <time.h> // timespec struct #include "utils.h" // terminal manipulation includes - only for non-windows #ifndef _WIN32 #include <unistd.h> // for STDIN_FILENO, used with termios #include <termios.h> // for registering raw keypresses, as in menus #else #include <conio.h> #endif void clear_screen(void) { #ifndef _WIN32 system("clear"); Loading @@ -36,12 +28,15 @@ void set_raw_terminal_configuration(void) { raw_terminal_configuration = original_terminal_configuration; // new_terminal_configuration.c_lflag &= ~ICANON & ~ECHO & ~ISIG; // disables canonical input, echo, signals (we want signals but good to know) raw_terminal_configuration.c_lflag &= ~ICANON & ~ECHO; // disables canonical input, echo tcsetattr(STDIN_FILENO, TCSANOW, &raw_terminal_configuration); // apply settings to terminal // tcsetattr(STDIN_FILENO, TCSANOW, &raw_terminal_configuration); // apply settings to terminal set_terminal_configuration(&raw_terminal_configuration); #endif } void set_original_terminal_configuration(void) { #ifndef _WIN32 // set_terminal_configuration(&original_terminal_configuration); // tcsetattr(STDIN_FILENO, TCSANOW, &original_terminal_configuration); // apply settings to terminal set_terminal_configuration(&original_terminal_configuration); #endif } Loading
utils.h +8 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,14 @@ #ifndef UTILS_H #define UTILS_H // terminal manipulation includes - only for non-windows #ifndef _WIN32 #include <unistd.h> // for STDIN_FILENO, used with termios #include <termios.h> // for registering raw keypresses, as in menus #else #include <conio.h> #endif FILE *get_urandom(void); void clear_screen(void); void set_raw_terminal_configuration(void); Loading