Multimedia Keys

Centurion, mi nueva máquina Athlon 64 X2 no está lista y probablemente no lo esté hasta que compre mi nuevo DVD y mi nueva quemadora de DVDs de doble capa. La definición de “lista” es que le tome una foto de conjunto, y no voy a hacer eso si las unidades ópticas no son negras (se ven feas de color cremita).

Independientemente de ello, hay avances. Hoy por ejemplo corregí un problema (que no sabía que tenía), que hacía que la máquina se trabara (hard way) cada vez que conectaba mi cámara digital. Lo primero que pensé fue “pinche Linux”, porque ya había conectado otros dispositivos USB sin broncas; pero resultó que es la placa madre. Si no desactivo una opción rara en el BIOS que permite tener teclado y discos duros USB visibles al tiempo de booteo, la cosa se traba feo. Traba traba: incluso el BIOS se traba.

Muy raro.

El problema lo descubrí cuando quise bajar a Centurion las fotos de mis nuevos teclado y ratón Genius. El teclado es un Genius ErgoMedia 700, que me costó la fabulosa cantidad de 261 pesos:

Teclado Genius ErgoMedia 700

Teclado Genius ErgoMedia 700

El ratón es un vil Genius NetScroll, con la particularidad de que es negro (y por tanto se ve bonito):

Ratón Genius NetScroll Negro

Ratón Genius NetScroll Negro

Me costó $31.50. Con IVA.

El ratón lo conecté y jaló, como suelen hacer los fieles ratones. El teclado ídem, excepto las teclas de multimedia. Por supuesto.

Yo ya sabía que con las teclas multimedia habría broncas; mientras que los teclados de 101 a 105 teclas están comlpetamente estandarizados (al menos en los idiomas que usan el alfabeto latino), las teclas 106 a whatever no. Al contrario; cada fabricante define los teclazos (que terminan siendo un vil número para el sistema operativo) como se les da la regalada gana. En Windows esto no es un problema: los teclados vienen con un CD que configura todo para el usuario; pero para nosotros Linuxeros es “a ver cómo le hacen”.

No me costó encontrar con la solución (contrario a lo algunos piensan, soy muy bueno buscando cuando lo que busco de hecho me importa). La bronca fue llevarla a cabo; no es difícil, nada más es bastante talachudo.

Las páginas que más me ayudaron fueron Logitech Cordless Desktop LX700 en Living with Linux, y HOWTO Use Multimedia Keys en el Gentoo Wiki, aunque aquí pondré un resumen.

La idea es sencilla: por cada teclazo, el teclado envía al sistema un número. Aquí hay dos sopas: que el sistema operativo reconozca el número, o que no. Si sí lo reconoce, se lo pasa a X, que lo interpreta como otro número, y de nuevo puede ocurrir que X reconozca este nuevo número, o que no. Si lo reconoce, otra vez hay de dos sopas: que lo reconozca bien (donde “bien” está definido como “lo que yo quiero que reconozca”), o que lo reconozca mal.

Para todas las posiblidades en donde algo puede salir mal, hay modo de corregirlo. La primera es que el kernel no reconozca el teclazo: en tal caso enviará un mensaje (que se puede ver con dmesg o en /var/log/messages), que dice algo de este estilo:

Jan 20 18:24:44 centurion atkbd.c: Unknown key pressed (translated set 2, code 0xbb on isa0060/serio0).
Jan 20 18:24:44 centurion atkbd.c: Use 'setkeycodes e03b <keycode>' to make it known.

Bastante claro, ¿no? Hay que correr setkeycodes como dice el mensaje, y asignarle un keycode a la tecla en cuestión. Para ver qué keycodes hay disponibles, uno corre (¡surprise!) getkeycodes:

Plain scancodes xx (hex) versus keycodes (dec)
for 1-83 (0x01-0x53) scancode equals keycode

0x50: 80 81 82 83 99 0 86 87
0x58: 88 117 0 0 95 183 184 185
0x60: 0 0 0 0 0 0 0 0
0x68: 0 0 0 0 0 0 0 0
0x70: 93 0 0 89 0 0 85 91
0x78: 90 92 0 94 0 124 121 0

Escaped scancodes e0 xx (hex)

e0 00: 0 0 0 0 0 0 0 0
e0 08: 0 0 0 0 0 0 0 0
e0 10: 165 230 231 232 233 0 234 0
e0 18: 235 163 0 0 96 97 236 237
e0 20: 113 140 164 238 166 239 200 0
e0 28: 0 0 255 0 0 0 114 201
e0 30: 115 202 150 0 0 98 255 99
e0 38: 100 0 0 203 0 204 0 205
e0 40: 0 0 206 207 0 119 119 102
e0 48: 103 104 0 105 112 106 118 107
e0 50: 108 109 110 111 0 0 0 0
e0 58: 0 208 0 125 126 127 116 142
e0 60: 0 0 0 143 0 217 156 173
e0 68: 128 159 158 157 155 226 0 112
e0 70: 0 0 0 0 0 0 0 0
e0 78: 0 0 0 0 0 0 0 0

Los ceros muestran keycodes disponibles.

Así que con todas las teclas multimedia de mi teclado (que como pueden ver en la foto son un chingo), tuve que estar como taradito picándolas y viendo en mis logs qué número tenía que pasarle a setkeycodes. Ese es el primer paso; superado eso, el kernel ya reconoce a todas las teclas. Ahora sólo hay que hacer que X las reconozca, y que las reconozca bien.

Para esto uno corre xev, y presiona la tecla que uno quiere que X reconozca. El programa escupe algo como:

KeyPress event, serial 26, synthetic NO, window 0x4000001,
root 0xb5, subw 0x0, time 3304354, (464,-439), root:(655,339),
state 0x10, keycode 169 (keysym 0x1008ff8b, XF86ZoomIn), same_screen YES,
XLookupString gives 0 bytes:
XmbLookupString gives 0 bytes:
XFilterEvent returns: False

La línea que nos interesa es la tercera: ahí nos dice qué keycode genera la tecla (que no necesariamente es el mismo que el que pasamos a setkeycodes), y además que keysym tiene asignado. Si no tiene ningún keysim asignado, dirá que tiene el 0x0. Uno debe ver en primer lugar si tiene keysim asignado, y si sí tiene ver que sea el “correcto” (o sea, el que uno quiere). Los keysyms están definidos en /usr/lib/X11/XKeysymDB, y ya hay bastantes para teclas multimedia.

Para que la tecla con keycode 164 (por ejemplo), se le asigne el keysym “XF86AudioStop” (que Rhythmbox utiliza para hacer stop), uno le pasa:

keycode 164 = XF86AudioStop

a xmodmap. Esto puede hacerse con la opción -e, o usando un archivo; vean la página de xmodmap si les interesa. Y hay que hacer eso para todas las teclas. Eso me llevó un rato.

Para automatizar el proceso, hice un script que define las keycodes y lo aventé en /etc/init.d, para que se llame antes de que inicie X. Los comandos para xmodmap los puse en un archivo .Xmodmap en mi $HOME, y configuré gconf para que los cargue automágicamente al iniciar mi sesión:

Configuración de gconf

Configuración de gconf

Después de todo eso, lo que hemos conseguido es que a las teclas las vean el kernel y X; pero aún no hemos asignado nada interesante a dichas teclas. Para eso yo usé dos cosas: los shortcuts de GNOME (en el menú Desktop/Preferences/Keyboard Shortcurs), y los keybindings de Metacity (configurables en gconf usando las llaves /apps/metacity/global_keybindings).

Fue un desmadre. Pero quedó muy chido; la bronca es que entre GNOME y Metacity no me permiten asignar todas las teclas que tengo. Usando las teclas multimedia controlo Rhythmbox sin problemas (y sin que tenga que tener el foco en la aplicación), y también el volumen. También tengo un montón de aplicaciones que las lanzo con las teclas multimedia: Gaim, Nautilus, The GIMP, Firefox y Evolution. Pero varias teclas que ya están bien definidas, no sirven: por ejemplo, tengo teclas de “Back”, “Forward”, “Stop” y “Refresh” para controlar el navegador; pero Firefox decide ignorarlas. Y la verdad no uso tanto esos comandos, pero sería chido que Firefox les hiciera caso. Y tengo en total seis teclas todavía que me servirían para lanzar aplicaciones: la bronca es que Metacity sólo tiene 10 run_command personalizables, y ya ocupé todos.

Pero a pesar de esas limitaciones, está muy chido. Especialmente el poder controlar Rhythmbox desde cualquiera de mis nueve escritorios, así como el volumen.

Imprimir entrada Imprimir entrada

2 comentarios sobre “Multimedia Keys

  1. Excelente! Justamente yo tengo el mismo teclado y sufro el mismo problema que tenías :)

    Tengo unas preguntas:

    – Con respecto al setkeycodes: hay que ponerlo en algún script para que siempre lo tome? en dónde conviene ponerlo?

    – Tienes idea cómo configurar la ruedita de la izquierda para que se comporte exactamente igual a la ruedita del ratón.

    Gracias por tus comentarios,
    Toshiro.

  2. Yo puse el script en /etc/init.d, y lo añadí al sistema de scripts de inicialización de Gentoo. Puedes hacer lo mismo, pero es distinto para cada distribución.

    La ruedita de la izquierda no tengo ni idea de cómo hacer que jale como el ratón. Yo la tengo para que funcione como “Page Down” y “Page Up”.

Responder a toshiro Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *