Reasignación de teclado en una "capa inferior" en X

Reasignación de teclado en una "capa inferior" en X

Los mapas de teclas tienen un flujo similar al modelo OSI, aunque no tan bien definidos. Actualmente estoy reasignando a un nivel más alto del que me gustaría. Obviamente, la Capa 1 corresponde al teclado físico y la Capa 7 a la aplicación, pero no estoy seguro de cuántas otras capas hay o dónde se alinean.

Si se tratara de una computadora de escritorio con un teclado físico programable dedicado, estaría listo, pero, por desgracia, es una computadora portátil y necesito mantener las reasignaciones mientras uso el teclado incorporado.

FWIW, estoy intercambiando los siguientes pares de teclas: [Tilde/Esc], [Caps/LCtrl], [Back{space,slash}]. También uso Dvorak, pero está configurado en el sistema operativo de forma estándar.

Actualmente, estoy modificando /usr/share/X11/xkb/keycodes/evdev para realizar mis cambios en X (y creando un archivo de diseño personalizado para consolas, pero eso no es relevante aquí). No estoy seguro de dónde cae esto en la "pila de capas".

La cuestión:Mi mapa de teclas no se traduce en sesiones de consola Proxmox, que utiliza un cliente web VNC. (El diseño tampoco se aplica, pero es lo esperado). El problema es claramente que el cliente VNC está conectando el teclado en una capa inferior donde la reasignación de evdev aún no se ha aplicado.

En Windows, uso una utilidad llamada KeyTweak para generar mapas de códigos de escaneo para el registro, que parece ser básicamente la "Capa 3". He jugado juegos que aparentemente enganchaban el teclado en la "Capa 2", pero eso no es un problema ya que en la mayoría de los juegos se escribe muy poco.

En conclusión, No estoy seguro de dónde se ubica evdev en mi modelo de teclado OSI imaginario, pero ¿cómo puedo reasignarlo en una capa inferior? No tengo necesidad de cambiar la reasignación por ningún motivo, por lo que este cambio puede ser básicamente permanente. Si pudiera hacerlo en la BIOS, lo haría.

Respuesta1

La respuesta resultó ser udev. Básicamente seguíesta publicación, pero la esencia es:

  • Instalarevtest
  • Ejecute evtesty presione las teclas que desea reasignar para veramboslos códigos de escaneo y códigos clave.
  • Cree un nuevo archivo /etc/udev/hwdb.d/llamado algo así como 70-keyremap.hwdbcon el contenido a continuación
    • Supongo que el número es el orden del archivo, pero no tenía ningún archivo existente en el que basarlo, por lo que no estoy seguro de cuáles son sus requisitos previos para que pueda necesitar un número mayor. En realidad, el hwdb.ddirectorio no existía para mí en Tumbleweed, así que tuve que crearlo, pero aun así funcionó.
  • Correr systemd-hwdb update.
  • Reiniciar

_

# This is from the brokkr.net post I linked above
# Format can be found on [https://wiki.archlinux.org/title/Map_scancodes_to_keycodes].

$ cat 70-keymap.hwdb
evdev:atkbd:dmi:bvn*:bvr*:bd*:svn*:pn*:pvr*
 KEYBOARD_KEY_01=41     # Remap Tilde to Esc
 KEYBOARD_KEY_29=01     # Remap Esc to Tilde (evtest showed "1" but when I put that without the leading zero, it was interpreted as the literal [1] key.)
 KEYBOARD_KEY_3A=29     # Remap Caps to LCtrl
 KEYBOARD_KEY_1D=58     # Remap LCtrl to Caps
 KEYBOARD_KEY_0E=43     # Remap Backspace to Backslash
 KEYBOARD_KEY_2B=14     # Remap Backslash to Backspace

Actualizar: El método anterior funcionó muy bien en mi computadora portátil, pero cuando la conecté, los teclados externos todavía usaban el mapa de teclas predeterminado. Resulta que esto se debe a que el teclado interno se comunica mediante PS/2, que todavía usa los códigos de escaneo AT ( atkbden la cadena del dispositivo), pero el USB es completamente diferente. Terminé teniendo que ejecutar evtest nuevamente para tomar los códigos de escaneo de una placa USB y escribir otro mapa. Aquí está mi archivo resultante:

evdev:atkbd:dmi:*
 KEYBOARD_KEY_01=41
 KEYBOARD_KEY_29=01
 KEYBOARD_KEY_3A=29
 KEYBOARD_KEY_1D=58
 KEYBOARD_KEY_0E=43
 KEYBOARD_KEY_2B=14

evdev:input:b0003v*
 KEYBOARD_KEY_70029=41
 KEYBOARD_KEY_70035=01
 KEYBOARD_KEY_70039=29
 KEYBOARD_KEY_700e0=58
 KEYBOARD_KEY_7002a=43
 KEYBOARD_KEY_70031=14

información relacionada