Em um terminal, sempre foi muito difícil ter esse tipo de informação. Você só pode obter um "código-chave" e, claro, isso significa coisas diferentes dependendo da combinação de SO, teclado e terminal que você usa.
Você encontrará uma lista completa desses códigos no seu SO com uma ligação para o xmodmap .
$ xmodmap -pke
keycode 9 = Escape NoSymbol Escape
keycode 10 = ampersand 1 ampersand 1 dead_caron dead_ogonek dead_caron dead_ogonek
keycode 11 = eacute 2 eacute 2 asciitilde Eacute asciitilde Eacute
[...]
keycode 244 = XF86Battery NoSymbol XF86Battery
keycode 245 = XF86Bluetooth NoSymbol XF86Bluetooth
keycode 246 = XF86WLAN NoSymbol XF86WLAN
keycode 247 =
E uma lista de todos os modificadores vale com isso:
$ xmodmap
xmodmap: up to 4 keys per modifier, (keycodes in parentheses):
shift Shift_L (0x32), Shift_R (0x3e)
lock Caps_Lock (0x42)
control Control_L (0x25), Control_R (0x69)
mod1 Alt_L (0x40), Meta_L (0xcd)
mod2 Num_Lock (0x4d)
mod3
mod4 Super_L (0x85), Super_R (0x86), Super_L (0xce), Hyper_L (0xcf)
mod5 ISO_Level3_Shift (0x5c), Mode_switch (0xcb)
Existem algumas informações cruas no banco de dados terminfo ou mais polidas em ncurses API para ajudar os desenvolvedores de sistemas a superar essa confusão.
Se você puder reutilizar um código-fonte existente como
Se você só precisa de suporte moderno a linux, é possível que uma chamada para keyname seja suficiente.