Obtenha o código de uma tecla, em um teclado personalizado

12

Estou tentando transformar um Minitel em um computador com um Raspberry Pi.

Este é um minitel:

insira a descrição da imagem aqui

Então, soldei a matriz do teclado minitel em um pcb de teclado USB, assim: insira a descrição da imagem aqui

Tudo está funcionando bem, recebo algumas teclas do meu teclado personalizado. Eu só preciso remapear as chaves adequadamente.

Então, estou tentando criar um programa que me peça para pressionar ae interceptar o código de tecla correspondente e, em seguida, com todas as teclas do meu teclado personalizado, para finalmente produzir um arquivo xmodmap.

O único problema que tenho é que não consigo descobrir como obter esse código de chave (e apenas isso!). Eu tentei, xevmas há muitos dados exibidos para filtrá-los.

Eu sei que poderia rastrear todos os códigos de chave manualmente, mas transformarei 10 Minitels, então prefiro uma maneira mais rápida!

xavier.seignard
fonte
Você poderia despejar as ROMs do Minitel (s) que você possui, para o projeto MESS? Atualmente, esse hardware não está despejado e é certamente de importância histórica.
sendmoreinfo
por que não, mas não tenho idéia de como fazer isso!
Xavier.seignard

Respostas:

6

Presumo que você esteja tentando fazer isso no shell ou similar (caso contrário, você usaria as bibliotecas do X diretamente). Nesse caso, você pode achar xinput --test «device-name»muito mais fácil de analisar.

Infelizmente, não é realmente compatível com scripts de shell. Mas você pode fazê-lo funcionar stdbuf. Ele funciona até você matá-lo, mas seu script de shell pode canalizá-lo 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 do "AT Translated Set 2 keyboard". 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 pode usar o teclado principal.

(Além disso, você precisará encontrar uma maneira de eliminar o xinput acima, ou apenas se contentar em pressionar Control-C quando tiver inserido todas as chaves. E provavelmente desejará listar mais chaves do que qwerty. )

derobert
fonte
graças derobert! isso se encaixa perfeitamente na minha necessidade! Usei o idteclado em vez de seu nome, porque tive conflitos com dois mesmos nomes. Então, xinput test 18onde 18 é o id do meu teclado.
Xml.seignard
se eu poderia fazer o mesmo com um comando que não é de longa duração (isto pára após a primeira tecla pressionada e retorna o código de chave), seria uma espécie de sonho :)
xavier.seignard
@ xavier.seignard Tentei e não consegui encontrar um utilitário que faça isso. Mas seria bastante fácil pegar a fonte xinput e fazê-la funcionar dessa maneira ... verifique test.c, parece que a função relevante é print_events. Talvez o xorg faça um patch para adicionar uma bandeira para parar após n eventos?
21313 derobert
@ xavier.seignard Acabei de encontrar uma maneira de fazer isso ... xinput --query-statefornece o estado atual e sai imediatamente. Você poderia fazer um loop ocupado.
derobert