showkey: make showkey -a work on any stdin
authorHarald Becker <ralda@gmx.de>
Sun, 27 Feb 2011 06:16:44 +0000 (07:16 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sun, 27 Feb 2011 06:16:44 +0000 (07:16 +0100)
function                                             old     new   delta
showkey_main                                         496     513     +17

Signed-off-by: Harald Becker <ralda@gmx.de>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
console-tools/showkey.c

index e7834f7..06df68b 100644 (file)
@@ -56,37 +56,45 @@ int showkey_main(int argc UNUSED_PARAM, char **argv)
        // FIXME: aks are all mutually exclusive
        getopt32(argv, "aks");
 
-       // get keyboard settings
-       xioctl(STDIN_FILENO, KDGKBMODE, &kbmode);
-       printf("kb mode was %s\n\nPress any keys. Program terminates %s\n\n",
-               kbmode == K_RAW ? "RAW" :
-                       (kbmode == K_XLATE ? "XLATE" :
-                               (kbmode == K_MEDIUMRAW ? "MEDIUMRAW" :
-                                       (kbmode == K_UNICODE ? "UNICODE" : "UNKNOWN")))
-               , (option_mask32 & OPT_a) ? "on EOF (ctrl-D)" : "10s after last keypress"
-       );
-
        // prepare for raw mode
        xget1(&tio, &tio0);
        // put stdin in raw mode
        xset1(&tio);
 
+#define press_keys "Press any keys, program terminates %s:\r\n\n"
+
        if (option_mask32 & OPT_a) {
+               // just read stdin char by char
                unsigned char c;
 
-               // just read stdin char by char
+               printf(press_keys, "on EOF (ctrl-D)");
+
+               // read and show byte values
                while (1 == read(STDIN_FILENO, &c, 1)) {
                        printf("%3u 0%03o 0x%02x\r\n", c, c, c);
                        if (04 /*CTRL-D*/ == c)
                                break;
                }
+
        } else {
+               // we assume a PC keyboard
+               xioctl(STDIN_FILENO, KDGKBMODE, &kbmode);
+               printf("Keyboard mode was %s.\r\n\n",
+                       kbmode == K_RAW ? "RAW" :
+                               (kbmode == K_XLATE ? "XLATE" :
+                                       (kbmode == K_MEDIUMRAW ? "MEDIUMRAW" :
+                                               (kbmode == K_UNICODE ? "UNICODE" : "UNKNOWN")))
+               );
+
                // set raw keyboard mode
                xioctl(STDIN_FILENO, KDSKBMODE, (void *)(ptrdiff_t)((option_mask32 & OPT_k) ? K_MEDIUMRAW : K_RAW));
 
                // we should exit on any signal; signals should interrupt read
                bb_signals_recursive_norestart(BB_FATAL_SIGS, record_signo);
 
+               // inform user that program ends after time of inactivity
+               printf(press_keys, "10s after last keypress");
+
                // read and show scancodes
                while (!bb_got_signal) {
                        char buf[18];
@@ -94,6 +102,7 @@ int showkey_main(int argc UNUSED_PARAM, char **argv)
 
                        // setup 10s watchdog
                        alarm(10);
+
                        // read scancodes
                        n = read(STDIN_FILENO, buf, sizeof(buf));
                        i = 0;
@@ -121,11 +130,13 @@ int showkey_main(int argc UNUSED_PARAM, char **argv)
                        }
                        puts("\r");
                }
+
+               // restore keyboard mode
+               xioctl(STDIN_FILENO, KDSKBMODE, (void *)(ptrdiff_t)kbmode);
        }
 
-       // restore keyboard and console settings
+       // restore console settings
        xset1(&tio0);
-       xioctl(STDIN_FILENO, KDSKBMODE, (void *)(ptrdiff_t)kbmode);
 
        return EXIT_SUCCESS;
 }