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 scancode
un código específico del dispositivo que está vinculado a una clave específica y puede diferir entre diferentes proveedores/productos. keycode
y keysym
se propagan a las aplicaciones. Sirve keycode
como una capa de abstracción, ya que es independiente del dispositivo y de la configuración regional. Lo mismo keycode
puede producir diferentes keysym
mensajes 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 scancode
tecla Bloq Mayús a keycode
la tecla Retroceso. Las aplicaciones verán lo mismo keycode
independientemente keysym
de 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
-> keycode
mapeo
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 vendor
desea asignarla.product
version
scancode
key 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 scancode
es70039.
Ahora ejecuta el siguiente comando, donde eventX
está 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 evtest
o mire elTeclas y botonessección /usr/include/linux/input-event-codes.h
para obtener una lista completa. El identificador es la parte después de KEY_
convertirse a minúsculas, por ejemplo, KEY_BACKSPACE
se 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.hwdb
para 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.