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 tuxinput
.) 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.