Estoy tratando de encontrar una manera de reasignar las teclas del teclado con fuerza.
Intenté usar xmodmap y setxkbmap, pero no funcionan para una aplicación específica. Dichos comandos funcionan para otras aplicaciones/ventanas normales en X tho.
Creo que la aplicación puede estar leyendo los datos sin procesar del teclado e ignorando la entrada X.
Entonces, ¿cómo reasignar claves sin usar xmodmap y setxkbmap? si alguna vez es posible hacerlo usando algún software.
También probé xkeycaps, xkbcomp, pero no probé loadkeys, ya que se ejecuta en X.
Encontré aquí que podía probar setkeycodes
, “porque después de asignar el código clave del kernel, el botón debería funcionar en xorg”, pero también descubrí que “no se puede usar 'setkeycodes' en teclados USB”, ese es mi caso (me interesa en caso de que alguien lo haga funcionar en ps2 como Creo que me vendría bien un adaptador).
Esto parecía prometedor "Asignar códigos de escaneo a códigos clave", pero después de algunas pruebas nada cambió, aquí están:
Encontré el código clave "36" (tecla "j") en vt1 con showkey
Encontré el código de escaneo "7e" (teclado ".") en vt1 con showkey --scancodes
$cat >/etc/udev/hwdb.d/90-custom-keyboard.hwdb
keyboard:usb:v*p*
keyboard:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
KEYBOARD_KEY_7e=36
$udevadm hwdb --update #updates file: /lib/udev/hwdb.bin
$udevadm trigger #should apply the changes but nothing happened
$cat /lib/udev/hwdb.bin |egrep "KEYBOARD_KEY_7e.{10}" -ao
KEYBOARD_KEY_7eleftmeta
$#that cat on hwdb.bin did not change after the commands..
Obs.:tampoco funcionó con:KEYBOARD_KEY_7e=j
Algunas formas más alternativas (por @vinc17) para encontrar las claves:evtest /dev/input/by-id/...
oinput-kbd 3
(coloque el índice de identificación que se encuentra en ls -l /dev/input/by-id/*
de ej. evento3)
PD:*Si está interesado en probarse a sí mismo, el hilo relacionado con la aplicación es este:http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ Los problemas que son iguales:algunas claves (KP_Decimal, DownArrow, UpArrow, RightArrow) se ignoran y se consideran todas con el mismo valor allí "0x00"
Respuesta aceptada:
Primero encuentre el código de escaneo de la tecla que necesita reasignarse, p. con el evtest
utilidad. Una línea como la siguiente (con MSC_SCAN
en él) debe salir:
Event: time 1417131619.686259, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068
seguido de un segundo que da el código de clave actual. Si no MSC_SCAN
se emite la línea, esto se debe a un error del controlador del kernel, pero el código de escaneo todavía se puede encontrar con input-kbd
utilidad; evtest
debería haber dado el código clave, de modo que debería ser fácil encontrar la línea correspondiente en el input-kbd
salida (por ejemplo, usando grep
).
Una vez que se hayan determinado los códigos de escaneo de las teclas que se reasignarán, cree un archivo como /etc/udev/hwdb.d/98-custom-keyboard.hwdb
que contiene las reasignaciones. El comienzo del archivo /lib/udev/hwdb.d/60-keyboard.hwdb
da alguna información. En mi caso (que funciona), tengo:
evdev:input:b0003v05ACp0221*
KEYBOARD_KEY_70035=102nd # Left to z: backslash bar
KEYBOARD_KEY_70064=grave # Left to 1: grave notsign
KEYBOARD_KEY_70068=insert # F13: Insert
(Antes de udev 220, tenía que usar keyboard:usb:v05ACp0221*
para la primera línea.)
El evdev:
la cadena debe estar al principio de la línea.
Tenga en cuenta que las letras en la identificación del proveedor y del producto deben ser mayúsculas.
Cada KEYBOARD_KEY_
la configuración debe tener exactamente un espacio antes (nota:una línea sin espacios dará un mensaje de error, y una línea con dos espacios se silencio ignorado con versiones antiguas de udev). KEYBOARD_KEY_
es seguido por el código de escaneo en hexadecimal (como lo que ambos evtest
y input-kbd
dar). Se pueden obtener valores válidos de evtest
salida o input-kbd
salida, o incluso desde el /usr/include/linux/input.h
archivo:por ejemplo, KEY_102ND
daría 102nd
(eliminando KEY_
y convertir a minúsculas), que usé arriba.
Después de guardar el archivo, escriba:
udevadm hwdb --update
para (re)construir la base de datos /etc/udev/hwdb.bin
(puede comprobar su marca de tiempo). Entonces,
udevadm trigger --sysname-match="event*"
tendrá en cuenta la nueva configuración. Puedes consultar con evtest
.
En 2014, el udev publicado tenía información incompleta o con errores en /lib/udev/hwdb.d/60-keyboard.hwdb
, pero puede ver la última versión de desarrollo del archivo y/o mi informe de error y la discusión sobre la documentación y los problemas de espaciado.
Si esto no funciona, es posible que el problema se encuentre después de aumentar temporalmente el nivel de registro de udevd
con udevadm control
(Consulte la página del manual de udevadm(8) para obtener más detalles).
Para el antiguo udev
versiones como 204, este método aún debería funcionar.