Obtenez le code clé d'une clé, à partir d'un clavier personnalisé

12

J'essaie de transformer un Minitel en ordinateur avec un Raspberry Pi.

Ceci est un minitel:

entrez la description de l'image ici

J'ai donc soudé la matrice du clavier minitel à un pcb clavier usb, comme ceci: entrez la description de l'image ici

Tout fonctionne bien, je reçois quelques touches de mon clavier personnalisé. J'ai juste besoin de remapper les clés de manière appropriée.

J'essaie donc de créer un programme qui me demandera d'appuyer aet de piéger le code clé correspondant, puis avec toutes les touches de mon clavier personnalisé, pour produire finalement un fichier xmodmap.

Le seul problème que j'ai, c'est que je ne peux pas comprendre comment puis-je obtenir ce code clé (et seulement cela!). J'ai essayé xevmais il y a trop de données affichées pour le filtrer.

Je sais que je pourrais suivre tous les codes clés à la main, mais je vais transformer 10 Minitels, donc je préférerais un moyen plus rapide!

xavier.seignard
la source
Pourriez-vous vider les ROM des Minitel (s) que vous avez, pour le projet MESS? Ce matériel n'est actuellement pas sous-évalué et a certainement une importance historique.
sendmoreinfo
pourquoi pas, mais je n'ai aucune idée de comment faire ça!
xavier.seignard

Réponses:

6

Je suppose que vous essayez de le faire en shell ou similaire (sinon, vous utiliseriez simplement les bibliothèques X directement). Si tel est le cas, vous pouvez trouver xinput --test «device-name»beaucoup plus facile à analyser.

Malheureusement, ce n'est vraiment pas compatible avec les scripts shell. Mais vous pouvez le faire fonctionner avec stdbuf. Il s'exécute jusqu'à ce que vous le tuiez, mais votre script shell pourrait le diriger vers read.

Vous pouvez donc faire quelque chose comme ceci:

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

Vous devrez utiliser le nom de clavier correct à la place de "Clavier AT Translated Set 2". Vous pouvez le trouver avec 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)]

Malheureusement, vous devez utiliser un appareil spécifique - vous ne pouvez pas utiliser le clavier principal.

(De plus, vous devrez trouver un moyen de tuer le xinput ci-dessus, ou simplement vous contenter d'appuyer sur Control-C lorsque vous aurez entré toutes les clés. Et vous voudrez probablement lister plus de clés que qwerty. )

derobert
la source
merci derobert! qui correspond parfaitement à mon besoin! J'ai utilisé le idclavier au lieu de son nom, car j'avais des conflits avec 2 mêmes noms. Alors xinput test 18où 18 est l'identifiant de mon clavier.
xavier.seignard
si je pouvais faire de même avec une commande qui n'est pas longue (c'est-à-dire s'arrête après avoir appuyé sur la première touche et retourne le code de la touche) ce serait une sorte de rêve :)
xavier.seignard
@ xavier.seignard J'ai essayé et je n'ai pas trouvé d'utilitaire qui fait ça. Mais il serait assez facile de prendre la source xinput et de la faire fonctionner de cette façon ... vérifiez test.c, on dirait que la fonction pertinente est print_events. Peut-être que xorg prendrait un patch pour ajouter un drapeau pour s'arrêter après n événements?
derobert
@ xavier.seignard Je viens de croiser un moyen de faire ça ... xinput --query-statedonne l'état actuel, et sort immédiatement. Vous pouvez l'occuper en boucle.
derobert