diff options
Diffstat (limited to 'l.c')
-rw-r--r-- | l.c | 61 |
1 files changed, 47 insertions, 14 deletions
@@ -14,8 +14,17 @@ #define prn(...) dprintf(ttyfd, __VA_ARGS__) +char *lines[3] = { + "line 1", + "line 2", + "line 3" +}; + +int current = -1; /* currently selected item */ +int height = 3; /* height of output in rows */ int ttyfd; - +int x, y; /* original cursor position in cols, rows */ + /* enable/disable "raw" mode */ void raw(bool enable) { int r; @@ -23,7 +32,7 @@ void raw(bool enable) { struct termios raw; if (enable) { - r = tcgetattr(0, &orig); + r = tcgetattr(ttyfd, &orig); if (r == -1) err(1, "tcgetattr"); raw = orig; @@ -32,11 +41,11 @@ void raw(bool enable) { raw.c_cflag |= CS8; raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); - r = tcsetattr(0, TCSAFLUSH, &raw); + r = tcsetattr(ttyfd, TCSAFLUSH, &raw); if (r == -1) err(1, "tcsetattr"); } else - tcsetattr(0, TCSAFLUSH, &orig); + tcsetattr(ttyfd, TCSAFLUSH, &orig); } /* cursor position report */ @@ -76,19 +85,31 @@ int cpr(int *x, int *y) { return 0; } -void up() {} -void down() {} -void right() {} -void left() {} +/* select item */ +int item(int n) { + if (n < 1 || n > height) return -1; + if (current != -1) + prn("%s", lines[current - 1]); + current = n; + prn("%s%d;%dH", CSI, y + n - 1, 0); + prn(CSI "7m"); + prn("%s", lines[n - 1]); + prn(CSI "0m"); + prn("%s%d;%dH", CSI, y + n - 1, 0); + return 0; +} + +int up() { return item(current-1); } +int down() { return item(current+1); } +int right() {} +int left() {} int main() { - char c, *p; + char c, *p, *phrase; int i, r; struct winsize w; - int height; /* height of output in rows */ - int x, y; /* original cursor position in cols, rows */ - char *ex = "file1 file2 file3\r\nfile4 file5 file6\r\nfile7"; + phrase = NULL; ttyfd = open("/dev/tty", O_RDWR); if (ttyfd == -1) err(1, "open"); @@ -100,9 +121,11 @@ int main() { if (r == -1) goto quit; /* print output */ - prn("%s", ex); + for (i = 0; i < height; i++) + prn("%s\r\n", lines[i]); /* get height of output */ + /* p = ex - 1; height = 0; while (*(++p) != '\0') @@ -120,6 +143,9 @@ int main() { /* restore original cursor position (CUP) */ prn("%s%d;%dH", CSI, y, x); + /* select first item */ + item(1); + while (read(0, &c, 1) != 0) { switch (c) { case 'q': @@ -134,10 +160,17 @@ int main() { if (c == 'C') right(); if (c == 'D') left(); break; + case 13: /* enter */ + goto quit; + phrase = lines[current - 1]; + break; } } quit: - prn(CSI "J"); /* delete from cursor to end of display (ED) */ + //prn("%s%d;%dH", CSI, y, x); + //prn(CSI "J"); /* delete from cursor to end of display (ED) */ raw(false); + if (phrase != NULL) + printf("%s\n", phrase); } |