domingo, 21 de septiembre de 2008

Haciendo mapping de teclas (teclado y control remoto)

Muchas veces nos hemos encontrado con que nuestro teclado posee 200 teclas y el sistema solo "reconoce" 105, es decir, tenemos menos teclas mapeadas que las deseadas.

Partamos por lo teórico, una tecla posee un identificador único que es capturado por el kernel, este identificador (raw scan code) hasta este punto no nos sirve de nada. Debemos asignar un keycode libre a este raw scan code, con ello ya podemos utilizar cualquier aplicación que permita asignar teclas a una función. En este punto la tecla que posee un keycode puede ser "leída" por las aplicaciones del sistema.

Con lo teórico sobre la mesa, pasamos a lo práctico, en este punto sólo consideraremos las teclas que no responden ante nada (teclas que solo envían raw scan code al kernel).

  1. Determinando el raw code:
    1. necesitamos abrir una consola y ejecutar como root:
      tail /var/log/messages -f

    2. una vez que la consola deje de arrojar datos debemos presionar la tecla (del teclado o control remoto) que no hace nada. En la consola debería aparecer algo como ésto:
      atkbd.c: Unknown key released (translated set 2, code 0x96 on isa0060/serio0).
      atkbd.c: Use 'setkeycodes e016 ' to make it known.
    3. Una vez que tenemos el raw scan code (e016 en el ejemplo) debemos asignarles un keycode libre. Para ello debemos ingresar en el archivo /etc/rc.local lo siguiente (e016 es el raw scan code y 150 es el keycode obtenido de pasar 16 de hexadecimal a decimal y sumando 128).
      setkeycodes e016 150
    4. Esto permitirá que cada vez que el sistema bootee se asocie el keycode con el raw.
  2. Haciendo el mapping:
    1. Ahora que las teclas ya son legibles para el sistema debemos asignarles alguna función. Necesitamos crear en nuestro home un archivo llamado .Xmodmap en que asociamos el keycode con una función. Tiene la siguiente forma
      keycode 222 = XF86PowerOff
      keycode 223 = XF86Sleep
      keycode 236 = XF86Mail
    2. Puedes obtener una lista completa de funciones desde este archivo: /usr/share/X11/XKeysymDB
    3. Luego debemos hacer que se cargue este nuevo mapping, para ello debemos agregar ésta línea al fichero .xsession
      /usr/bin/xmodmap $HOME/.Xmodmap
    4. Con esto, cada vez que cargue nuestra sesión X se cargará el mapping que acabamos de configurar.

No hay comentarios: