¿Cómo cambio el mapa de teclas de un solo dispositivo (presentador Logitech)?

20

Mi presentador Logitech R400 envía los siguientes códigos clave:

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)

Básicamente, quiero usar este presentador para controlar remotamente a Banshee, por lo que me gustaría reasignar Priora B, Nexta N, etc.

¿Cómo puedo cambiar el mapa de teclas solo para este dispositivo (ya que ciertamente no quiero reasignar esos códigos de tecla a nivel mundial)?

htorque
fuente
AFAIU "puntero esclavo" significa que es un mouse, no un teclado. No puede cargar un mapa de teclas en un mouse. ¿Esos son realmente los únicos dispositivos presentes en la lista de xinput?
Marius Gedminas
@MariusGedminas Tuve que pasar por los dispositivos / dev / input / eventX y event5 fue el presentador, así que parece ser un "teclado" después de todo.
htorque

Respuestas:

15

Nunca hice eso, pero creo que necesitas crear un archivo de mapa de teclas /lib/udev/keymaps/y agregar una regla para que tu dispositivo/lib/udev/rules.d/95-keymap.rules


Detalles:

  • Un mapa de teclas udev asigna códigos de escaneo a códigos clave, por lo que debe encontrar ambos para crear el archivo de mapa de teclas. Para encontrar los códigos de escaneo, ejecute lo siguiente y presione los botones del dispositivo:

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

    Es posible que deba probar diferentes números para el evento * . La salida debería verse así:

    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
    

    Puede encontrar una lista de códigos clave aquí .

    Ahora cree el archivo de mapa de teclas (lo estoy almacenando como / lib / udev / keymaps / logitech-r400 ):

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

    No hace nada útil, solo una prueba para ver fácilmente si funciona.

  • Para probar el nuevo mapa de teclas temporalmente, ejecute:

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

    que debería dar como resultado una salida 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)
    

    Los botones ahora deberían cambiar el brillo.

  • Si desea que ese cambio sea permanente, debe agregar una regla udev /lib/udev/rules.d/95-keymap.rulesque aplique el archivo de mapa de teclas al dispositivo.

    1. Abre el archivo: gksudo gedit /lib/udev/rules.d/95-keymap.rules
    2. Al final del archivo, pero antes de la LABEL="keyboard_end"línea, agregue:

      ENV{ID_VENDOR}=="Logitech*", ATTRS{idProduct}=="c52d", RUN+="keymap $name logitech-r400"
      
    3. Guardar, cerrar y después de reiniciar los botones deberían cambiar el brillo.

Florian Diesch
fuente
Oh, cómo podría olvidarme de eso (/ lib / udev / keymaps / zepto-znote fue aportado por mí: D). Más adelante agregaré más sobre cómo lo hice funcionar a su respuesta.
htorque
Solo quería agregar a esta respuesta que puede concentrarse en qué "eventX" podría ser su teclado al ejecutar /lib/udev/findkeyboards. Eso enumerará todos los teclados conectados actualmente para que no tenga que probar tantos. El logitech r400 apareció como "teclado USB: input / event11" para mí.
jat255
Buena respuesta, pero ¿cómo descubro el ID_VENDOR y el idProduct para usar? Lo intenté /sys/class/dmi/id/sys_vendory /sys/class/dmi/id/product_nameno funcionó.
PutzKipa
2
/lib/udev/keymapy /lib/udev/findkeyboardsya no existe en 13.10. forum.ubuntu-fr.org/viewtopic.php?id=1395051 dice que use evtest en su lugar.
Stéphane Gourichon
66
Hola @htorque, ¿podrías actualizar la respuesta a la nueva forma? En Ubuntu Trusty todos estos archivos ya no existen. Eres el único que he visto en la red que tiene el mismo problema.
londumas
4

Estoy en Ubuntu 16.04. Hice una guía aquí

Detectando con evtest

sudo evtest

Mira la 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"

Tomó el primer "receptor USB Logitech", aquí tiene la identificación de evento 9.

Testing ... (interrupt to exit)

OK ahora evtest quiere entradas, solo haga clic en los botones remotos de Logitech, obtuve esto (simplificado):

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

Nota: descubrí que después de hacer clic varias veces en [>] estaba dando 7003e, luego 70029, luego 7003e, etc. No sé por qué.

Modificando conf de udev

Ahora que tenemos códigos de entrada, echemos un vistazo a udev conf:

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

Busque "R400" y reemplace la presentación y el botón de visualización por lo que desee, pausa de reproducción y teclas de flecha detenidas :

# 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 se señaló anteriormente, debido a 07003e y 070.029 son el mismo botón, que les dio la misma salida hasta la clave. El 7004b y el 7004e no aparecen aquí de forma predeterminada, tal vez porque son entradas PAGEUP y PAGEDOWN nativas y no están relacionadas con "Logitech Presenter R400". Vamos a agregarlos:

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

Aquí está mi 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"

Reglas de recarga (nuevas)

sudo udevadm hwdb --update

Luego, usando la misma identificación de evento que elegimos antes, aquí la identificación de evento 9:

sudo udevadm trigger /dev/input/event9

Puede verificar esta nueva asignación en un navegador web, por ejemplo:

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

Eso me dio:

[>] ArrowUp
[ ] ArrowDown
 <  ArrowLeft
 >  ArrowRight
Ssh-uunen
fuente
He realizado algunas pequeñas mejoras en su guía original logitech-r400-remap.md de GitHub. Por favor, siéntase libre de cambiarlos o editarlos en su página web de GitHub si lo desea (no es necesario atribuirme nada). Su respuesta fue rechazada porque en mi opinión era una respuesta de solo enlace, así que también deshice la votación negativa.
karel
Se eliminaron los downotes, por lo que ahora su respuesta tiene la oportunidad de ser considerada por sus propios méritos como cualquier otra respuesta aquí.
karel
1
Usaste tu guía. Funcionó como un encanto:)
Costa