So ordnen Sie Tasten unter Linux nur für eine bestimmte Tastatur neu zu

15

Ich habe kürzlich eine Unicomp-Tastatur gekauft, die vertauschte Alt- und Windows-Tasten enthält. Die Tastatur identifiziert sich wie folgt auf lsusb:

Bus 003 Device 002: ID 17f6:0822 Unicomp, Inc 

Gibt es eine Möglichkeit, den Kernel (dh nicht xmodmap-basiert) die rechte Alt- und die Windows-Taste vertauschen zu lassen, damit jede Anwendung sie an den vertauschten Stellen sieht, auch wenn sie unformatierte Tastatureingaben erhalten? ? Gibt es eine Möglichkeit, das nur für diese eine Tastatur zu haben?

FUZxxl
quelle
Ich vermute, Sie könnten dies mit udev tun, indem Sie die Seriennummer der Tastatur abgleichen und dann ein Skript aufrufen, das die Neuzuordnung vornimmt. Sie benötigen wahrscheinlich ein ähnliches Skript, das beim Trennen aufgerufen wird, damit das Gerät es zurücksetzt.
jam
1
@jam Würde dies alle angeschlossenen Tastaturen neu zuordnen? Ich kann mir nicht vorstellen, dass Linux so unflexibel ist, dass es nur eine Zuordnungstabelle für alle angeschlossenen (USB-) Tastaturen verwalten kann.
FUZxxl
@jam Außerdem würdest du mir wirklich helfen, wenn du beschreiben könntest, wie man das eigentliche Tauschen macht. Ich habe es nicht geschafft, irgendetwas Nützliches zu finden, nur xmodmap-Zeug (das ich nicht verwenden möchte).
FUZxxl
Wenn Sie xmodmap nicht verwenden möchten, scheint das, wonach Sie fragen, meines Wissens zu spezifisch zu sein, um Ihnen zu helfen. Die von mir vorgeschlagene Methode verwendet xmodmap, um die Schlüsselcodes für diese Schlüssel für alle Geräte zu tauschen, für die Dauer, in der Ihre spezielle Tastatur angeschlossen ist, und sie dann wieder einzulegen. Erwarten Sie, mehrere Tastaturen gleichzeitig zu verwenden?
jam
@jam Wenn ich Xmodmap verwende, sehen X-Programme immer noch die falschen Schlüsselcodes, da der X-Server auch nicht übersetzte Schlüsselcodes an den Client sendet. Dies gilt zum Beispiel für Videospiele. Es soll eine Lösung im Kernel geben, die mein Leben mit Anwendungen, die Scan-Codes auslesen, nicht komplizierter macht.
FUZxxl

Antworten:

20

Ja, mit XKB ist das möglich. Im Gegensatz zu xmodmap kann XKB Ihre Schlüssel für einzelne Geräte neu zuordnen.

Hinweis: Stellen Sie sicher, dass Sie xkbcomp & gt; 1.2.0

Listen Sie zuerst Ihre Geräte mit:

xinput list

Sie werden so etwas bekommen:

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen stylus               id=11   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger touch             id=12   [slave  pointer  (2)]
⎜   ↳ Logitech USB-PS/2 Optical Mouse           id=13   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Pen eraser               id=14   [slave  pointer  (2)]
⎜   ↳ Wacom Bamboo Pen Finger pad               id=15   [slave  pointer  (2)]
⎜   ↳ GASIA USB KB V11                          id=17   [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)]
    ↳ G19 Gaming Keyboard                       id=8    [slave  keyboard (3)]
    ↳ G19 Gaming Keyboard                       id=9    [slave  keyboard (3)]
    ↳ Logitech G19 Gaming Keyboard              id=10   [slave  keyboard (3)]
    ↳ GASIA USB KB V11                          id=16   [slave  keyboard (3)]

Identifizieren Sie die Zeichenfolge Ihres Geräts und bearbeiten Sie das folgende Shell-Skript. Ändern Sie dabei die Sed-Linie durch eine, die dem Namen Ihres Geräts entspricht. Ändern Sie dann die Tasten, die Sie neu zuordnen müssen.

Beispiel: Laden xev und drücken Sie eine Taste, die Sie neu zuordnen möchten. Angenommen, Sie finden heraus, dass es sich um den Schlüsselcode 84 handelt https://gist.github.com/zoqaeski/3880640 . Der Schlüsselname ist <KP5>. Suchen Sie dann den Schlüssel, durch den er ersetzt werden soll (im selben Link, weiter unten ) und kopieren Sie, was in den Klammern steht. Wiederholen Sie den Vorgang für alle gewünschten Schlüssel.

remote_id=$(
    xinput list |
    sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*/\1/p'
)
[ "$remote_id" ] || exit

# remap the following keys, only for my custom vintage atari joystick connected
# through an old USB keyboard:
#
# keypad 5 -> keypad 6
# . -> keypad 2
# [ -> keypad 8
# left shift -> left control

mkdir -p /tmp/xkb/symbols
cat >/tmp/xkb/symbols/custom <<\EOF
xkb_symbols "remote" {
    key <KP5>  { [ KP_Right, KP_6, U2192, U21D2 ]       };
    key <I129> { [ KP_Down, KP_2, U2193, U21D3 ]       };
    key <AD12> { [ KP_Up, KP_8, U2191, U21D1 ]  };
    key <LFSH> { [ Control_L ]        };
};
EOF

setxkbmap -device $remote_id -print | sed 's/\(xkb_symbols.*\)"/\1+custom(remote)"/' | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null

Dann geben Sie es als Quelle ein (Sie können es zu Ihrer .xinitrc-Datei hinzufügen). Alles erledigt! Das Drücken der Tasten sollte nun die gewünschte Ausgabe nur für das von Ihnen angegebene Gerät erzeugen.

Bearbeiten : Vor kurzem habe ich festgestellt, dass die neue Konfiguration aus irgendeinem Grund nicht sofort angewendet wird. Sie müssen zuerst eine Taste auf Ihrem drücken andere Tastatur, und testen Sie dann die konfigurierten Tasten auf Ihrer geänderten Tastatur. Ich weiß nicht, warum das passiert, vielleicht eine Art Cache.

Watcom
quelle
Lassen Sie mich dies am Montag versuchen, wenn ich wieder an den Computer komme, auf dem ich diese Tastatur verwende.
FUZxxl
Ich habe das einfach ausprobiert und es hatte überhaupt keine Wirkung. Kann ich Ihnen die von mir erstellten Dateien zusenden, damit Sie sie sich ansehen können?
FUZxxl
1
ein) sed -n 's/.*G19 Gaming Keyboard.*id=\([0-9]*\).*keyboard.*/\1/p' c) Ja, Sie sollten es auf jeden Fall testen, bevor Sie es ersetzen $remote_id mit der ID-Nummer. Beachten Sie, dass es zwei Verweise auf gibt $remote_id dort hast du beide geändert?
Watcom
1
Oh, und beim Testen der fest codierten $remote_idStellen Sie sicher, dass Sie die Zeile auskommentieren [ "$remote_id" ] || exit Wenn Sie es nicht bereits anders gemacht haben, wird es nur aussteigen.
Watcom
1
@ stats-hb $9 wird nicht funktionieren, meintest du 9?
Watcom
1

Für alle anderen, die von Google hierher kommen und eine Antwort wünschen, die mehr mit dem übereinstimmt, was der Fragesteller ursprünglich erhofft hatte, sind mir zwei Möglichkeiten bekannt, Ereignisse auf der Website neu abzubilden evdev Ebene, so dass die Änderung für alle Anwendungen gilt:

  1. udev bietet eine API zum Ändern der Hardware-Datenbankeinträge, die die Zuordnungen zwischen Scancodes und Keycodes steuern. Diese ArchiWiki-Seite In dieser Anleitung wird ausdrücklich darauf hingewiesen, dass sie sowohl für X11- als auch für Konsoleneingaben funktioniert.

    Das Wesentliche ist, dass Sie einen benutzerdefinierten Eintrag in erstellen /etc/udev/hwdb.d/ Das Programm besteht aus einem Geräteübereinstimmungsmuster und einigen Scancode-to-Keycode-Remapping-Definitionen und wird dann ausgeführt systemd-hwdb update die Datenbank neu zu erstellen und udevadm trigger Wenden Sie es ohne Neustart an.

  2. Da Wayland das Tastatur-Subsystem von X11 nicht verwendet und wichtige Wayland-Compositors wie GNOME Shell und Weston keine Benutzeroberflächen implementieren, um die relevanten Aspekte von libinput zu konfigurieren, hat jemand einen Daemon namens geschrieben evdevremapkeys Hierdurch wird das Problem ähnlich wie beim G15Daemon-Userspace-Treiber für Logitech G15-Gaming-Tastaturen behoben.

    (Es verschluckt Ereignisse, die es neu zuordnen möchte, damit keine anderen Personen, die auf dem Gerät zuhören, sie sehen können, und sendet dann die korrigierten Ereignisse über die uinput API zum Erstellen von Eingabegeräten auf Kernel-Ebene aus dem Benutzerbereich.)

ssokolow
quelle