Obtenga el código clave de una tecla, desde un teclado personalizado

12

Estoy tratando de transformar un Minitel en una computadora con una Raspberry Pi.

Este es un minitel:

ingrese la descripción de la imagen aquí

Así que solde la matriz del teclado minitel a una pcb de teclado usb, así: ingrese la descripción de la imagen aquí

Todo funciona bien, recibo algunas teclas de mi teclado personalizado. Solo necesito reasignar las claves adecuadamente.

Así que estoy tratando de crear un programa que me pida que presione ay atrape el código clave correspondiente, y luego con todas las teclas de mi teclado personalizado, para finalmente producir un archivo xmodmap.

El único problema que tengo es que no puedo entender cómo puedo obtener ese código clave (¡y solo eso!). Lo intenté xevpero se muestran demasiados datos para filtrarlos.

Sé que podría rastrear todos los códigos clave a mano, pero transformaré 10 Minitels, ¡así que preferiría una forma más rápida!

xavier.seignard
fuente
¿Podría volcar las ROM de Minitel (s) que tiene, para el proyecto MESS? Ese hardware actualmente no está doblado y es sin duda de importancia histórica.
sendmoreinfo
¡por qué no, pero no tengo idea de cómo hacerlo!
xavier.seignard 01 de

Respuestas:

6

Supongo que está tratando de hacer esto en shell o similar (de lo contrario, solo usaría las bibliotecas X directamente). Si es así, puede ser xinput --test «device-name»mucho más fácil de analizar.

Desafortunadamente, realmente no es amigable con los scripts de shell. Pero puedes hacer que funcione stdbuf. Se ejecuta hasta que lo matas, pero tu script de shell podría canalizarlo read.

Entonces, puedes hacer algo como esto:

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

Deberá usar el nombre de teclado correcto en lugar del "teclado AT Translated Set 2". Puedes encontrarlo con 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)]

Desafortunadamente, tiene que usar un dispositivo específico, no puede usar el teclado central.

(Además, necesitará encontrar una forma de eliminar el xinput en lo anterior, o simplemente contentarse con presionar Control-C cuando haya ingresado todas las claves. Y probablemente desee enumerar más claves que qwerty. )

derobert
fuente
gracias derobert! eso se adapta perfectamente a mi necesidad! Usé idel teclado en lugar de su nombre, porque tuve conflictos con 2 mismos nombres. Entonces, ¿ xinput test 18dónde 18 es la identificación de mi teclado?
xavier.seignard 01 de
si pudiera hacer lo mismo con un comando que no se ejecuta por mucho tiempo (es decir, se detiene después de presionar la primera tecla y devuelve el código de la tecla) sería una especie de sueño :)
xavier.seignard
@ xavier.seignard Intenté y no pude encontrar una utilidad que haga eso. Pero sería bastante fácil tomar la fuente xinput y hacer que funcione de esa manera ... compruebe test.c, parece que la función relevante es print_events. ¿Quizás xorg tomaría un parche para agregar una bandera para detenerse después de n eventos?
derobert
@ xavier.seignard Acabo de encontrar una manera de hacer eso ... xinput --query-stateda el estado actual y sale inmediatamente. Podrías ocuparlo.
derobert