Desativando/remapeando botões DPI do mouse Logitech G400

Desativando/remapeando botões DPI do mouse Logitech G400

Eu tinha o mouse Logitech MX-518, mas ele estava apresentando problemas de capacidade de resposta, o que me fez ligar para o suporte para substituí-lo. Em vez de outros 518, eles me enviaram umRato Logitech G400porque o 518 foi descontinuado. Isso causa problemas porque, embora o MX518 fosse compatível comlomoco, o mouse G400 não é compatível. Executando $ lomoco -sshows 001.003: 046d:c245 Unsupported Logitech device: Unknown.

O que eu gostaria de fazer é bloquear o DPI do meu mouse em um único valor e remapear os botões DPI+ e DPI- PgUpno PgDnteclado.

Como eu conseguiria isso?

Logitech G400

Os botões são, em ordem:

  1. Botão 1: Clique esquerdo
  2. Botão 2: Clique com o botão do meio
  3. Botão 3: Clique com o botão direito
  4. Botão 4: Roda do mouse para cima
  5. Botão 5: Roda do mouse para baixo
  6. Botão 6: Nenhum
  7. Botão 7: Nenhum
  8. Botão 8: Botão de polegar nº 1
  9. Botão 9: Botão de polegar nº 2
  10. Botão 10: Botão Alternador de Tarefas
  11. Botão 11: Nenhum
  12. Botão 12: Nenhum

No mouse anterior (MX 518),os botões 11 e 12 eram as teclas DPI. Uma das coisas que torna esses botões diferentes dos demais é que aplicativos como o xevnão reconhecem o pressionamento deles como um evento, por padrão. No mouse MX 518, para que esses botões pudessem ser alterados/vinculados, eles tiveram que primeiro ser desabilitados. Acredito que lomocoo chamei de “Logitech SmartScroll / Cruise Control”. No G400 lomoconão funciona e não conheço alternativa.

Além disso, aqui estão alguns resultados de xinput, caso seja útil.

user@localhost:~$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech Gaming Mouse G400                id=8    [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)]
    ↳ AT Translated Set 2 keyboard              id=9    [slave  keyboard (3)]
user@localhost:~$ xinput list-props 8
Device 'Logitech Gaming Mouse G400':
    Device Enabled (121):   1
    Coordinate Transformation Matrix (123): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
    Device Accel Profile (248): 0
    Device Accel Constant Deceleration (249):   2.000000
    Device Accel Adaptive Deceleration (250):   1.000000
    Device Accel Velocity Scaling (251):    1.000000
    Device Product ID (238):    1133, 49733
    Device Node (239):  "/dev/input/event4"
    Evdev Axis Inversion (252): 0, 0
    Evdev Axes Swap (254):  0
    Axis Labels (255):  "Rel X" (131), "Rel Y" (132), "Rel Vert Wheel" (247)
    Button Labels (256):    "Button Left" (124), "Button Middle" (125), "Button Right" (126), "Button Wheel Up" (127), "Button Wheel Down" (128), "Button Horiz Wheel Left" (129), "Button Horiz Wheel Right" (130), "Button Side" (242), "Button Extra" (243), "Button Forward" (244), "Button Back" (245), "Button Task" (246), "Button Unknown" (241), "Button Unknown" (241), "Button Unknown" (241), "Button Unknown" (241)
    Evdev Middle Button Emulation (257):    0
    Evdev Middle Button Timeout (258):  50
    Evdev Third Button Emulation (259): 0
    Evdev Third Button Emulation Timeout (260): 1000
    Evdev Third Button Emulation Button (261):  3
    Evdev Third Button Emulation Threshold (262):   20
    Evdev Wheel Emulation (263):    0
    Evdev Wheel Emulation Axes (264):   0, 0, 4, 5
    Evdev Wheel Emulation Inertia (265):    10
    Evdev Wheel Emulation Timeout (266):    200
    Evdev Wheel Emulation Button (267): 4
    Evdev Drag Lock Buttons (268):  0

Responder1

@Koviko - eu tenho um mouse semelhante - um Logitech MX1100 - que também possui botões DPI que não são enviados para o USB quando pressionados no modo padrão. Fiz alguns testes por conta própria e, eventualmente, consegui descobrir os códigos para enviar o sinal para mudar o mouse para o "Modo Driver", o que me permitiu usar easygestures/xev para reatribuir os botões.

Se você quiser, posso orientá-lo nas etapas que usei para determinar como desligá-lo (agora tenho um script que simplesmente preciso executar na inicialização, como uma solução alternativa bastante hackeada, mas pelo menos está funcionando), mas envolve configurar uma VM e ter um mouse secundário e detectar o tráfego USB bruto e, infelizmente, parece ser muito específico do mouse.

Meus passos (quase certamente existem melhores):

1) Tenha uma VM Windows (com o software Logitech SetPoint instalado; usei VirtualBox, porque já tinha configurado com WinXP para funcionar), Wireshark e gcc instalados em seu sistema. 2) Em seguida executei os seguintes passos em um terminal:

sudo modprobe usbmon
sudo wireshark &
sudo /usr/lib/virtualbox/VirtualBox &

3) No Wireshark, escolha 'Listar as interfaces de captura disponíveis...' e anote qual número do barramento USB gera uma tonelada de pacotes quando você move o mouse (o meu era usbmon3, mas imagino que seja puramente baseado em qual porta USB seu receptor está conectado).

3) No VirtualBox (precisei executar como sudo para compartilhar o controlador USB), editei as configurações da VM XP e habilitei o controlador USB e o controlador USB 2.0 (EHCI). Em seguida, adicionei um novo filtro USB preenchido a partir de um dispositivo existente e selecionei o receptor do meu mouse Logitech (ID do fornecedor 046d, produto c245, para você) e, em seguida, iniciei a VM.

(Observação: após esse ponto, precisei conectar um segundo mouse, porque tive que fornecer o controle do meu mouse normal à VM do Windows para que o software SetPoint pudesse ver que ele existia como algo mais do que um mouse genérico.)

4) Na VM, iniciei o software SetPoint e fui para a tela que permite definir ações personalizadas para vários botões. Então, de volta ao Wireshark, iniciei uma captura no barramento USB do mouse, imediatamente entrei no VM/SetPoint e mudei a atribuição do botão de DPI +/- para Keystroke Assignment, depois voltei imediatamente para o Wireshark e parei o capturar. (Repeti isso mais 10 a 15 vezes, alterando as configurações para modos diferentes, principalmente porque não tinha certeza de quantos dados precisaria, mas depois de revisar, realmente só precisei das primeiras 1 a 2 capturas.)

Supondo que seu mouse funcione vagamente semelhante ao meu, o que eu acho que funcionaria, sua captura provavelmente teria um total de 16 quadros, 4x GET DESCRIPTOR e depois 3x (2xURB_CONTROL out + 2xURB_INTERRUPT in). O que você está procurando são os 3 quadros de saída URB_CONTROL mais longos. Um exemplo de um dos meus quadros capturados é:

0000  c0 80 64 36 00 88 ff ff  53 02 00 03 03 00 00 00
0010  5e 4b 25 50 00 00 00 00  f4 d9 08 00 8d ff ff ff
0020  07 00 00 00 07 00 00 00  21 09 10 02 01 00 07 00
0030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
0040  10 01 80 65 82 85 ff

O que procuramos são os últimos 7 bytes da resposta (acima, o '10 01 80 65 82 85 ff'), de cada um dos quadros mais longos 'URB_CONTROL out'. Finalmente, baixei a fonte do "g_hack" emGit, e remendei o código do produto do mouse na parte superior e uma nova opção (configurei-o como 0/1 com uma instrução if dentro deles, pois era apenas uma prova de conceito muito rudimentar) que mudaria meu mouse para "driver modo" ou "modo DPI".

Depois disso, tudo o que foi necessário foi configurar os novos botões do mouse disponíveis em sua escolha de programas de remapeamento (usei easygestures porque foi a primeira coisa com uma UI que encontrei - ela pode ou não ter um substituto superior).

informação relacionada