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