Home | History | Annotate | Download | only in example
      1 /* test_scankey.c - collate incoming ansi escape sequences.
      2  *
      3  * Copyright 2015 Rob Landley <rob (at) landley.net>
      4  *
      5  * TODO sigwinch
      6 
      7 USE_TEST_SCANKEY(NEWTOY(test_scankey, 0, TOYFLAG_BIN))
      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 
     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