Cómo cambiar scancode-> keycodemapeo

Cómo cambiar scancode-> keycodemapeo

He reasignado el bloqueo de mayúsculas al retroceso.

/etc/predeterminado/teclado

XKBLAYOUT="us"
XKBVARIANT="altgr-intl"
BACKSPACE="guess"
XKBOPTIONS="caps:backspace"

Esto funciona bastante bien, excepto que no funciona para algunas herramientas específicas. Solía xev​​​​descubrir qué está pasando.

Retroceso presionado

KeyPress event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 1028211, (335,635), root:(452,749),
    state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES,
    XLookupString gives 1 bytes: (08) "
    XmbLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

KeyRelease event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 1028272, (335,635), root:(452,749),
    state 0x10, keycode 22 (keysym 0xff08, BackSpace), same_screen YES,
    XLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

Bloqueo de mayúsculas presionado

KeyPress event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 859789, (391,558), root:(508,672),
    state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES,
    XKeysymToKeycode returns keycode: 22
    XLookupString gives 1 bytes: (08) "
    XmbLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

KeyRelease event, serial 38, synthetic NO, window 0x2400001,
    root 0x159, subw 0x0, time 859875, (391,558), root:(508,672),
    state 0x10, keycode 66 (keysym 0xff08, BackSpace), same_screen YES,
    XKeysymToKeycode returns keycode: 22
    XLookupString gives 1 bytes: (08) "
    XFilterEvent returns: False

También lo probé en el navegador usando

addEventListener('keyup', event => {
  console.log(event.keyCode, event.key, event.code)
})

Esto registra lo siguiente cuando presiono retroceso y bloqueo de mayúsculas

8 "Backspace" "Backspace"
8 "Backspace" "CapsLock"

Básicamente, mi bloqueo de mayúsculas se reasigna a retroceso, pero solo funciona si las herramientas y los sitios web utilizan las comprobaciones adecuadas. No quiero presentar un informe de error por cada herramienta o sitio web que uso y que implementa esto incorrectamente.

¿Es posible asignar el bloqueo de mayúsculas de tal manera que emule completamente un retroceso en lugar de actuar como un bloqueo de mayúsculas reasignado?

Respuesta1

Primero, veamos cómo se procesa la pulsación de una tecla (tomado deesta respuesta):

/teclado/ → scancode→ /controlador de entrada/ → keycode→ /X servidor XKB/ →keysym

Es scancodeun código específico del dispositivo que está vinculado a una clave específica y puede diferir entre diferentes proveedores/productos. keycodey keysymse propagan a las aplicaciones. Sirve keycodecomo una capa de abstracción, ya que es independiente del dispositivo y de la configuración regional. Lo mismo keycodepuede producir diferentes keysymmensajes de correo electrónico, según la configuración regional y el estado de las teclas modificadoras. Esa es la razón por la que algunas aplicaciones solo buscan el keycode, especialmente cuando se trata de atajos de teclado.

Entonces, nuestro objetivo es asignar la scancodetecla Bloq Mayús a keycodela tecla Retroceso. Las aplicaciones verán lo mismo keycodeindependientemente keysymde si presiona Retroceso o Bloq Mayús.

Este mapeo se realiza medianteudevutilizando elhardwsondatabase (hwdb.bin) que se compila a partir de archivos .hwdb tanto en como /lib/udev/hwdb.d/en /etc/udev/hwdb.d/.


Cómo cambiar scancode-> keycodemapeo

Reúna la información requerida

Primero debe determinar el bustype, y de su dispositivo de entrada (teclado), así como la tecla que desea reasignar y a la que vendordesea asignarla.productversionscancodekey code identifier

Ejecute evtest(es posible que deba instalarlo primero) e identifique su teclado en la lista de dispositivos. En teclados con teclas adicionales como Reproducir/Pausa, WWW, etc., estas teclas suelen estar expuestas como un dispositivo de entrada diferente. Si no obtiene ningún resultado al presionar una tecla, presione Control+ Cy pruebe con un dispositivo diferente. Una vez que haya identificado su teclado, recuerde la primera columna ( /dev/input/eventX) y presione la tecla que desea reasignar. El valor posterior (MSC_SCAN)es el scancode. En mi teclado:

$ evtest
Available devices:
/dev/input/event0:  Power Button
/dev/input/event1:  Power Button
/dev/input/event2:  G19 Gaming Keyboard
/dev/input/event3:  G19 Gaming Keyboard
...
Select the device event number [0-18]:2
...
Event: time 1522111203.117945, -------------- SYN_REPORT ------------
Event: time 1522111220.778787, type 4 (EV_MSC), code 4 (MSC_SCAN),value 70039
Event: time 1522111220.778787, type 1 (EV_KEY), code 14 (KEY_BACKSPACE), value 1

... el scancodees70039.

Ahora ejecuta el siguiente comando, donde eventXestá el que elegiste antes:

$ grep "" /sys/class/input/eventX/device/id/*

La salida para mi teclado es

/sys/class/input/event2/device/id/bustype:0003
/sys/class/input/event2/device/id/product:c228
/sys/class/input/event2/device/id/vendor:046d
/sys/class/input/event2/device/id/version:0110

Para obtener key code identifier, utilice la salida de evtesto mire elTeclas y botonessección /usr/include/linux/input-event-codes.hpara obtener una lista completa. El identificador es la parte después de KEY_convertirse a minúsculas, por ejemplo, KEY_BACKSPACEse convierteretroceso.

Configurar udev

Echa un vistazo a /lib/udev/hwdb.d/. Crearemos un archivo de texto en/etc/udev/hwdb.d/con un nombre de archivo que comienza con un número mayor que el archivo correspondiente a nuestro tipo de dispositivo. Para un teclado, puede ser cualquier número mayor que 60, mientras que para un dispositivo señalador debe ser mayor que 70. Por ejemplo 65-keyboard-custom.hwdb. Utilice su editor de texto favorito, pero tenga en cuenta que debe iniciarlo como root, por ejemplo

$ sudo gedit /etc/udev/hwdb.d/65-keyboard-custom.hwdb

Añade el siguiente contenido

evdev:input:b[bustype]v[vendor]p[product]e[version]*
 KEYBOARD_KEY_[scancode]=[key code identifier]

...dónde

  • [tipo de bus], [proveedor], [producto] y [versión] tienen exactamente 4 caracteres (rellene con ceros si es necesario) y las letras debenmayúscula
  • [scancode] no necesita relleno pero las letras deben serminúscula
  • la evdev:...línea tienesin espacio anterior
  • la KEYBOARD_KEY...línea tieneexactamente un espacio anterior

En mi ejemplo, el archivo se ve así:

evdev:input:b0003v046DpC228e0110*
 KEYBOARD_KEY_70039=backspace   # map CapsLock to BackSpace

La primera línea coincidirá con su dispositivo. Puede especificar evdev:líneas adicionales y puede utilizar más de un comodín ( *) para hacer coincidir dispositivos adicionales, pero tenga en cuenta que los códigos de escaneo son específicos del dispositivo. También puede agregar más de una asignación de código de escaneo. Échale un vistazo /lib/udev/hwdb.d/60-keyboard.hwdbpara inspirarte. Puede encontrar una versión más detallada y actualizada de ese archivo en elrepositorio en línea.

Aplicar nueva configuración

Compile la nueva configuración en la base de datos de hardware:

$ sudo systemd-hwdb update

Si desea aplicar los cambios inmediatamente, informe a udev:

$ sudo udevadm trigger

Tenga en cuenta que los valores de configuración solo se pueden agregar o cambiar mientras el sistema está en ejecución. Si elimina una configuración (por ejemplo, asignación de código de escaneo), deberá reiniciar para que los cambios surtan efecto.

Recuerde también revertir la reasignación que realizó antes (usando /etc/default/keyboard), porque aún se aplicará a todos los teclados.

información relacionada