iomenu

interactive text selection menu
Log | Files | Refs | README | LICENSE

commit 09d7cdbc37907c01400e2193f4eafba74736aa7d
parent 2425ac3f4cb13eef4db1e4e4d66feede9bf3ab84
Author: Josuah Demangeon <josuah.demangeon@gandi.net>
Date:   Mon, 21 Aug 2017 15:40:31 +0200

simpler input escape sequence management

Diffstat:
Miomenu.c | 35+++++++++++------------------------
1 file changed, 11 insertions(+), 24 deletions(-)

diff --git a/iomenu.c b/iomenu.c @@ -14,10 +14,9 @@ #define CONTROL(char) (char ^ 0x40) #define ALT(char) (char + 0x80) +#define ESC(char) (char + 0x80 + 0x80) #define MIN(X, Y) (((X) < (Y)) ? (X) : (Y)) -enum { KEY_UP = 0x81, KEY_DOWN, PG_UP, PG_DOWN }; - static struct winsize ws; static struct termios termios; static int ttyfd; @@ -341,22 +340,26 @@ top: filter(); break; - case KEY_UP: + case ESC('A'): /* up */ case CONTROL('P'): move(-1); break; - case KEY_DOWN: + case ESC('B'): /* down */ case CONTROL('N'): move(+1); break; - case PG_UP: + case ESC('5'): + if (fgetc(stdin) != '~') break; + /* FALLTHROUGH */ case ALT('v'): movepg(-1); break; - case PG_DOWN: + case ESC('6'): + if (fgetc(stdin) != '~') break; + /* FALLTHROUGH */ case CONTROL('V'): movepg(+1); break; @@ -373,24 +376,8 @@ top: return EXIT_SUCCESS; case ALT('['): - switch (fgetc(stdin)) { - case 'A': - key = KEY_UP; - goto top; - case 'B': - key = KEY_DOWN; - goto top; - case '5': - if (fgetc(stdin) == '~') { - key = PG_UP; - goto top; - } - case '6': - if (fgetc(stdin) == '~') { - key = PG_DOWN; - goto top; - } - } + key = ESC(fgetc(stdin)); + goto top; case 033: /* escape / alt */ key = ALT(fgetc(stdin));