Finding key codes on Linux


It often happens that I get into a situation where I need to know key codes of pressed keys. On my Mac that’s simple. Just use the Key Codes by Many Tricks.

But on Linux I constantly was trying to find out which key produced what.

So I ended up writing a program for that. I started of in the shell, but that ended up being rather tricky and unnecessary complicated. So I redid the whole thing in C.

This is the result

/*
 * Program : code.c
 * Author  : Ton Kersten
*/

#include <stdio.h> #include <curses.h>

#define DONE `q' #define ESC 0x1b #define SPC 0x20

char ch;

main()
{
    printf("Press '%c' to quit!", DONE);

    /*
    * Put the terminal in raw mode, with no echo
    */
    system("stty raw -echo");

    /*
    * Print the header
    */
    printf("%4s\t%4s\t%4s\t%4s\r\n", "Char", " Hex", " Oct", " Dec");
    printf("%4s\t%4s\t%4s\t%4s\r\n", "----", "----", "----", "----");

    /*
    * Set the initial loop value to something odd
    */
    ch: DONE-1;
    while ( ch != DONE )
    {   ch: getchar();

        /*
        * Character read. Display it. Look out for < 0x20
        */
        if ( ch < SPC )
        {   if ( ch == ESC )
            {   /*
                * Esc. Just say 'Esc'
                */
                printf("%-4s\t0x%02x\t%04o\t%04d\r\n",
                        "Esc", ch, ch, ch);
            }
            else
            {   /*
                * < ' '. Print Control character
                */
                printf("^%-c\t0x%02x\t%04o\t%04d\r\n",
                        ch-1+'A', ch, ch, ch);
            }
        }
        else
        {   /*
            * Normal character. Display it normally
            */
            printf("%-4c\t0x%02x\t%04o\t%04d\r\n",
                        ch, ch, ch, ch);
        }
    }

    /*
    * Put the terminal back to something useful
    */
    system("stty sane echo");
}

And this is an example of the output

Press 'q' to quit!

Char     Hex     Oct     Dec
----    ----    ----    ----
Esc     0x1b    0033    0027
O       0x4f    0117    0079
P       0x50    0120    0080
Esc     0x1b    0033    0027
[       0x5b    0133    0091
2       0x32    0062    0050
4       0x34    0064    0052
~       0x7e    0176    0126
q       0x71    0161    0113

See also