Sì, è possibile utilizzare XKB. A differenza di xmodmap, XKB può rimappare le tue chiavi per singoli dispositivi.
Nota:assicurati di avere xkbcomp> 1.2.0
Per prima cosa elenca i tuoi dispositivi con:
xinput list
Otterrai qualcosa del genere:
⎡ 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)]
Identifica la stringa del tuo dispositivo e modifica il seguente script di shell, cambiando la riga sed con una che si adatti al nome del tuo dispositivo. Quindi cambia le chiavi che devi rimappare.
Esempio:carica xev
e premi un tasto che vuoi rimappare. Supponiamo di scoprire che è il codice chiave 84. Cerca 84 in https://gist.github.com/zoqaeski/3880640. Il nome della chiave è <KP5>
. Quindi cerca la chiave con cui vuoi sostituirla (nello stesso link, più in basso) e copia ciò che c'è tra parentesi. Ripeti il processo per tutte le chiavi che desideri.
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
Quindi procuratene (puoi aggiungerlo al tuo .xinitrc). Tutto fatto! Ora la pressione dei tasti dovrebbe generare l'output desiderato, solo per il dispositivo specificato.
Modifica :Di recente, ho notato che, per qualche motivo, la nuova configurazione non viene applicata immediatamente. Devi prima premere un tasto sul tuo altro tastiera, quindi testare i tasti configurati sulla tastiera modificata. Non so perché questo accada, forse una sorta di cache.
Per chiunque altro venga qui da Google e desideri una risposta più in linea con ciò che l'interrogante sperava inizialmente, sono a conoscenza di due modi per rimappare gli eventi al evdev
level in modo che la modifica si applichi a tutte le applicazioni:
-
udev fornisce un'API per modificare le voci del database hardware che controllano le mappature tra scancode e keycode. Questa pagina ArchiWiki, che contiene le istruzioni, dice esplicitamente che funzionerà sia per X11 che per input da console.
L'essenza è che crei una voce personalizzata in
/etc/udev/hwdb.d/
che consiste in un modello di corrispondenza del dispositivo e alcune definizioni di rimappatura da scancode a keycode, quindi eseguisystemd-hwdb update
per ricostruire il database eudevadm trigger
applicalo senza riavviare. -
Dato che Wayland non utilizza il sottosistema di tastiera di X11 e i principali compositori di Wayland come GNOME Shell e Weston non implementano le interfacce utente per configurare gli aspetti rilevanti di libinput, qualcuno ha scritto un demone chiamato evdevremapkeys che risolve il problema in modo simile al driver dello spazio utente G15Daemon per Logitech Tastiere da gioco G15.
(Ingoia gli eventi che intende rimappare, quindi nient'altro in ascolto sul dispositivo può vederli, quindi emette gli eventi corretti tramite
uinput
API per la creazione di dispositivi di input a livello di kernel dallo spazio utente.)