Como obter o trabalho do slider MS Natural Ergonomic 4000 no Linux Mint?

8

Estou tentando fazer com que o slider no teclado MS funcione, mas ainda não funciona.

O que eu já tentei:

em /etc/udev/hwdb.d/61-keyboard-local.hwdb

keyboard:usb:v045Ep00DB*
  KEYBOARD_KEY_c022d=up
  KEYBOARD_KEY_c022e=down

e

evdev:input:b0003v045Ep00DB*
 KEYBOARD_KEY_c022d=up
 KEYBOARD_KEY_c022e=down

seguindo

sudo udevadm hwdb --update
sudo udevadm control --reload

e a reinicialização não fez nada.

Em /lib/udev/keymaps/microsoft-ergonomic-keyboard

0xC022D 0xC1 # Zoom Up which we wish to be Scroll up
0xC022E 0xC2 # Zoom Down which we wish to be Scroll down

e a reinicialização não fez nada.

Em /etc/X11/xorg.conf.d/10-keyboard.conf

Section "InputDevice"
    Identifier  "Keyboard1"
    Driver      "evdev"
    Option      "Device" "/dev/input/event9"
    Option      "event_key_remap" "418=185 419=186 423=101 425=156 421=157"
EndSection

e a reinicialização não fez nada.

O que eu tenho é

> sudo evtest /dev/input/event9             
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x45e product 0xdb version 0x111
Input device name: "Microsoft Natural® Ergonomic Keyboard 4000"
...
Testing ... (interrupt to exit)
Event: time 1478692111.766327, type 4 (EV_MSC), code 4 (MSC_SCAN), value c022d
Event: time 1478692111.766327, type 1 (EV_KEY), code 418 (KEY_ZOOMIN), value 1
Event: time 1478692111.766327, -------------- SYN_REPORT ------------
Event: time 1478692111.886318, type 4 (EV_MSC), code 4 (MSC_SCAN), value c022d
Event: time 1478692111.886318, type 1 (EV_KEY), code 418 (KEY_ZOOMIN), value 0
Event: time 1478692111.886318, -------------- SYN_REPORT ------------
Event: time 1478692112.678287, type 4 (EV_MSC), code 4 (MSC_SCAN), value c022e
Event: time 1478692112.678287, type 1 (EV_KEY), code 419 (KEY_ZOOMOUT), value 1
Event: time 1478692112.678287, -------------- SYN_REPORT ------------
Event: time 1478692112.798370, type 4 (EV_MSC), code 4 (MSC_SCAN), value c022e
Event: time 1478692112.798370, type 1 (EV_KEY), code 419 (KEY_ZOOMOUT), value 0
Event: time 1478692112.798370, -------------- SYN_REPORT ------------

Assim, o controle deslizante funciona, evtest pode ver eventos, mas xev não mostra nada. Há mais alguma coisa que eu possa tentar fazer em 2016?

Estou usando o Linux Mint 18 Sarah com o kernel 4.4.0-34-genérico.

    
por user3033648 09.11.2016 / 12:53

1 resposta

5

Histórico: o teclado é um dispositivo USB HID , e o kernel reconhece corretamente os eventos USB da HID para as teclas deslizantes e os converte em códigos de tecla ( KEY_ZOOMIN e KEY_ZOOMOUT ). Então, a esse respeito, já está "trabalhando": você pode receber os eventos e fazer algo útil com isso.

No entanto, as traduções para teclado X suportam apenas códigos de teclas até 255 (consulte esta resposta , é uma limitação do protocolo X). Então você não pode convertê-los em keyyms X. (E talvez não seja isso o que você quer, porque o zoom geralmente é feito pelos eventos de botão do mouse nos aplicativos, ou seja, os botões 4 e 5. Assim, mesmo que você o convertesse em keyfitters, eles não aumentariam ou diminuiriam). / p>

Mas a partir do que você tentou fazer, parece que você deseja remapear para as teclas acima e para baixo , idênticas às teclas de seta para cima e para baixo que já estão disponível como outras teclas no teclado.

  1. Como mencionado no answer já vinculado, para habilitar o X a remapear códigos de teclas maiores que 255, alguém criou uma variante corrigida do driver X evdev . Então você precisa compilar e instalar esta variante corrigida, e então a opção event_key_remap será reconhecida. Ele não será reconhecido pelo driver padrão evdev , por isso não é surpresa que sua entrada xorg.conf não tenha feito nada.

    Esse é provavelmente o método mais limpo.

  2. No processo de assumir todo o Linux, systemd aparentemente também possui seu próprio banco de dados de hardware e pode sobrescrever mapeamentos de teclado. Eu não tenho certeza em qual nível do kernel isso está funcionando, então eu não sei se isso ajudará, e o formato para o "banco de dados de hardware" não parece estar documentado. Então eu não posso te ajudar muito a esse respeito.

    No entanto, o formato de correspondência parece ter mudado , então talvez você tenha mais sorte se incluir o número do barramento, conforme descrito.

    Editar : Lendo o código-fonte do kernel, descobri que cada dispositivo de entrada tem seu próprio scancode (dependente do hardware, até 8 bytes, embora em muitos lugares apenas 1/2/4 bytes no kernel são transferidos) para mapeamentos de conversão de código de chamada (o que você vê com evtest ). Valores de código grandes podem ser definidos e obter com EVIOCGKEYCODE_V2 e EVIOCSKEYCODE_V2 ioctls no dispositivo. Uma ferramenta geral semelhante a xmodmap ou loadkeys/dumpkeys parece não existir, embora algumas ferramentas relacionadas ao receptor de IR aparentemente usem esses ioctls. Se é assim que funciona o banco de dados systemd , uma alternativa mais flexível seria usar essa ferramenta em uma regra udev (também mais simples para testes). Eu escrevi um programa C rápido para descarregar o mapeamento, talvez eu devesse colocá-lo no github ...

  3. Em princípio, você já pode processar os eventos com seus próprios programas ou scripts e fazer o que quiser. Por exemplo, execute evtest , analise a saída com um script bash e invoque xdotool com o pressionamento de botão de 4 ou 5 para obter o mesmo efeito que uma roda de rolagem do mouse para os botões do controle deslizante. Etc., pp. (Houve uma questão de troca de pilha com um script rudimentar para um propósito semelhante, mas não posso encontrá-lo agora. Se necessário, posso pesquisar um pouco mais).

por 07.02.2017 / 13:54