Saltar al contenido

¿Puedo ejecutar macros y atajos desde un segundo teclado en Linux?

Después de mucho batallar pudimos encontrar el arreglo de esta cuestión que tantos usuarios de nuestro espacio han tenido. Si deseas compartir algo más no dudes en dejar tu comentario.

Solución:

Si bien mi otra respuesta probablemente funcionará en la mayoría de los Linux, incluso si tienen muchos años, SystemD y udev realmente facilitan las cosas:

  • usar lsusb para encontrar el proveedor y el código de producto de su teclado adicional. (En mi caso, es el proveedor 145F, producto 0177. Asegúrese de tener las letras en mayúsculas).

  • crear un archivo /etc/udev/hwdb.d/90-extra-keyboard.hwdb, con contenidos similares a este:

evdev:input:b0003v145Fp0177*
 KEYBOARD_KEY_7005b=stopcd

La primera línea identifica el dispositivo: las cuatro letras después de la v es el código del proveedor, después de la p, es el código del producto, del paso anterior. Cada línea adicional asigna un código de escaneo a un nombre simbólico. Para obtener el código de escaneo, ejecute evtest:

Event: time 1553711252.888538, -------------- SYN_REPORT ------------
Event: time 1553711257.656558, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70059
Event: time 1553711257.656558, type 1 (EV_KEY), code 79 (KEY_KP1), value 1

Para saber qué usar para el nombre simbólico, mire la lista de #define KEY_… líneas en /usr/include/linux/input-event-codes.h:

#define KEY_PLAYPAUSE           164
#define KEY_PREVIOUSSONG        165
#define KEY_STOPCD              166
#define KEY_RECORD              167
  • reconstruir y cargar bases de datos internas ejecutando systemd-hwdb update; udevadm trigger

  • Verifique que la nueva configuración funcione ejecutando evtest nuevamente, o asignando atajos en su configuración.

Cuando pruebe esto en aplicaciones, recuerde que si su entorno de escritorio ya usa ese acceso directo, la aplicación ni siquiera verá la pulsación de tecla.

En principio, sí. La última vez que hice esto en 2012, el camino a seguir era intentar decirle a Linux que el segundo teclado es muy extraño y realmente significa XF86VolumeUp cuando envía la pulsación de tecla para Num 1, o lo que sea. Afortunadamente, hay bastantes códigos de teclas que no existen en los teclados estándar que puede usar de esta manera.

Repasemos esto por un solo key:

  • usar xev | grep -i key para encontrar los códigos clave del keys en su teclado adicional. Solo haré teclado 9, por ejemplo, con el código 81. (Nota: mi teclado adicional tiene un key etiqueta “00” pero envía “0” dos veces, no tengo idea de cómo manejar eso).
      KeyPress event, serial 38, synthetic NO, window 0x4400001,
        state 0x10, keycode 81 (keysym 0xffb9, KP_9), same_screen YES,
      KeyRelease event, serial 39, synthetic NO, window 0x4400001,
        state 0x10, keycode 81 (keysym 0xffb9, KP_9), same_screen YES,
        request MappingKeyboard, first_keycode 8, count 248
  • cheque setxkbmap -query para las reglas de su teclado (principal). Intentaremos convertir su teclado adicional en una docena de medios keys en ese diseño. Para mi es
rules:      evdev
model:      pc105
layout:     de
variant:    nodeadkeys
  • encontrar suficientes entradas en /usr/share/X11/xkb/symbols/inet. El lado derecho es lo que verá la aplicación, posiblemente con shift key modificadores, etc., el lado izquierdo son códigos de escaneo. Elegiré este, porque mi teclado no tiene una “calculadora” key:
key          [ XF86Calculator        ]       ;
  • crear un archivo en /usr/share/X11/xkb/keycodes/ que asigna códigos de escaneo a códigos clave (desde el primer paso). Sí, esto parece al revés. Mi archivo se llama trustkeypad y se ve así:
default xkb_keycodes "trustkeypad" 
    minimum= 8;
    maximum= 255;

    // keypad 9
     = 81;
;
  • compila este archivo con xkbcomp -xkb trustkeypad

  • pruébalo con setxkbmap -v -v -device 17 -keycodes (filename). (El 17 es la identificación de tu xinput.) El resultado para mí se ve así:

Warning! Multiple definitions of keycodes
         Using command line, ignoring rules file
Applied rules from evdev:
rules:      evdev
model:      pc105
layout:     de
variant:    nodeadkeys
Trying to build keymap using the following components:
keycodes:   trustkeypad
types:      complete
compat:     complete
symbols:    pc+de(nodeadkeys)+inet(evdev)
geometry:   pc(pc105)

y eso se ve bien, en particular, la línea de códigos clave. Si tu corres xev ahora, debería ver los nuevos símbolos que se generan. Por desgracia, solo obtengo una media victoria en este momento:

KeyPress event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043275, (1666,897), root:(1670,950),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043403, (1666,897), root:(1670,950),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043403, (1666,897), root:(1670,950),
    state 0x10, keycode 77 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x4600001,
    root 0x168, subw 0x0, time 24043411, (1666,897), root:(1670,950),
    state 0x10, keycode 77 (keysym 0x0, NoSymbol), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

pero después de que choqué X un par de veces por accidente (no creo que establecer el valor mínimo en el archivo de códigos clave más alto ayudará), eso desapareció. Quizás un simple reinicio pueda ayudar en este punto. Una vez que tenga éxito, solo debería obtener algo como

KeyPress event, serial 38, synthetic NO, window 0x3e00001,
    root 0x168, subw 0x0, time 26443862, (930,972), root:(934,1025),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 39, synthetic NO, window 0x3e00001,
    root 0x168, subw 0x0, time 26444022, (930,972), root:(934,1025),
    state 0x10, keycode 81 (keysym 0x1008ff1d, XF86Calculator), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

y puede verificar en su configuración de usuario que ahora puede asignar un acceso directo a este key, y dirá que está asignado a la Calculadora key.

Todavía falta aquí: descubrir cómo hacer que esta sea la configuración estándar, también en los reinicios. Esto probablemente implicará mirar udev, y https://help.ubuntu.com/community/Custom%20keyboard%20layout%20definitions podría ser útil, aunque tiene una etiqueta “desactualizada” que data de 2014.

Reseñas y calificaciones del tutorial

Si piensas que te ha resultado de utilidad este post, sería de mucha ayuda si lo compartieras con más desarrolladores de esta manera contrubuyes a difundir nuestro contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *