Remapear a tecla Windows no MS Sculpt Comfort Mouse

0

Eu gostaria de remapear o "botão do Windows" no MS Sculpt Comfort Mouse para outro botão (por exemplo, o botão "Voltar") na minha máquina Linux (Linux Mint 18.2 "Sonya").

De acordo com xinput list , o mouse é reconhecido como um dispositivo de ponteiro (id = 12).

⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Microsoft Sculpt Comfort Mouse            id=12   [slave  pointer  (2)]
⎜   ↳ FocalTechPS/2 FocalTech FocalTech Touchpad    id=15   [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)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Sleep Button                              id=8    [slave  keyboard (3)]
    ↳ Chicony USB Keyboard                      id=9    [slave  keyboard (3)]
    ↳ Chicony USB Keyboard                      id=10   [slave  keyboard (3)]
    ↳ USB2.0 UVC HD Webcam                      id=11   [slave  keyboard (3)]
    ↳ Asus WMI hotkeys                          id=13   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=14   [slave  keyboard (3)]

De acordo com xinput test 12 , a tecla Super_L (keycode 133) é gerada pelo mouse quando o "botão Windows" é pressionado no mouse.

key press   133 
key release 133 

Agora, preciso remapear a chave desse dispositivo específico para outra chave. Eu faria isso usando a ferramenta setxkbmap (descrita em Como remapear chaves no Linux apenas para um teclado específico ).

Meu script é o seguinte:

remote_id=$(
    xinput list | sed -n 's/.*Microsoft Sculpt Comfort Mouse.*id=\([0-9]*\).*//p'
)
[ "$remote_id" ] || exit

# remap Windows button on MS Sculpt Mouse to Back button

mkdir -p /tmp/xkb/symbols
cat >/tmp/xkb/symbols/custom <<\EOF
xkb_symbols "remote" {
    key <LWIN> { [ XF86Back ]        };
};
EOF

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

Eu também tentei uma abordagem semelhante descrita em Remapear / alterar seu secundário / teclas do teclado usb . Tentei trocar códigos por exemplo. para <LWIN> e <VOL+> . Mas sem sucesso, a tecla Windows do mouse ainda é interpretada como tecla do Windows.

Então eu tentei remapear a tecla Windows (trocada com) no meu teclado USB (id = 9) usando a segunda abordagem (pure xkbcomp ) e funcionou, MAS também mudou o comportamento do botão do mouse da mesma maneira ( independentemente de como foi o botão mapeado para o mouse). O estranho é que, quando pressiono o botão do Windows no teclado interno do laptop (não remapeado) e, em seguida, no mouse, ele é interpretado como botão do Windows. Quando pressiono o botão do Windows no meu teclado USB (remapeado em VOL +) e depois no mouse, ele é interpretado como VOL +. Pode estar relacionado a Bug 91571 - o xkb definido via xkbcomp parece não se aplicar a -i (ou não se aplica se usado no dispositivo geral) .

Infelizmente, não sou capaz de remapear o botão apenas para o dispositivo em particular.

1) Pode ser que a ferramenta xkbcomp funcione corretamente apenas com dispositivos 'slave keyboard'? (Não com 'ponteiro escravo')

2) Existe uma maneira de tratar este mouse como 'teclado escravo'?

3) Ou existe outra maneira de remapear o 'botão do Windows' somente para este dispositivo específico (e não para o teclado USB principal)?

    
por Pavel Kriz 06.08.2017 / 20:39

1 resposta

1

Respondendo minha própria pergunta # 3: o udev pode fazer isso. Meu arquivo /etc/udev/hwdb.d/10-ms-sculpt-back.hwdb :

# remap MS Sculpt Comfort Mouse (Bluetooth) Windows key to Back key
evdev:input:b0005v045Ep07A2*
 KEYBOARD_KEY_700e3=back

Graças a Mapear códigos de códigos para e

Como encontrar o cabeçalho .hwdb de um dispositivo de entrada geral?     
por 06.08.2017 / 21:55