Ich versuche, eine Möglichkeit zu finden, Tastaturtasten mit Nachdruck neu zuzuordnen.
Ich habe versucht, xmodmap und setxkbmap zu verwenden, aber sie funktionieren nicht für eine bestimmte Anwendung. Solche Befehle funktionieren für andere normale Fenster / Anwendungen auf X tho.
Ich denke, die Anwendung liest möglicherweise die Rohdaten der Tastatur und ignoriert die X-Eingabe.
Wie kann man also Schlüssel neu zuordnen, ohne xmodmap und setxkbmap zu verwenden? falls es jemals möglich sein sollte, Software zu verwenden.
Ich habe auch versucht, xkeycaps, xkbcomp, aber nicht loadkeys, wie es auf X ausgeführt wird.
Ich fand hier, dass ich versuchen könnte setkeycodes
, "weil nach der Zuweisung des Kernel - Keycodes die Schaltfläche in xorg funktionieren sollte" , aber ich fand auch, dass "Sie 'Setkeycodes' nicht auf USB - Tastaturen verwenden können" , das ist mein Fall (ich interessiere mich für den Fall (jemand bringt es auf ps2 zum Laufen, da ich glaube, ich könnte einen Adapter verwenden).
Dies schien vielversprechend "Scancodes zu
Schlüsselcodes zuordnen " , aber nach ein paar Tests hat sich nichts geändert, hier sind sie: Ich fand Schlüsselcode "36" ("j" -Taste) bei vt1 mit showkey
Scancode "7e" (Tastatur ".") Bei vt1 mitshowkey --scancodes
$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..
Obs .: hat auch nicht funktioniert mit: KEYBOARD_KEY_7e=j
Einige weitere alternative Wege (von @ vinc17) die Schlüssel zu finden:
evtest /dev/input/by-id/...
oder
input-kbd 3
(die ID - Index bei gefunden setzen ls -l /dev/input/by-id/*
. Von ex event3)
PS .: * Wenn Sie daran interessiert sind, sich selbst zu testen, ist der zugehörige Thread für die Anwendung folgender: http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ The issues I sind gleich: einige Schlüssel (KP_Decimal, DownArrow, UpArrow, RightArrow) werden ignoriert und dort als alle mit dem gleichen Wert "0x00" betrachtet
quelle
/etc/udev/hwdb.bin
nicht sein/lib/udev/hwdb.bin
. Obwohl diese Datei korrekt aktualisiert wurde, funktioniert dies auch nach einem Neustart nicht für mich. Vielleicht fehlt etwas in der Dokumentation. Informationenshowkey --scancodes
gibt es nicht die Scancodes, die udev erwartet (die Werte sind unterschiedlich); Dasinput-kbd
Dienstprogramm gibt die richtigen Scancodes an.evtest
Dienstprogramm sollte Ihnen auch die richtigen Scancodes anzeigen: Nach dem Eingeben eines Schlüssels sollten Sie 2 Zeilen erhalten, und die erste sollte mit etwas aus dem Formular endencode 4 (MSC_SCAN), value xxx
, in demxxx
sich der Scancode befindet. Aber der Treiber für meine Tastatur ist fehlerhaft, und ich verstehe dieseMSC_SCAN
Zeile nicht für einige Tasten, die ich neu zuordnen wollte. Deshalb habe ich verwendetinput-kbd
, die alle Scancodes für das ausgewählte Gerät auflistet.Antworten:
Suchen Sie zuerst den Scancode des Schlüssels, der neu zugeordnet werden soll, z
evtest
. B. mit dem Dienstprogramm. Eine Zeile wie die folgende (mitMSC_SCAN
darin) sollte ausgegeben werden:gefolgt von einem zweiten mit dem aktuellen Schlüsselcode. Wenn keine
MSC_SCAN
Zeile ausgegeben wird, liegt dies an einem Kerneltreiberfehler, aber der Scancode kann weiterhin mit deminput-kbd
Dienstprogramm gefunden werden.evtest
sollte den Schlüsselcode angegeben haben, damit es einfach sein sollte, die entsprechende Zeile in derinput-kbd
Ausgabe zu finden (zgrep
. B. durch Verwenden von ).Nachdem Sie die Scancodes der neu zuzuordnenden Tasten ermittelt haben, erstellen Sie eine Datei, die beispielsweise
/etc/udev/hwdb.d/98-custom-keyboard.hwdb
die Neuzuordnungen enthält. Der Anfang der Datei/lib/udev/hwdb.d/60-keyboard.hwdb
enthält einige Informationen. In meinem Fall (was funktioniert) habe ich:(Vor udev 220 musste ich
keyboard:usb:v05ACp0221*
für die erste Zeile verwenden.)Die
evdev:
Zeichenfolge muss am Anfang der Zeile stehen. Beachten Sie, dass die Buchstaben in der Hersteller- und Produkt-ID Großbuchstaben sein sollten. JedeKEYBOARD_KEY_
Einstellungen sollten genau ein Leerzeichen vor (Anmerkung: eine Zeile ohne Leerzeichen wird eine Fehlermeldung, und eine Linie mit zwei Räumen wurden lautlos mit alten udev Versionen ignoriert).KEYBOARD_KEY_
gefolgt von dem Scancode in hexadezimaler Schreibweise (wie beidesevtest
undinput-kbd
give). Gültige Werte könnten entweder aus derevtest
Ausgabe oder derinput-kbd
Ausgabe oder sogar aus der/usr/include/linux/input.h
Datei erhalten werden:KEY_102ND
würde beispielsweise102nd
(durch EntfernenKEY_
und Konvertieren in Kleinbuchstaben) geben, was ich oben verwendet habe.Nachdem die Datei gespeichert wurde, geben Sie Folgendes ein:
um die Datenbank (neu) zu erstellen
/etc/udev/hwdb.bin
(Sie können den Zeitstempel überprüfen). Dann,berücksichtigt die neuen Einstellungen. Sie können mit überprüfen
evtest
.Im Jahr 2014 enthielt das veröffentlichte udev unvollständige / fehlerhafte Informationen.
/lib/udev/hwdb.d/60-keyboard.hwdb
Sie können sich jedoch die neueste Entwicklungsversion der Datei und / oder meinen Fehlerbericht und die Diskussion zu Dokumentations- und Abstandsproblemen ansehen.Wenn dies nicht funktioniert, liegt das Problem möglicherweise daran, dass Sie vorübergehend die Protokollebene von
udevd
mitudevadm control
erhöhen (Details finden Sie auf der Manpage udevadm (8)).Bei alten
udev
Versionen wie 204 sollte diese Methode weiterhin funktionieren.quelle
/lib/udev/hwdb.bin
mitbless
der ich gesucht habe , aktualisiert undKEYBOARD_KEY_70085
am Ende angezeigt. Ich denke Ubuntu 14.04 ist so konfiguriert (geschützt?). Ich habe es versuchtudevadm control --log-priority=debug
. Basierend auflsusb
(045e: 0750) wird meine Tastatur wiekeyboard:usb:v045ep0750*
, aber ich habe es auch mit versuchtkeyboard:usb:v*p*
. Ich vermute, dass dies/etc/udev/hwdb.bin
aktualisiert werden sollte, aber nicht einmal existiert.udevadm hwdb --usr --update
, obwohl ich es nicht war.udevadm hwdb --update
ich kopiert/lib/udev/hwdb.bin
zu/etc/udev/hwdb.bin
und liefstrace udevadm trigger --sysname-match="event*"
und die Dateihwdb.bin
scheint haben , indem sie es nicht gelesen worden ist (wenn es wie dies funktioniert , ist).udevadm trigger ...
, sehen Sie sich meinen Test hier an . Beachten Sie, dass Sie vor dem Ausführenudevadm trigger ...
sicherstellen müssen, dass die Änderungszeit der Datei aktualisiert wurde. Andernfalls wird die Zugriffszeit beim Lesen der Datei nicht aktualisiert.udevadm --version
: 215 (und udev-Paketversion: 215-7). Dankudevadm trigger ...
sollten Sie nicht neu starten müssen (es sei denn, Sie möchten Einstellungen entfernen, AFAIK). Möglicherweise möchten Sie jedoch einen Neustart durchführen, um festzustellen, ob ein Effekt vorliegt.