#include #include #include #include void move_cursor(int direction, uint8_t *pos, int len) { if (direction == -1) { if (*pos != 0) { *pos -= 1; } else { return; } printf("\x0D "); printf("\x0D\x1B[1A>"); printf("\x0D"); } else if (direction == 1) { if (*pos != len - 1) { *pos += 1; } else { return; } printf("\x0D "); printf("\x0D\x1B[1B>"); printf("\x0D"); } fflush(stdout); } int menu(char **elements, int len) { struct pollfd poller[1]; poller[0].fd = STDIN_FILENO; poller[0].events = POLLIN; printf("\x1B[H"); // home for (int i = 0; i < len; i++) { printf(" %s\n", elements[i]); } printf("\x1B[H"); // home fflush(stdout); uint8_t pos = 0; while (1) { int events = poll(poller, 1, -1); if (events > 0 && poller[0].revents & POLLIN) { char buffer[10]; uint16_t length = read(STDIN_FILENO, buffer, sizeof(buffer)); if (length > 0) { uint8_t i; for (i = 0; i < length; i++) { if (buffer[i] == 'q') return -1; else if (buffer[i] == 'j') { move_cursor(1, &pos, len); } else if (buffer[i] == 'k') { move_cursor(-1, &pos, len); } else if (buffer[i] == '\n') { return pos; } } } else { return -1; } } else { return -1; } } }