Ja, es ist mit XKB 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> 1.2.0 haben
Listen Sie zuerst Ihre Geräte auf mit:
xinput list
Sie erhalten etwa Folgendes:
⎡ 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, indem Sie die sed-Zeile durch eine ersetzen, die dem Namen Ihres Geräts entspricht. Ändern Sie dann die Tasten, die Sie neu zuordnen müssen.
Beispiel:Laden Sie xev
und drücken Sie eine Taste, die Sie neu zuordnen möchten. Angenommen, Sie finden den Schlüsselcode 84 heraus. Schlagen Sie 84 in https://gist.github.com/zoqaeski/3880640 nach. Der dortige 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
# This is a name for the file, it could be anything you
# want. For us, we'll name it "custom". This is important
# later.
#
# The KP_* come from /usr/include/X11/keysymdef.h
# Also note the name, "remote" is there in the stanza
# definition.
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
# (1) We list our current definition
# (2) Modify it to have a keyboard mapping using the name
# we used above, in this case it's the "remote" definition
# described in the file named "custom" which we specify in
# this world as "custom(remote)".
# (3) Now we take that as input back into our definition of the
# keyboard. This includes the file we just made, read in last,
# so as to override any prior definitions. Importantly we
# need to include the directory of the place we placed the file
# to be considered when reading things in.
#
# Also notice that we aren't including exactly the
# directory we specified above. In this case, it will be looking
# for a directory structure similar to /usr/share/X11/xkb
#
# What we provided was a "symbols" file. That's why above we put
# the file into a "symbols" directory, which is not being included
# below.
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 sourcen Sie es (Sie können es zu Ihrer .xinitrc hinzufügen). Alles erledigt! Jetzt sollte das Drücken der Tasten die gewünschte Ausgabe erzeugen, nur für das von Ihnen angegebene Gerät.
Bearbeiten :Kürzlich ist mir aufgefallen, dass die neue Konfiguration aus irgendeinem Grund nicht sofort angewendet wird. Sie müssen zuerst eine Taste auf Ihrem anderen drücken Tastatur und testen Sie dann die konfigurierten Tasten auf Ihrer modifizierten Tastatur. Ich weiß nicht, warum das passiert, vielleicht eine Art Cache.
Für alle anderen, die von Google hierher kommen und eine Antwort wünschen, die eher dem entspricht, was der Fragesteller ursprünglich erhofft hatte, kenne ich zwei Möglichkeiten, Ereignisse bei evdev
neu zuzuordnen Ebene, damit die Änderung für alle Anwendungen gilt:
-
udev bietet eine API zum Modifizieren der Hardware-Datenbankeinträge, die die Zuordnungen zwischen Scancodes und Keycodes steuern. Diese ArchiWiki-Seite, die Anweisungen enthält, sagt ausdrücklich, dass es sowohl für X11- als auch für Konsoleneingaben funktioniert.
Das Wesentliche ist, dass Sie einen benutzerdefinierten Eintrag in
/etc/udev/hwdb.d/
erstellen die aus einem Geräteübereinstimmungsmuster und einigen Scancode-zu-Keycode-Neuzuordnungsdefinitionen besteht, führen Sie dannsystemd-hwdb update
aus um die Datenbank neu aufzubauen undudevadm trigger
ohne Neustart anwenden. -
Da Wayland das Tastatur-Subsystem von X11 nicht verwendet und große Wayland-Compositoren wie GNOME Shell und Weston keine UIs implementieren, um die relevanten Aspekte von libinput zu konfigurieren, hat jemand einen Daemon namens evdevremapkeys geschrieben, der das Problem ähnlich wie der G15Daemon-Userspace-Treiber für Logitech löst G15-Gaming-Tastaturen.
(Es schluckt Ereignisse, die es neu zuordnen möchte, sodass nichts anderes, das auf dem Gerät zuhört, sie sehen kann, und gibt dann die korrigierten Ereignisse über
uinput
aus API zum Erstellen von Eingabegeräten auf Kernel-Ebene aus dem Userspace.)