Tastatur fest zugeordnete Tasten?

19

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

Wassermann Power
quelle
Die aktualisierte Datei sollte es /etc/udev/hwdb.binnicht 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. Informationen
vinc17
@vinc17 das ist echt interessant, sobald ich kann werde ich es nochmal versuchen, ich denke wir müssen diese einstellungsdatei finden und versuchen es nachzuahmen, thx!
Aquarius Power
1
Mein Problem war die Tatsache, dass die KEYBOARD_KEY_-Zeilen mit 2 Leerzeichen statt nur einem Leerzeichen begannen (dies wurde nicht dokumentiert und ich bekam keine Fehlermeldungen!). Ich weiß es nicht für dich, aber mit meiner USB-Tastatur showkey --scancodesgibt es nicht die Scancodes, die udev erwartet (die Werte sind unterschiedlich); Das input-kbdDienstprogramm gibt die richtigen Scancodes an.
Vinc17
1
Das evtestDienstprogramm 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 enden code 4 (MSC_SCAN), value xxx, in dem xxxsich der Scancode befindet. Aber der Treiber für meine Tastatur ist fehlerhaft, und ich verstehe diese MSC_SCANZeile nicht für einige Tasten, die ich neu zuordnen wollte. Deshalb habe ich verwendet input-kbd, die alle Scancodes für das ausgewählte Gerät auflistet.
Vinc17
1
Ich habe detaillierte Informationen in einer Antwort gepostet. Jetzt bin ich mir nicht sicher, ob 36 oder 7002c als Wert funktioniert. Ich denke, dass Sie die Schlüsselcode-ID benötigen. Siehe meine Antwort.
Vinc17

Antworten:

17

Suchen Sie zuerst den Scancode des Schlüssels, der neu zugeordnet werden soll, z evtest. B. mit dem Dienstprogramm. Eine Zeile wie die folgende (mit MSC_SCANdarin) sollte ausgegeben werden:

Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068

gefolgt von einem zweiten mit dem aktuellen Schlüsselcode. Wenn keine MSC_SCANZeile ausgegeben wird, liegt dies an einem Kerneltreiberfehler, aber der Scancode kann weiterhin mit dem input-kbdDienstprogramm gefunden werden. evtestsollte den Schlüsselcode angegeben haben, damit es einfach sein sollte, die entsprechende Zeile in der input-kbdAusgabe zu finden (z grep. 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.hwdbdie Neuzuordnungen enthält. Der Anfang der Datei /lib/udev/hwdb.d/60-keyboard.hwdbenthält einige Informationen. In meinem Fall (was funktioniert) habe ich:

evdev:input:b0003v05ACp0221*
 KEYBOARD_KEY_70035=102nd       # Left to z: backslash bar
 KEYBOARD_KEY_70064=grave       # Left to 1: grave notsign
 KEYBOARD_KEY_70068=insert      # F13: Insert

(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. Jede KEYBOARD_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 beides evtestund input-kbdgive). Gültige Werte könnten entweder aus der evtestAusgabe oder der input-kbdAusgabe oder sogar aus der /usr/include/linux/input.hDatei erhalten werden: KEY_102NDwürde beispielsweise 102nd(durch Entfernen KEY_und Konvertieren in Kleinbuchstaben) geben, was ich oben verwendet habe.

Nachdem die Datei gespeichert wurde, geben Sie Folgendes ein:

udevadm hwdb --update

um die Datenbank (neu) zu erstellen /etc/udev/hwdb.bin(Sie können den Zeitstempel überprüfen). Dann,

udevadm trigger --sysname-match="event*"

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.hwdbSie 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 udevdmit udevadm controlerhöhen (Details finden Sie auf der Manpage udevadm (8)).

Bei alten udevVersionen wie 204 sollte diese Methode weiterhin funktionieren.

vinc17
quelle
Wenn ich die udevadm-Befehle ausführe, wird die Datei, /lib/udev/hwdb.binmit blessder ich gesucht habe , aktualisiert und KEYBOARD_KEY_70085am Ende angezeigt. Ich denke Ubuntu 14.04 ist so konfiguriert (geschützt?). Ich habe es versucht udevadm control --log-priority=debug. Basierend auf lsusb(045e: 0750) wird meine Tastatur wie keyboard:usb:v045ep0750*, aber ich habe es auch mit versucht keyboard:usb:v*p*. Ich vermute, dass dies /etc/udev/hwdb.binaktualisiert werden sollte, aber nicht einmal existiert.
Aquarius Power
Wie ich hier las , könnte es sein, dass ich diesen Befehl benutzte udevadm hwdb --usr --update, obwohl ich es nicht war.
Aquarius Power
Nachdem udevadm hwdb --updateich kopiert /lib/udev/hwdb.binzu /etc/udev/hwdb.binund lief strace udevadm trigger --sysname-match="event*"und die Datei hwdb.binscheint haben , indem sie es nicht gelesen worden ist (wenn es wie dies funktioniert , ist).
Aquarius Power
1
@AquariusPower Ja, möglicherweise ist ein Ubuntu-spezifischer Fehler aufgetreten (ich verwende Debian / unstable). Um zu sehen, ob die Datenbank dabei gelesen wird udevadm trigger ..., sehen Sie sich meinen Test hier an . Beachten Sie, dass Sie vor dem Ausführen udevadm trigger ...sicherstellen müssen, dass die Änderungszeit der Datei aktualisiert wurde. Andernfalls wird die Zugriffszeit beim Lesen der Datei nicht aktualisiert.
Vinc17,
1
@AquariusPower udevadm --version: 215 (und udev-Paketversion: 215-7). Dank udevadm 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.
Vinc17,