Como remapear chaves no Linux apenas para um teclado específico

13

Comprei recentemente um teclado Unicomp que vem com as teclas right-alt e Windows trocadas. O teclado identifica assim no lsusb:

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

Existe uma maneira de fazer com que o kernel (ou seja, não baseado no xmodmap) troque as teclas right-alt e windows para que cada aplicativo as veja nos locais trocados, mesmo que recebam entrada bruta de teclado (troca de coisas com xmodmap não faça isso)? Existe uma maneira de ter isso apenas para este teclado?

    
por FUZxxl 30.05.2014 / 11:57

1 resposta

18

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.

    
por 25.01.2015 / 00:55