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 ventanas / aplicaciones 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 las teclas sin usar xmodmap y setxkbmap? si alguna vez se puede hacer usando algún software.
También probé xkeycaps, xkbcomp, pero no probé loadkeys, ya que se ejecuta en X.
Encontré aquí que podía intentarlo setkeycodes
, "porque después de asignar el código de clave del núcleo, el botón debería funcionar en xorg" , pero también descubrí que "no se pueden usar 'setkeycodes' en teclados USB" , ese es mi caso (estoy interesado en el caso alguien lo hace funcionar en ps2 ya que creo que podría usar un adaptador).
Esto parecía prometedor "Asignar códigos de escaneo a códigos de teclas" , pero después de algunas pruebas nada cambió, aquí están:
Encontré el código de clave "36" (tecla "j") en vt1 con el código de showkey
escaneo "7e" (teclado ".") En vt1 conshowkey --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/...
o
input-kbd 3
(coloque el índice de identificación encontrado en ls -l /dev/input/by-id/*
ex. Event3)
PD .: * Si está interesado en probarse a sí mismo, el hilo relacionado para la aplicación es este: http://forums.thedarkmod.com/topic/14266-keyboard-issue-in-new-version-108/ Los problemas I tienen son las mismas: algunas claves (KP_Decimal, DownArrow, UpArrow, RightArrow) se ignoran y se consideran todas con el mismo valor "0x00"
fuente
/etc/udev/hwdb.bin
, no/lib/udev/hwdb.bin
. Pero aunque este archivo se actualiza correctamente, esto tampoco funciona para mí, incluso después de un reinicio. Quizás algo falta en la documentación. Acerca de esto: bugs.freedesktop.org/show_bug.cgi?id=82311showkey --scancodes
no da los códigos de escaneo que udev espera (los valores son diferentes); lainput-kbd
utilidad proporciona los códigos de escaneo correctos.evtest
utilidad también debe proporcionarle los códigos de escaneo correctos: después de escribir una clave, debe obtener 2 líneas y la primera debe terminar con algo del formulariocode 4 (MSC_SCAN), value xxx
, dondexxx
está el código de escaneo. Pero el controlador de mi teclado tiene errores, y no obtengo estaMSC_SCAN
línea para algunas teclas que quería reasignar. Es por eso que utilicéinput-kbd
, que enumera todos los códigos de escaneo para el dispositivo seleccionado.Respuestas:
Primero encuentre el código de escaneo de la clave que necesita reasignarse, por ejemplo, con la
evtest
utilidad. SeMSC_SCAN
debe generar una línea como la siguiente (con ella):seguido de un segundo que proporciona el código clave actual. Si no
MSC_SCAN
se emite ninguna línea, esto se debe a un error del controlador del kernel, pero el código de escaneo todavía se puede encontrar con lainput-kbd
utilidad;evtest
debería haber proporcionado el código clave, de modo que debería ser fácil encontrar la línea correspondiente en lainput-kbd
salida (por ejemplo, usandogrep
).Una vez que se hayan determinado los códigos de escaneo de las claves que se reasignarán, cree un archivo como el que
/etc/udev/hwdb.d/98-custom-keyboard.hwdb
contiene las reasignaciones. El comienzo del archivo/lib/udev/hwdb.d/60-keyboard.hwdb
da alguna información. En mi caso (que funciona), tengo:(Antes de udev 220, tenía que usar
keyboard:usb:v05ACp0221*
para la primera línea).La
evdev:
cadena debe estar al principio de la línea. Tenga en cuenta que las letras en el proveedor y la identificación del producto deben ser mayúsculas. CadaKEYBOARD_KEY_
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 ignoró en silencio con las versiones antiguas de udev).KEYBOARD_KEY_
es seguido por el código de escaneo en hexadecimal (como lo que ambosevtest
yinput-kbd
dar). Los valores válidos se pueden obtener de laevtest
salida o lainput-kbd
salida, o incluso del/usr/include/linux/input.h
archivo: por ejemplo,KEY_102ND
daría102nd
(quitandoKEY_
y convirtiendo a minúsculas), que utilicé anteriormente.Después de guardar el archivo, escriba:
para (re) construir la base de datos
/etc/udev/hwdb.bin
(puede verificar su marca de tiempo). Luego,tendrá en cuenta la nueva configuración. Puedes consultar con
evtest
.En 2014, el udev publicado contenía información incompleta / con errores
/lib/udev/hwdb.d/60-keyboard.hwdb
, pero puede consultar la última versión de desarrollo del archivo y / o mi informe y discusión de errores sobre la documentación y los problemas de espacio.Si esto no funciona, el problema podría encontrarse después de aumentar temporalmente el nivel de registro de
udevd
withudevadm control
(consulte la página del comando man udevadm (8) para obtener más detalles).Para
udev
versiones antiguas como 204, este método aún debería funcionar.fuente
/lib/udev/hwdb.bin
, mirébless
yKEYBOARD_KEY_70085
aparece al final. Creo que ubuntu 14.04 está configurado (¿protegido?) De esta manera. Probéudevadm control --log-priority=debug
. basado enlsusb
(045e: 0750) me gusta mi tecladokeyboard:usb:v045ep0750*
, pero también lo intentékeyboard:usb:v*p*
. Supongo que esto/etc/udev/hwdb.bin
debería actualizarse, pero ni siquiera existe.udevadm hwdb --usr --update
, a pesar de que no lo estaba.udevadm hwdb --update
he copiado/lib/udev/hwdb.bin
a/etc/udev/hwdb.bin
y corrióstrace udevadm trigger --sysname-match="event*"
y el archivohwdb.bin
parece no haber sido leído por ella (si es como funciona este).udevadm trigger ...
, vea mi prueba aquí . Tenga en cuenta que antes de ejecutarudevadm trigger ...
, debe asegurarse de que se haya actualizado el tiempo de modificación del archivo; de lo contrario, el tiempo de acceso no se actualizará cuando se lea el archivo.udevadm --version
: 215 (y versión del paquete udev: 215-7). Gracias audevadm trigger ...
, no debería necesitar reiniciar (a menos que desee eliminar la configuración, AFAIK). Pero es posible que desee probar un reinicio para ver si hay algún efecto.