Sim, é possível usar o XKB. Ao contrário do xmodmap, o XKB pode remapear suas chaves para dispositivos individuais.
Observação: verifique se você tem xkbcomp > 1.2.0
Primeiro, liste seus dispositivos com:
xinput list
Você terá algo assim:
⎡ 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)]
Identifique a string do seu dispositivo e edite o seguinte shell script, alterando a linha sed com uma que se encaixa no nome do seu dispositivo. Em seguida, altere as chaves que você precisa remapear.
Exemplo: Carregue xev
e pressione uma tecla que você deseja remapear. Suponha que você descubra que é o código-chave 84. Pesquisa 84 no link . O nome da chave é <KP5>
. Em seguida, pesquise a chave que deseja que seja substituída por (no mesmo link, mais abaixo ) e copie o que está dentro dos parênteses. Repita o processo para todas as teclas desejadas.
remote_id=$(
xinput list |
sed -n 's/.*GASIA.*id=\([0-9]*\).*keyboard.*//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.*\)"/+custom(remote)"/' | xkbcomp -I/tmp/xkb -i $remote_id -synch - $DISPLAY 2>/dev/null
Em seguida, fonte-lo (você pode adicioná-lo ao seu .xinitrc). Tudo feito! Agora, pressionar as teclas deve gerar a saída desejada, somente para o dispositivo que você especificou.
Editar : Recentemente, notei que, por algum motivo, a nova configuração não é aplicada imediatamente. Você deve primeiro pressionar uma tecla no seu teclado outro e testar as teclas configuradas no teclado modificado. Eu não sei porque isso acontece, talvez algum tipo de cache.