Holen Sie sich den Schlüsselcode eines Schlüssels von einer maßgeschneiderten Tastatur

12

Ich versuche, einen Minitel in einen Computer mit einem Himbeer-Pi zu verwandeln.

Dies ist ein Minitel:

Bildbeschreibung hier eingeben

Also habe ich die Matrix der Minitel-Tastatur auf eine USB-Tastatur-Platine gelötet: Bildbeschreibung hier eingeben

Alles funktioniert in Ordnung, ich erhalte einige Tasten von meiner benutzerdefinierten Tastatur. Ich muss nur die Tasten entsprechend neu zuordnen.

Daher versuche ich, ein Programm zu erstellen, das mich aauffordert, den entsprechenden Schlüsselcode zu drücken und einzufangen und dann mit allen Tasten meiner benutzerdefinierten Tastatur eine xmodmap-Datei zu erstellen.

Das einzige Problem, das ich habe, ist, dass ich nicht herausfinden kann, wie ich diesen Schlüsselcode bekommen kann (und nur das!). Ich habe es versucht, xevaber es werden zu viele Daten angezeigt, um sie herauszufiltern.

Ich weiß, dass ich alle Schlüsselcodes von Hand verfolgen kann, aber ich werde 10 Minitels umwandeln, also würde ich einen schnelleren Weg bevorzugen!

xavier.seignard
quelle
Könnten Sie die ROM (s) von Minitel (s) ausgeben, die Sie für das MESS-Projekt haben? Diese Hardware ist derzeit nicht gesichert und sicherlich von historischer Bedeutung.
Sendmoreinfo
warum nicht, aber ich habe keine Ahnung, wie das geht!
xavier.seignard

Antworten:

6

Ich gehe davon aus, dass Sie versuchen, dies in Shell oder ähnlichem zu tun (ansonsten würden Sie die X-Bibliotheken direkt verwenden). In diesem xinput --test «device-name»Fall ist das Parsen möglicherweise viel einfacher.

Leider ist es wirklich nicht Shell-Scripting-freundlich. Aber Sie können damit arbeiten stdbuf. Es läuft, bis Sie es töten, aber Ihr Shell-Skript könnte es weiterleiten read.

Sie können also Folgendes tun:

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

Sie müssen den richtigen Tastaturnamen anstelle von "AT Translated Set 2 keyboard" verwenden. Sie finden es mit 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)]

Leider müssen Sie ein bestimmtes Gerät verwenden - Sie können die Haupttastatur nicht verwenden.

(Außerdem müssen Sie einen Weg finden, um die Eingabe von x zu beenden, oder sich damit zufrieden geben, Control-C zu drücken, wenn Sie alle Schlüssel eingegeben haben. Wahrscheinlich möchten Sie mehr Schlüssel als qwerty auflisten. )

derobert
quelle
danke derobert! das passt perfekt zu meinem Bedürfnis! Ich habe die idTastatur anstelle ihres Namens verwendet, weil ich Konflikte mit zwei gleichen Namen hatte. Also, xinput test 18wo 18 ist die ID meiner Tastatur.
xavier.seignard
Wenn ich dasselbe mit einem Befehl machen könnte, der nicht lange ausgeführt wird (dh nach dem ersten Tastendruck stoppt und den
Tastencode
@ xavier.seignard Ich habe versucht, ein Dienstprogramm zu finden, das dies tut. Aber es wäre ziemlich einfach, die xinput-Quelle zu nehmen und sie so arbeiten zu lassen ... Überprüfen Sie test.c, wie die relevante Funktion aussieht print_events. Vielleicht würde xorg einen Patch nehmen, um eine Flagge hinzuzufügen, die nach n Ereignissen stoppt ?
Derobert
@ xavier.seignard Ich bin gerade über einen Weg gelaufen, um das zu tun ... xinput --query-stategibt den aktuellen Status an und verlässt ihn sofort. Sie könnten eine Besetztschleife ausführen.
Derobert