So ändern Sie scancode-> keycodeZuordnung

So ändern Sie scancode-> keycodeZuordnung

Ich habe meine Feststelltaste auf die Rücktaste neu zugeordnet.

/etc/Standard/Tastatur

XKBLAYOUT="us"
XKBVARIANT="altgr-intl"
BACKSPACE="guess"
XKBOPTIONS="caps:backspace"

Das funktioniert ziemlich gut, außer dass es bei bestimmten Tools nicht funktioniert. Ich habe versucht, xevherauszufinden, was los ist.

Rücktaste gedrückt

KeyPress event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 1028211, (335,635), root:(452,749),
    state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES,
    XLookupString gives 1 bytes: (08) "
    XmbLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

KeyRelease event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 1028272, (335,635), root:(452,749),
    state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES,
    XLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

Feststelltaste gedrückt

KeyPress event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 859789, (391,558), root:(508,672),
    state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES,
    XKeysymToKeycode returns keycode: 22
    XLookupString gives 1 bytes: (08) "
    XmbLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

KeyRelease event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 859875, (391,558), root:(508,672),
    state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES,
    XKeysymToKeycode returns keycode: 22
    XLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

Ich habe es auch im Browser versucht mit

addEventListener('keyup', event => {
  console.log(event.keyCode, event.key, event.code)
})

Dies protokolliert Folgendes, wenn ich die Rücktaste und die Feststelltaste drücke

8 "Backspace" "Backspace"
8 "Backspace" "CapsLock"

Meine Feststelltaste wird also im Grunde auf die Rücktaste umgestellt, aber das funktioniert nur, wenn Tools und Websites die richtigen Prüfungen durchführen. Ich möchte nicht für jedes Tool oder jede Website, die ich verwende und die dies falsch implementiert, einen Fehlerbericht einreichen.

Ist es möglich, die Feststelltaste so zuzuordnen, dass sie eine Rücktaste vollständig emuliert, anstatt sich wie eine neu zugeordnete Feststelltaste zu verhalten?

Antwort1

Sehen wir uns zunächst an, wie ein Tastendruck verarbeitet wird (entnommen ausdiese Antwort):

/Tastatur/ → scancode→ /Eingabetreiber/ → keycode→ /X-Server XKB/ →keysym

Dies scancodeist ein gerätespezifischer Code, der an eine bestimmte Taste gebunden ist und sich zwischen verschiedenen Anbietern/Produkten unterscheiden kann. keycodeund keysymwerden an Anwendungen weitergegeben. Das keycodedient als Abstraktionsebene, da es geräte- und gebietsunabhängig ist. Dasselbe keycodekann je nach Gebietsschema und Status der Modifikatortasten unterschiedliche s erzeugen keysym. Aus diesem Grund suchen einige Anwendungen nur nach dem keycode, insbesondere beim Umgang mit Tastaturkürzeln.

Unser Ziel ist es also, die scancodeFunktion Ihrer Feststelltaste der keycodeFunktion der Rücktaste zuzuordnen. Anwendungen sehen dann dasselbe, keycodeunabhängig keysymdavon, ob Sie die Rücktaste oder die Feststelltaste drücken.

Diese Zuordnung erfolgt durchudevVerwendung derHardmSindDan einerB/lib/udev/hwdb.d/ase-Datei (hwdb.bin), die sowohl in als auch aus .hwdb-Dateien kompiliert wird /etc/udev/hwdb.d/.


So ändern Sie scancode-> keycodeZuordnung

Sammeln Sie die erforderlichen Informationen

Zuerst müssen Sie die bustype, vendor, productund versionIhres Eingabegeräts (Tastatur) sowie die der scancodeTaste bestimmen, die Sie neu zuordnen möchten, und die, der key code identifierSie sie zuordnen möchten.

Führen Sie es aus evtest(möglicherweise müssen Sie es zuerst installieren) und identifizieren Sie Ihre Tastatur in der Geräteliste. Auf Tastaturen mit zusätzlichen Tasten wie Play/Pause, WWW usw. werden diese Tasten oft als anderes Eingabegerät angezeigt. Wenn Sie beim Drücken einer Taste keine Ausgabe erhalten, drücken Sie Control+ Cund versuchen Sie es mit einem anderen Gerät. Wenn Sie Ihre Tastatur identifiziert haben, merken Sie sich die erste Spalte ( /dev/input/eventX) und drücken Sie die Taste, die Sie neu zuordnen möchten. Der Wert danach (MSC_SCAN)ist scancode. Auf meiner Tastatur:

$ evtest
Available devices:
/dev/input/event0:  Power Button
/dev/input/event1:  Power Button
/dev/input/event2:  G19 Gaming Keyboard
/dev/input/event3:  G19 Gaming Keyboard
...
Select the device event number [0-18]:2
...
Event: time 1522111203.117945, -------------- SYN_REPORT ------------
Event: time 1522111220.778787, type 4 (EV_MSC), code 4 (MSC_SCAN),value 70039
Event: time 1522111220.778787, type 1 (EV_KEY), code 14 (KEY_BACKSPACE), value 1

... das scancodeist70039.

Führen Sie nun den folgenden Befehl aus, wobei eventXsich der zuvor ausgewählte Befehl befindet:

$ grep "" /sys/class/input/eventX/device/id/*

Die Ausgabe für meine Tastatur ist

/sys/class/input/event2/device/id/bustype:0003
/sys/class/input/event2/device/id/product:c228
/sys/class/input/event2/device/id/vendor:046d
/sys/class/input/event2/device/id/version:0110

Um die zu erhalten key code identifier, verwenden Sie entweder die Ausgabe von evtestoder schauen Sie sich dieTasten und KnöpfeAbschnitt /usr/include/linux/input-event-codes.hfür eine vollständige Liste. Der Bezeichner ist der Teil, der KEY_in Kleinbuchstaben umgewandelt wurde, z. B. KEY_BACKSPACEwirdRücktaste.

Konfigurieren Sie udev

Schauen Sie sich an /lib/udev/hwdb.d/. Wir erstellen eine Textdatei in/etc/udev/hwdb.d/mit einem Dateinamen, der mit einer Zahl beginnt, die größer ist als die Datei, die unserem Gerätetyp entspricht. Bei einer Tastatur kann dies jede Zahl größer als 60 sein, während sie bei einem Pointing Stick größer als 70 sein sollte. Zum Beispiel 65-keyboard-custom.hwdb. Verwenden Sie Ihren bevorzugten Texteditor, aber denken Sie daran, dass Sie ihn als starten müssen root, z. B.

$ sudo gedit /etc/udev/hwdb.d/65-keyboard-custom.hwdb

Fügen Sie den folgenden Inhalt hinzu

evdev:input:b[bustype]v[vendor]p[product]e[version]*
 KEYBOARD_KEY_[scancode]=[key code identifier]

...Wo

  • [Bustyp], [Hersteller], [Produkt] und [Version] haben genau 4 Zeichen (mit Nullen auffüllen, falls nötig) und Buchstaben müssenGroßbuchstaben
  • [scancode] braucht keine Auffüllung, aber Buchstaben müssenKleinbuchstaben
  • die evdev:...Linie hatkein vorangestelltes Leerzeichen
  • die KEYBOARD_KEY...Linie hatgenau ein vorangehendes Leerzeichen

In meinem Beispiel sieht die Datei folgendermaßen aus:

evdev:input:b0003v046DpC228e0110*
 KEYBOARD_KEY_70039=backspace   # map CapsLock to BackSpace

Die erste Zeile wird Ihrem Gerät zugeordnet. Sie können weitere evdev:Zeilen angeben und mehr als ein Platzhalterzeichen ( ) verwenden, *um weitere Geräte zuzuordnen. Beachten Sie jedoch, dass Scancodes gerätespezifisch sind. Sie können auch mehr als eine Scancode-Zuordnung hinzufügen. Lassen Sie sich /lib/udev/hwdb.d/60-keyboard.hwdbinspirieren. Eine detailliertere und aktuellere Version dieser Datei finden Sie in derOnline-Repository.

Neue Konfiguration anwenden

Kompilieren Sie die neue Konfiguration in die Hardwaredatenbank:

$ sudo systemd-hwdb update

Wenn Sie die Änderungen sofort anwenden möchten, informieren Sie udev:

$ sudo udevadm trigger

Bitte beachten Sie, dass Konfigurationseinstellungen nur bei laufendem System hinzugefügt oder geändert werden können. Wenn Sie eine Konfiguration entfernen (z.B. Scancode-Mapping), müssen Sie einen Neustart durchführen, damit die Änderungen wirksam werden.

Denken Sie daran, auch die zuvor durchgeführte Neuzuordnung (mit /etc/default/keyboard) rückgängig zu machen, da diese weiterhin auf alle Tastaturen angewendet wird.

verwandte Informationen