Suponho que você esteja tentando fazer isso no shell ou similar (senão, você usaria as bibliotecas X diretamente). Em caso afirmativo, você pode achar o xinput --test «device-name»
muito mais fácil de analisar.
Infelizmente, ele não é compatível com scripts de shell. Mas você pode fazê-lo funcionar com stdbuf
. Ele é executado até que você o mate, mas seu script de shell pode direcioná-lo para read
.
Então, você pode fazer algo assim:
stty -echo
stdbuf -oL xinput test 'AT Translated Set 2 keyboard' \
| perl -nE 'BEGIN {$| = 1} m/^key press\s+(\d+)/ and say $1' \
| for key in q w e r t y; do
echo -n "Please press $key: "
read -r keycode
echo "key $key = $keycode"
done
stty echo
Você precisará usar o nome do teclado correto no lugar de "Teclado do Conjunto 2 Traduzido AT". Você pode encontrá-lo com xinput list
:
anthony@Zia:~$ xinput list
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech USB-PS/2 Optical Mouse id=8 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Power Button id=7 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=9 [slave keyboard (3)]
Infelizmente, você precisa usar um dispositivo específico - não é possível usar o teclado central.
(Além disso, você precisará encontrar uma maneira de matar o xinput acima, ou apenas se contentar em pressionar Control-C quando tiver digitado todas as teclas. E você provavelmente desejará listar mais teclas de qwerty.)