Herramientas personales

Emular Teclas Multimedia

De Proyectos GULIX

Tabla de contenidos

Emulando las Teclas Multimedia

De seguro has visto esas maravillas de teclado con "Teclas Multimedia": teclas para gestión de players como "rewind" («), "forward" (»), "play" (>), "stop", o teclas de acceso a internet o correo electrónico. La gracia de estas teclas es que el sistema operativo, "usualmente" Windows, no las interpreta como teclas propiamente tales sino como una secuencia de comandos asociadas al Registro de Windows, que lanza la aplicación seleccionada de la lista de "aplicaciones preferidas".

En Linux, es fácil dar este mismo comportamiento a nuestras teclas multimedia, provisto que tengamos instaladas las utilidades xev (para examinar las secuencias de teclado), xmodmap (para modificar los símbolos asociados a cada tecla), y loadkeys o similar. Pero, la pregunta es, ¿será posible emular esas teclas en un teclado que no las tiene, como un estandr PC105? En este artículo, su servidor les va a explicar sus experiencias al respecto para que Uds. puedan "fingir" teclas multimedia y así configurar accesos globales a sus gestores multimedia sean éstos XMMS, Amarok, Kaffeine o similar.

Prerequisitos

Para poder ejecutar estos pasos, necesitas al menos cumplir con las siguientes condiciones:

  • Tener un conocimiento básico de edición de archivos de configuración, como el formato de .Xmodmap y el formato de .Xcompose.
  • Tener instaladas las aplicaciones citadas anteriormente: xev, xmodmap, y posiblemente loadkeys. Búscalas en tu Fiel Vecino el Gestor de Paquetes bajo nombres como "xbk", "xev", "console-tools" o similar.
  • Tener un teclado sin teclas multimedia (sino para qué vamos a emular), del cual debes conocer su configuración o modelo (si estás acá en Chile, de seguro es un PC105) y el idioma con el que está trabajando (de seguro español). Para obtener esta información usa el editor de configuración de teclado en tu escritorio GNOME o KDE.
  • Tener instalada alguna aplicación (idealmente multimedia) que permita configurar atajos de teclado globales, es decir, que serán interpretados por el programa sin importar que esté minimizado o fuera de foco. Algunos ejemplos: XMMS (con el plugins adecuado), Amarok, el panel de control de XFCE.

Proceso de Configuración

Esta sección está en progreso

Paso 1: Seleccionando las "Teclas Multimedia" y sus Impostoras

Los símbolos de teclas (keysym) asociados a eventos de teclas multimedia, en el servidor X, están configurados bajo los siguientes nombres:

XF86AudioPrev
XF86AudioPlay
XF86AudioStop
XF86AudioNext

(hay otros, que no me acuerdo)

Tip: Busca el archivo keysyms.h en las cabeceras de tu sistema para acceder a todos los nombres que conoce el servidor X.

Cada uno de estos corresponde a un botón el cual en muchos programas multimedia está asociado a un atajo de teclado usando la fila inferior de letras (la 2º desde abajo): en este orden:

Evento Keysym Atajo de Teclado
Anterior XF86AudioPrev Z (Winamp: Z)
Reproducir XF86AudioPlay X
Pausa ¿? C
Detener XF86AudioStop V
Siguiente XF86AudioNext B (Winamp: B)

Así que usaremos las teclas Z, X, C, V, B, para emular nuestras teclas multimedia. ¿Cómo hacerlo sin interrumpir su normal funcionamiento? No podemos asignar atajos globales usando teclas modificadoras como Shift y Control, porque estas están ya pedidas en muchos sistemas y aplicaciones (CTRL-C=Copy, CTRL-V=Paste, etc...). ¿Solución? Pues usar una de dos teclas que casi nunca se usa en conjunto con las alfabéticas: Escape o AltGr.

La idea es usar uno de dos métodos de activación:

  • Activar como un combo: podemos usar "Escape" como tecla de Compose, en cuyo caso creamos un combo de tres teclas usando Escape + cierta tecla + Atajo, donde "cierta tecla" tiene que ser una tecla fácil de alcanzar y que no interrumpa el funcionamiento de otros combos de Compose. Por ejemplo, la tecla de ordinal (º, shift:ª) ubicada sobre TAB y a la izquierda de 1.
  • Activar como modificador: Otra opción es simplemente usar AltGr ya que en la mayoría de los sistemas otorga un modificador diferente que Ctrl y Shift. El problema es que AltGr en muchos Linux está configurado como alternador de tercer nivel (keysym: ISO_Level3_Shift), por lo que si usamos AltGr para "activar" nuestro combo (ej.: "AltGr + Z = XF86AudioPrev"), tendremos que pulsar de vuelta AltGr o la tecla de Compose para volver al teclado normal.

En la siguiente sección veremos cómo deshacernos de estos problemas simplemente combinando adecuadamente los ficheros de configuración de eventos del teclado .Xmodmap y .XCompose.

Paso 2: Capturando y Reconfigurando la Distribución de Teclado

Bien, pues, abramos una terminal gráfica (xterm o similar) y ejecutemos xev. De inmediato se abre una ventana la cual nos muestra los símbolos d eteclado, códigos y eventos asignados a cada tecla que pulsemos hasta que cerremos la aplicación. Pulsemos las teclas Z, AltGr+Z, X, AltGr+X, C, AltGr+C y así sucesivamente y tomemos nota de los valores keycode y keysym que nos entrega cada pulsación. Tomemos nota además del valor obtenido al pulsar AltGr y también alguna tecla "desocupada" en nuestro Linux si es que hay teclas desocupadas, como las teclas Windows o la tecla Menu, o la combinación Shift+Escape.

Yo he obtenido los valores siguientes:

Shift+Esc keycode 09 keysym 0xff20 ("Multi_key")
AltGr keycode 113 keysym 0xff7e ("ISO_Level3_Switch")
Z keycode 52 keysym 0x7a (z)
AltGr+Z keycode 52 keysym 0xab ("guillermoleft")
X keycode 53 keysym 0x78 (x)
AltGr+X keycode 53 keysym 0xbb ("guillermoright")
C keycode 54 keysym 0x63 (c)
AltGr+C keycode 54 keysym 0xa2 (¢)
V keycode 55 keysym 0x76 (v)
AltGr+V keycode 55 keysym 0x76 (v)
B keycode 56 keysym 0x62 (b)
AltGr+B keycode 56 keysym 0x62 (b)

Ya que tenemos esto, cerremos xev (necesitaremos hacerlo con el botón [X] de la barra de título). Guardemos la configuración actual de los modificadores y accesos de teclado con el siguiente comando:

xmodmap -xe > .Xteclado

Haz un backup del archivo, llámalo por ejemplo .Xteclado.backup en caso de emergencias. Y protégelo contra escritura incluso de tí mismo haciéndole un chmod -w .Xteclado.backup, sólo por si acaso.

Editando Nuestro Fichero de Teclado

Esto nos da un archivo .Xteclado con la configuración de teclado que tiene el servidor X, una línea por símbolo con el formato:

keycode XXX = símbolo1 shift+símbolo1 símbolo2 shift+símbolo2 ...

Como ejemplo, revisemos la línea correspondiente al keysym de la tecla Z, es decir, según la tabla anterior:

keycode  52 = z Z guillemotleft less guillemotleft less

¿Qué nos dice esto? Después del símbolo igual, se agrupan los keysyms a generar por pares, cada par compuesto por la tecla normal seguida de la tecla más Shift. El primer par es la tecla sola, es decir, presionando solamente Z o Shift+Z. El segundo par es asignado al "segundo modificador", el tercer par al "tercer modificador" y así sucesivamente, hasta el sexto par (octavo par en las X más recientes). La clave está entonces en cambiar uno de los pares de modo que su tecla "normal" o "shift" sean el keysym de la tecla Multimedia que buscamos, ejemplo, XF86AudioPrev.

Modifiquemos la línea para que lea de la siguiente forma:

keycode  52 = z Z XF86AudioPrev NoSymbol guillemotleft less

Tip: no te procupes por los símbolos que reemplazas. No los vas a extrañar, o en caso que sí lo hagas, vas a poder alcanzarlos con la tecla designada como Compose (que es "Shift+Escape" por defecto). ¡Es por eso que tienes que conocer algo de las configuraciones de XCompose!

Hacemos lo mismo para los keycodes 53, 54, 55, 56 que corresponden a las teclas físicas X, C, V, B. Para el segundo par dejamos una tecla como la tecla multimedia XF86Audio???? y la otra como el valor especial NoSymbol. Guardemos el archivo, pero sin cerrar, ya que aún debemos editar algunas cosas.

Cambiando el Valor de Compose y AltGr

¿Me siguen todavía? La parte que viene es un poco compleja.

Como les iba diciendo, por defecto en muchos Linux AltGr es un modificador de tercer nivel, o un "alternador" de distribución de teclado. Se usa cuando quieres cambiar de distribución de teclado al vuelo, por ejemplo de nuestro clásico "Español" a un bizarro "Thailandés". Supongo que no necesitas eso... La gracia es modificar ese comportamiento para que se parezca más a... er.... "Güindous". Para esto en vez del comando de "alternador de nivel", la reasignaremos como "alternador de modo", un concepto que es parecido pero no igual.

Vamos a buscar la línea que corresponde al keycode de AltGr que hemos obtenido, y la modificaremos de la siguiente manera:

      (dice) keycode 113 = ISO_Level3_Shift
(debe decir) keycode  52 = Mode_switch

Además, debemos buscar una línea que contenga el valor Muti_key y copiarla al keycode de la tecla Shift+Escape (usualmente keycode 9), ya que necesitaremos esa tecla para alcanzar las combinaciones que hemos reemplazado. El mío ha quedado así:

keycode 9 = Escape Multi_key
keycode 116 = Multi_key

(la tecla con código 116 es la tecla Windows Derecho en mi teclado, el tuyo puede cambiar)

A continuación, procedemos al final del archivo en donde están las banderas modificadoras. Éstad definen el comportamiento de los modificadores de teclado bajo el servidor X, los cuales son los conocidos BloqNum, CapsLock, Shift y Alt, además de algunos menos conocidos como Meta, Super, Hyper, Multi, etc...

Si alguna de esas modificadoras tiene el valor ISO_Level3_Shift o Mode_switch, la borramos y reasignamos el modificador agregando dos líneas como sigue:

clear      mod5
add        mod5 = Mode_switch

(esto, suponiendo que "add mod5" tenía antes asignado ISO_Level3_Shift)

Listos los cambios, procedemos a guardar el archivo cuidando que quede con formatos de línea UNIX.

Paso 3: Probando los nuevos Atajos de Teclado

Abre otra ventana de la terminal gráfica (ojo, ventana no pestaña). Vamos a proceder a probar las modificaciones que hemos hecho. Toma nota que a este punto si has cometido algún error, puedes quedarte sin teclado bajo la interfaz gráfica por lo cual para revertir los cambios necesitarás una terminal terminal (es decir, CTRL+ALT+F[1..12]).

Ya en esta ventana simplemente ejecuta xmodmap pidiéndole que cambie nuestras nueva configuración de teclado:

xmodmap .Xteclado

Si no hay errores (que no debería haberlos), nada sucede y volvemos al prompt del shell. Ejecuta xev, y presiona la combinación AltGr+Z. Deberías ver algo como lo siguiente:

KeyPress event, serial 31, synthetic NO, window 0x4400001,
    root 0x187, subw 0x0, time 865587411, (77,4), root:(254,310),
    state 0x10, keycode 113 (keysym 0xff7e, Mode_switch), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 31, synthetic NO, window 0x4400001,
    root 0x187, subw 0x0, time 865587615, (77,4), root:(254,310),
    state 0x2010, keycode 52 (keysym 0x1008ff16, XF86AudioPrev), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 31, synthetic NO, window 0x4400001,
    root 0x187, subw 0x0, time 865587767, (77,4), root:(254,310),
    state 0x2010, keycode 52 (keysym 0x1008ff16, XF86AudioPrev), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 31, synthetic NO, window 0x4400001,
    root 0x187, subw 0x0, time 865587802, (77,4), root:(254,310),
    state 0x2010, keycode 113 (keysym 0xff7e, Mode_switch), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

MotionNotify event, serial 31, synthetic NO, window 0x4400001,
    root 0x187, subw 0x0, time 865590008, (78,4), root:(255,310),
    state 0x10, is_hint 0, same_screen YES

En orden, esto quiere decir que se han capturado los siguientes eventos:

  1. Se ha presionado el modificador AltGr o "Mode_switch" (y sigue presionado).
  2. Se ha presionado la tecla física "Z", y el servidor X ha recibido la señal de tecla XF86AudioPrev, la cual sigue presionada.
  3. Se ha soltado la tecla física Z", terminando con la emisión de la señal XF86AudioPrev (aquí es cuando las aplicaciones de hecho reciben el "Keypress" o aviso de pulsación).
  4. Se ha soltado el modificador.

Si todo sale bien a este punto, ¡felicidades!, ya tienes un Teclado Multimedia Fake©™®.


Paso 4: Configurando la Aplicación con Atajos Globales

Ahora nos falta usar esta combinación en conjunto con nuestra aplicación multimedia. Esta parte está aún por testear.

Para este ejemplo veremos cómo hacerlo con Beep Media Player corriendo sobre XFCE. El procedimiento sería casi el mismo para programas y entornos similares, como por ejemplo XMMS corriendo sobre GNOME.

Desactivando la Captura de Teclas Multimedia

Lo primero que debes hacer es instalar un plugin para tu reproductor de audio que soporte Global Hotkeys por software, como por ejemplo: xmms-hotkey (que es compatible con Beep-Media-Player). Hasta donde conozco, Amarok no necesita un plugin para esto, pero me falta verificarlo.

Lo segundo que debes hacer es iniciar Beep—Media—Player y chequear en Plugins, General, que los siguientes plugins estén desactivados:

  • XF86Audio Keys Control
  • Multimedia Keys Control

¿Por qué? Porque estos plugins están diseñados para recibir el keycode de la tecla multimedia y no el keysym o evento generado en el servidor X, por tanto si activas estos plugins, "absorberán" las teclas Z, X, C, V, B, y no podrás usarlas normalmente (léase, como letras).

Una ves desactivados los plugins, cierra Beep—Media—Player y vuelve a abrirlo. No, no es talla, esto es como en... "Güindous".

Asignando los Atajos

Lo tercero que debes hacer es asignar en tu gestor de teclado, a nivel de escritorio, los comandos a enviar a tu reproductor multimedia. En mi caso, Beep-Media-Player, al igual que XMMS, acepta opciones de línea de comandos para levar a cabo las funciones de rewind, forward, play y stop, por lo cual vamos a asignar éstas.

  • (Fotos pronto)

Vamos al menú de inicio de XFCE, Configuración, Teclado, y seleccionamos el tab "Atajos de Teclado".

Apretamos el botón de "Agregar" en el panel derecho, lo cual nos muestra un diálogo para que insertemos el comando a enviar. En nuestro caso introducimos: beep-media-player --rew. Al presionar ENTER o clic en Aceptar, un nuevo diálogo nos pide que lancemos el atajo de teclado deseado. Aquí es cuando presionamos nuestra nueva tecla MultimediaFake©™® haciendo AltGr+Z. Al hacer eso, ha de aparecer el siguiente atajo en nuestro listado de atajos de teclado:

beep-media-player --rew                        XF86AudioPrev

Hagamos lo mismo con las otras teclas, asociando los siguientes atajos de teclado:

beep-media-player --rew                        XF86AudioPrev
beep-media-player --play                       XF86AudioPlay
beep-media-player --stop                       XF86AudioStop
beep-media-player --fwd                        Xf86AudioNext

Ahora, salgamos de la configuración de teclado de XFCE y cerremos el reproductor de audio Beep-Media-Player. La próxima vez que volvamos a abrirlo, debería responder a nuestros comandos sin importar en qué ventana estemos lanzando los atajos de teclado.

Detalles a Considerar

El 50% o 60% de las veces este procedimiento funciona bien; sin embargo, bajo ciertas configuraciones del servidor X, del entorno de escritorio y de la aplicación de audio, al hacer este procedimiento, el programa de multimedia en cuestión va a capturar las teclas normales en vez de los comandos con AltGr, volviendo nuestras teclas Z, X, C, V, B, inútiles para otras aplicaciones.

Esto sucede cuando alguna de las aplicaciones involucradas (el entorno de escritorio o la aplicación multimedia) insiste en capturar los eventos por el keycode de la tecla usada en vez de por el keysym que hemos asignado. En otras palabras el servidor X o el entorno de escritorio percibe que para hacer "Play" hemos utilizado la tecla física X en vez de una "tecla fantasma", y trata la información de tal manera que siempre que se presione esa tecla física se va a enviar la señal escogida "Play". Hasta donde he averiguado la única forma de solucionar este inconveniente es simplemente desactivar los atajos de teclado que hemos escogido, y optar por un teclado que tenga teclas multimedia reales (fisicas).

Estoy en proceso de averiguar otra solución que involucre usar un programa que sea capaz de enviar al servidor X keycodes fantasma en modo usuario, aunque hasta el momento no he encontrado ninguno.

Otro detalle a considerar es que los atajos de teclado escogidos sirven para una sola aplicación a la vez, por tanto no es posible tener a la vez el atajo de teclado XF86Play para ejecutar el comando de play en XMMS/Beep—Media—Player y enviar una señal de play a Amarok. Una alternativa sería utilizar un script que detecte cuál player está abierto y enviar la señal adecuada; estoy trabajando igualmente en este problema.


Otros Usos

Con trucos como éste puedes emular cualquier keysym disponible mientras tengas un modificador libre y una tecla poco usada para hacer la combinación. Por ejemplo, los adoradores de Sun podrían usar la combinación AltGr+Fin para enviar la señal de la tecla Stop de Sun, o los amantes de la fila superior del teclado, podrían registrar la combinación AltGr+F[1..9] para crear las teclas de función F21 a F29. Podrías registrar CTRL+Enter (AltGr+Enter al parecer no funciona) como el símbolo especial Linefeed, de modo que al presionarlo bajas a la línea siguiente (LF = Linefeed) sin marcar un fin de línea (CR+LF = Return), ¡útil para editar scripts y archivos en editores DOS!

Con este mismo truco puedes cambiar el significado de las Teclas Windows convirtiéndolas en modificadores (o sea, por ejemplo, Windows+F te abre Firefox) o en teclas estándar (por ejemplo, Windows te abre el menú de GNome). Pero eso ya lo debes haber pillado en Google.

Llegado el caso, podrías exportar a modo de broma un script a un compañero de máquina que se ejecute en su inicio gráfico y que le desactive todos los acentos de las teclas muertas cambiándoselos por acentos gráficos, de modo que en vez de escribir "á" va a recibir en su consola "'a". A ver cómo sale de esa.

Créditos

--Ryan.chappelle 23:04 31 dic 2007 (ART)

Obtenido íntegramente de mi experiencia propia. Crédito a varios según corresponde. Cualquier parecido con experiencias similares posteadas en inet es coincidencia, accidente, o a lo sumo inspiración, nunca plagio.

Leer más


Buscar