Como altero o mapa de teclas de um único dispositivo (apresentador da Logitech)?

20

Meu apresentador Logitech R400 envia os seguintes códigos de chave:

keycode 112 (keysym 0xff55,  Prior) [page up]
keycode 117 (keysym 0xff56,   Next) [page down]
keycode  60 (keysym   0x2e, period)
keycode  71 (keysym 0xffc2,     F5)
keycode   9 (keysym 0xff1b, Escape)

Basicamente, quero usar esse apresentador para controlar remotamente o Banshee, então gostaria de remapear Priorpara B, Nextpara Ne assim por diante.

Como posso alterar o mapa de teclas apenas para este dispositivo (como certamente não quero remapear esses códigos de chave globalmente)?

htorque
fonte
AFAIU "ponteiro escravo" significa que é um mouse, não um teclado. Você não pode carregar um mapa de teclas em um mouse. Esses são realmente os únicos dispositivos presentes na lista xinput?
Marius Gedminas
@MariusGedminas Eu tive que passar pelos dispositivos / dev / input / eventX e event5 foi o apresentador, então parece ser um "teclado" afinal.
Htorque 22/10/11

Respostas:

15

Eu nunca fiz isso, mas acho que você precisa criar um arquivo de mapa de teclas /lib/udev/keymaps/e adicionar uma regra para o seu dispositivo/lib/udev/rules.d/95-keymap.rules


Detalhes:

  • Um mapa de teclas do udev mapeia códigos de varredura para códigos de chave, portanto, você precisa encontrar os dois para criar o arquivo de mapa de chaves. Para encontrar os códigos de digitalização, execute o seguinte e pressione os botões no dispositivo:

    sudo /lib/udev/keymap -i input/event5
    

    Pode ser necessário tentar números diferentes para o evento * . A saída deve ficar assim:

    scan code: 0x70037   key code: dot
    scan code: 0x70029   key code: esc
    scan code: 0x7003E   key code: f5
    scan code: 0x7004B   key code: pageup
    scan code: 0x7004E   key code: pagedown
    

    Uma lista de códigos de chave pode ser encontrada aqui .

    Agora crie o arquivo keymap (estou armazenando-o como / lib / udev / keymaps / logitech-r400 ):

    0x70037 brightnessdown
    0x70029 brightnessup
    0x7003E brightnessdown
    0x7004B brightnessup
    0x7004E brightnessdown
    

    Não faz nada de útil - apenas um teste para ver facilmente se funciona.

  • Para testar o novo mapa de teclas temporariamente, execute:

    sudo /lib/udev/keymap input/event5 /lib/udev/keymaps/logitech-r400
    

    o que deve resultar em uma saída como esta:

    Remapped scancode 0x70037 to 0xe0 (prior: 0x34)
    Remapped scancode 0x70029 to 0xe1 (prior: 0x01)
    Remapped scancode 0x7003e to 0xe0 (prior: 0x3f)
    Remapped scancode 0x7004b to 0xe1 (prior: 0x68)
    Remapped scancode 0x7004e to 0xe0 (prior: 0x6d)
    

    Os botões agora devem mudar o brilho.

  • Se você deseja tornar essa alteração permanente, é necessário adicionar uma regra do udev /lib/udev/rules.d/95-keymap.rulesque aplique o arquivo de mapa de teclas ao dispositivo.

    1. Abra o arquivo: gksudo gedit /lib/udev/rules.d/95-keymap.rules
    2. Na parte inferior do arquivo, mas antes da LABEL="keyboard_end"linha, adicione:

      ENV{ID_VENDOR}=="Logitech*", ATTRS{idProduct}=="c52d", RUN+="keymap $name logitech-r400"
      
    3. Salve, feche e, após uma reinicialização, os botões devem mudar o brilho.

Florian Diesch
fonte
Oh, como eu poderia esquecer isso (/ lib / udev / keymaps / zepto-znote foi contribuído por mim: D). Mais tarde, acrescentarei mais sobre como eu fiz funcionar na sua resposta.
Htorque 22/10/11
Só queria acrescentar a esta resposta que você pode se concentrar em qual "eventX" seu teclado pode estar executando /lib/udev/findkeyboards. Isso listará todos os teclados conectados no momento, para que você não precise experimentar tantos. O logitech r400 apareceu como "teclado USB: entrada / evento11" para mim.
precisa saber é
Boa resposta, mas como descubro o ID_VENDOR e o idProduct para usar? Eu tentei /sys/class/dmi/id/sys_vendore /sys/class/dmi/id/product_namemas não funcionou.
PutzKipa
2
/lib/udev/keymape /lib/udev/findkeyboardsnão existe mais em 13.10. forum.ubuntu-fr.org/viewtopic.php?id=1395051 diz para usar o evtest.
Stéphane Gourichon
6
Olá @htorque, você poderia atualizar a resposta para o novo caminho? No Ubuntu Trusty, todos esses arquivos não existem mais. Você é o único que eu vi na net tendo o mesmo problema.
londumas 31/03
4

Estou no Ubuntu 16.04. Eu fiz um guia aqui

Detectando com evtest

sudo evtest

Veja a lista de dispositivos:

/dev/input/event0:  Lid Switch
/dev/input/event1:  Power Button
/dev/input/event2:  Sleep Button
/dev/input/event3:  Power Button
/dev/input/event4:  AT Translated Set 2 keyboard
/dev/input/event5:  Video Bus
/dev/input/event6:  USB Optical Mouse
/dev/input/event7:  AlpsPS/2 ALPS DualPoint Stick
/dev/input/event8:  AlpsPS/2 ALPS DualPoint TouchPad
/dev/input/event9:  Logitech USB Receiver
/dev/input/event10: Logitech USB Receiver
/dev/input/event11: HDA Intel PCH Dock Mic
/dev/input/event12: HDA Intel PCH Headset Mic
/dev/input/event13: HDA Intel PCH Dock Line Out
/dev/input/event14: HDA Intel PCH Headphone
/dev/input/event15: HDA Intel PCH HDMI/DP,pcm=3
/dev/input/event16: HDA Intel PCH HDMI/DP,pcm=7
/dev/input/event17: HDA Intel PCH HDMI/DP,pcm=8
/dev/input/event18: Integrated Webcam
/dev/input/event19: Dell WMI hotkeys
Select the device event number [0-19]: 9
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x46d product 0xc52d version 0x111
Input device name: "Logitech USB Receiver"

Tomou o primeiro "Logitech USB Receiver", aqui tem o ID de evento 9.

Testing ... (interrupt to exit)

OK, agora o evtest deseja entradas, basta clicar nos botões remotos da Logitech, eu entendi (simplificado):

[>] value 7003e (KEY_PRESENTATION)
[>] value 70029 (KEY_PRESENTATION)
[ ] value 70037 (KEY_DISPLAYTOGGLE)
 <  value 7004b (KEY_PAGEUP)
 >  value 7004e (KEY_PAGEDOWN)

Nota: Descobri depois que clicar várias vezes em [>] estava dando 7003e, 70029 e 7003e etc. Não sei por que.

Modificando o udev conf

Agora que temos códigos de entrada, vamos dar uma olhada no udev conf:

sudo gedit /lib/udev/hwdb.d/60-keyboard.hwdb

Procure por "R400" e substitua a apresentação e exibição pelo que deseja, playpause e stopcd :

# Logitech Presenter R400
evdev:input:b0003v046DpC52D*
 KEYBOARD_KEY_070029=playpause    # bottom  left [>] was "presentation"   
 KEYBOARD_KEY_07003e=playpause    # bottom  left [>] was "presentation"  
 KEYBOARD_KEY_070037=stopcd       # bottom right [ ] was "displaytoggle"

Como observado anteriormente, porque 07003e e 070.029 são o mesmo botão, dei-lhes a mesma saída para cima chave. Os 7004b e 7004e não aparecem aqui por padrão, talvez porque sejam entradas PAGEUP e PAGEDOWN nativas e não relacionadas ao "Logitech Presenter R400". Vamos adicioná-los:

 KEYBOARD_KEY_07004b=previoussong #    top  left  <
 KEYBOARD_KEY_07004e=nextsong     #    top right  >  

Aqui está o meu conf final:

 KEYBOARD_KEY_07004b=previoussong #    top  left  <
 KEYBOARD_KEY_07004e=nextsong     #    top right  >
 KEYBOARD_KEY_070029=playpause    # bottom  left [>] was "presentation"
 KEYBOARD_KEY_07003e=playpause    # bottom  left [>] was "presentation"
 KEYBOARD_KEY_070037=stopcd       # bottom right [ ] was "displaytoggle"

Recarregando (novas) regras

sudo udevadm hwdb --update

Então, usando o mesmo ID de evento que escolhemos antes, aqui o ID de evento 9:

sudo udevadm trigger /dev/input/event9

Você pode verificar esse novo mapeamento em um navegador da web, por exemplo:

$('body').on('keydown', function(e){ console.log(e.key) })

Isso me deu:

[>] ArrowUp
[ ] ArrowDown
 <  ArrowLeft
 >  ArrowRight
Ssh-uunen
fonte
Fiz algumas pequenas melhorias no seu guia logitech-r400-remap.md original do GitHub. Sinta-se à vontade para alterá-los ou editá-los na sua página do GitHub, se desejar (nenhuma atribuição para mim é necessária). Sua resposta foi reduzida, porque era uma resposta apenas de link na minha opinião, então eu também desfiz o voto negativo.
22417
Os downotes foram removidos, então agora sua resposta tem a oportunidade de ser considerada por seus próprios méritos, como qualquer outra resposta aqui.
27417
11
Usou o seu guia. Funcionou como um encanto:)
Costa