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, xev
herauszufinden, 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 scancode
ist ein gerätespezifischer Code, der an eine bestimmte Taste gebunden ist und sich zwischen verschiedenen Anbietern/Produkten unterscheiden kann. keycode
und keysym
werden an Anwendungen weitergegeben. Das keycode
dient als Abstraktionsebene, da es geräte- und gebietsunabhängig ist. Dasselbe keycode
kann 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 scancode
Funktion Ihrer Feststelltaste der keycode
Funktion der Rücktaste zuzuordnen. Anwendungen sehen dann dasselbe, keycode
unabhängig keysym
davon, 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
-> keycode
Zuordnung
Sammeln Sie die erforderlichen Informationen
Zuerst müssen Sie die bustype
, vendor
, product
und version
Ihres Eingabegeräts (Tastatur) sowie die der scancode
Taste bestimmen, die Sie neu zuordnen möchten, und die, der key code identifier
Sie 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 scancode
ist70039.
Führen Sie nun den folgenden Befehl aus, wobei eventX
sich 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 evtest
oder schauen Sie sich dieTasten und KnöpfeAbschnitt /usr/include/linux/input-event-codes.h
für eine vollständige Liste. Der Bezeichner ist der Teil, der KEY_
in Kleinbuchstaben umgewandelt wurde, z. B. KEY_BACKSPACE
wirdRü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.hwdb
inspirieren. 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.