|
|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|