1 /* test_scankey.c - collate incoming ansi escape sequences.
2 *
3 * Copyright 2015 Rob Landley <rob@landley.net>
4 *
5 * TODO sigwinch
6
7 USE_TEST_SCANKEY(NEWTOY(test_scankey, 0, 0))
8
9 config TEST_SCANKEY
10 bool "test_scankey"
11 default n
12 help
13 usage: test_scankey
14
15 Move a letter around the screen. Hit ESC to exit.
16 */
17
18 #define FOR_test_scankey
19 #include "toys.h"
20
test_scankey_main(void)21 void test_scankey_main(void)
22 {
23 time_t t[2];
24 unsigned width, height, tick;
25 char c = 'X', scratch[16];
26 int key, x, y;
27
28 t[0] = t[1] = x = tick = 0;
29 memset(scratch, 0, 16);
30 y = 1;
31
32 sigatexit(tty_sigreset); // Make ctrl-c restore tty
33 tty_esc("?25l"); // hide cursor
34 tty_esc("0m"); // reset color to default
35 tty_esc("2J"); // Clear screen
36 xset_terminal(1, 1, 0); // Raw mode
37
38 for (;;) {
39 tty_jump(x, y);
40 xputc(c);
41 t[1&++tick] = time(0);
42 if (t[0] != t[1]) terminal_probesize(&width, &height);
43 // Don't block first time through, to force header print
44 key = scan_key_getsize(scratch, -1*!!t[0], &width, &height);
45 tty_jump(0, 0);
46 printf("ESC to exit: ");
47 // Print unknown escape sequence
48 if (*scratch) {
49 printf("key=[ESC");
50 // Fetch rest of sequence after deviation, time gap determines end
51 while (0<(key = scan_key_getsize(scratch, 0, &width, &height)))
52 printf("%c", key);
53 printf("] ");
54 } else printf("key=%d ", key);
55 printf("x=%d y=%d width=%d height=%d\033[K", x, y, width, height);
56 fflush(0);
57
58 if (key == -2) continue;
59 if (key <= ' ') break;
60 if (key>=256) {
61 tty_jump(x, y);
62 xputc(' ');
63
64 key -= 256;
65 if (key==KEY_UP) y--;
66 else if (key==KEY_DOWN) y++;
67 else if (key==KEY_RIGHT) x++;
68 else if (key==KEY_LEFT) x--;
69 else if (key==KEY_PGUP) y = 0;
70 else if (key==KEY_PGDN) y = 999;
71 else if (key==KEY_HOME) x = 0;
72 else if (key==KEY_END) x = 999;
73 if (y<1) y = 1;
74 if (y>=height) y = height-1;
75 if (x<0) x = 0;
76 if (x>=width) x = width-1;
77 } else c = key;
78 }
79 tty_reset();
80 }
81