-.Índice.-

-.Consideraciones iniciales.-

En este capítulo vamos a aprender a usar módulos externos en fvwm. Fvwm viene de serie con una colección de módulos, sobre los cuales se podría escribir un libro aparte. Aparte de la inmensa funcionalidad de fvwm en si, su extensibilidad a base de módulos y scripts externos lo hace uno de los wm más versátiles que existen, si no el que más.

Más concretamente, vamos a conocer el funcionamiento de FvwmIconMan. Así se llama este módulo que nos vana servir para construir una barra de tareas. Seguro que más de uno ya la ha echado en falta. El que no esté interesado en estos menesteres, puede saltarse el capítulo, aunque aún así, recomendaría su lectura para ir asimilando cómo funcionan los módulos en fvwm. En realidad, todos se usan de forma análoga.

Nuestro archivo de configuración comienza a ser grande, así que ya no lo pondré completo en cada ejemplo. Simplemente, iré describiendo los añadidos o cambios a realizar.

-.FvwmIconMan: La barra de tareas.-

FvwmIconMan es un módulo externo, aunque viene en el mismo paquete que fvwm. Está basado en el gestor de tareas de TWM, del que proviene fvwm en primera instancia, y la inmensa mayoría de gestores de ventanas usados en Linux y otros clones de UNIX por derivación. FvwmIconMan es muy configurable, pero mejor lo comprobamos sobre la marcha. Abre tu configuración en el editor de texto. Vamos a añadir unas líneas de configuración para el módulo FvwmIconMan:

# FvwmIconMan: barra de tareas

DestroyModuleConfig MyTaskbar: *
*MyTaskbar: Resolution global
*MyTaskbar: ManagerGeometry 1600x1-0+0

Además, añadiremos esto a StartFunction:

+ I Module FvwmIconMan MyTaskbar

Ahora reiniciamos y deberiamos ver esto:

Aspecto de zFvwmIconMan

El aspecto no resulta muy atrayente, poco a poco iremos cambiando eso. Pero primero, voy a explicar un poco el código de arriba.

En fvwm, los módulos se cargan y configuran usando alias. Por ejemplo, el alias "MyTaskbar" es un nombre concreto que le hemos puesto a una instancia concreta del módulo FvwmIconMan. Podemos tener varios FvwmIconMan, cada uno con un nombre. Para configurar un módulo, primero lo destruímos, de forma similar a como hacemos con las funciones. Con esto nos aseguramos de que se comienza desde cero, con limpieza. Tras el comando DestroyModuleConfig, comenzamos a mandar opciones de configuración a MyTaskbar. El alias que escojamos no tiene importancia, podríamos usar cualquier otro nombre en lugar de MyTaskbar. Mucha gente incluso usa FvwmIconMan como alias (que es el mismo nombre del módulo). Si bien ésto no tiene efecto negativo alguno en lo que a fvwm se refiere, si que produce muchas veces concepciones erróneas y da lugar a confusión.

Un módulo se carga usando la palabra clave "Module", su sintaxis es muy sencilla:

Module Nombre_Módulo Alias

Al cargarse, damos el nombre del alias, y el módulo registra nuestra config en busca de líneas que hagan referencia a dicho alias (y a ningún otro). Es por esto que es posible tener varios FvwmIconMan con configuraciones distintas. En el caso de arriba, hemos añadido la línea a StartFunction (y por eso le hemos puesto "+ I" delante, para que se agregue a la función), y le hemos dado el alias "MyTaskbar". Por tanto, todas las líneas que se encuentren en la configuración referidas a MyTaskbar serán tenidas en cuenta.

Las opciones disponibles para cada módulo se pueden consultar en su página de manual, en este caso: "man FvwmIconMan". Cada módulo tiene una página man propia. FvwmIconMan tiene montones de opciones, por lo que no es viable describirlas todas aquí, así que solo comentaré las que vayan apareciendo por las exigencias del tutorial.

En el ejemplo de arriba hemos usado la opción "Resolution", que se refiere al alcance que tendrá la "vista" de MyTaskbar. "global" le da acceso a todas las aplicaciones. Por defecto, FvwmIconMan solo vería las aplicaciones que estén (al menos parcialmente) en la página actual. Si es ese el comportamiento que prefieres, entonces elimina dicha línea.

La línea de ManagerGeometry nos da las dimensiones de MyTaskbar. En mi caso, 1600 píxeles y una fila de botones. "+0-0" quiere decir, pegado al margen izquierdo, y al fondo de la pantalla. Para poner MyTaskbar arriba, usaríamos "+0+0".

-.FvwmIconMan: Afinando un poco.-

Ya tenemos barra de tareas, pero como podremos ver, no es muy estilizada, y tiene unos cuantos problemas que la hacen poco útil.

A éstas altura, ya habrás notado que el escritorio en fvwm es más grande que la pantalla. Al mover el ratón cerca del borde de la pantalla, pasamos a otra página. Por defecto, el escritorio de fvwm está compuesto por una matriz de 3x3 páginas. En cada página podemos tener abierto uno o varios programas. El gran problema es que, si MyTaskbar se abre en una página, no es visible en las otras. Podriamos lanzar un FvwmIconMan en cada página, pero eso sería un gasto inútil de memoria si todos los taskbar van a ser iguales.

Fvwm tiene un comando que nos va a servir para solucionar esto, y es el comando "Style". Style se usa para asignar cualidades especiales a las ventanas. Y, a fin de cuentas, el módulo FvwmIconMan, se carga en una ventana como otra cualquiera. En ese sentido, no es distinto de xterm o cualquier otro programa.

Style puede asignar montones de propiedades distintas (o quitarlas). Vamos a asignarle las siguientes propiedades a nuestro FvwmIconMan:

# Estilos
Style FvwmIconMan BorderWidth 0, HandleWidth 0, !Title, Sticky

En una sola línea hemos asignado varios estilos, a saber:

BorderWidth 0, hace que el grosor de los bordes de la ventana sea cero, es decir, elimina los bordes.

HandleWidth 0, elimina las asas de los bordes de las ventanas. Las asas son las partes en forma de ángulo recto que hay en cada esquina, y que están visiblemente separadas del resto del borde de la ventana.

!Title significa "No Title". En fvwm negamos un estilo anteponiéndole un signo de exclamación. El Style "Title" sirve para poner título a una ventana (por defecto está "on" para todas las ventanas). Por tanto, su negativo, "!Title", sirve para quitar la barra de título de una ventana.

Por último, tenemos el estilo "Sticky". Sticky otorga a cualquier ventana la facultad de permanecer en todas las páginas y escritorios al mismo tiempo. A partir de ahora, veremos MyTaskbar en todas las páginas.

Ahora veremos otro pequeño detalle bastante molesto: FvwmIconMan es otra ventana, como ya sabemos. Y FvwmIconMan se dedica a listar ventanas. Como resultado de estas dos afirmaciones, se deduce que FvwmIconMan mostrará a FvwmIconMan. Normalmente, esto no es un efecto deseado, así que tendremos que solucionarlo.

Fvwm mantiene internamente una lista llamada "WindowListSkip". En dicha lista se pueden ir anotando nombres de ventana. Muchos módulos de fvwm, y el mismo fvwm, usan dicha lista como una lista de ventanas a ignorar al realizar ciertas tareas. FvwmIconMan usa dicha lista como una lista de ventanas a ignorar. Es decir, las ventanas que formen parte de dicha lista no serán listadas en FvwmIconMan. Por tanto, con tan solo añadir FvwmIconMan a la lista, conseguiremos que no salga listada en el propio FvwmIconMan. Y eso se consigue añadiendo el Style "WindowListSkip". Retocando la línea de arriba, tenemos:

# Estilos
Style FvwmIconMan BorderWidth 0, HandleWidth 0, !Title, Sticky, WindowListSkip

Una cosa solucionada. El siguiente problema nos lo encontramos si maximizamos una ventana: veremos que parte de la ventana queda oculta bajo MyTaskbar. Adicionalmente, podemos ver que si pulsamos sobre el título de la ventana, fvwm trae la ventana al primer plano. Esto es la acción por defecto. En tal caso, nuestro taskbar queda bajo la ventana y resulta inaccesible.

Para solucionar esto vamos a recurrir al comando EwmhBaseStrut. Éste comando define el área de trabajo. Es decir, el área en el cual se maximizan los programas. Muchos escritorio y wm's ajustan este área a todo el espacio disponible menos la barra de tareas y los paneles. De forma automática. En fvwm lo podemos configurar a mano.

Su uso es según este esquema:

EwmhBaseStruts izquierda derecha arriba abajo

Izquierda, derecha, arriba y abajo son números enteros que nos indican el margen que se deja por cada lado. Así podemos hacer hueco para nuestras barras de tareas, paneles, applets o cualquier cosa que tengamos. O simplemente dejar un margen decorativo si tenemos una pantalla grande y queremos que se vea parte del tapiz en los bordes.

Nuestro problema ahora es que no sabemos la altura que tiene MyTaskbar. Así que primero añadiremos otra línea en la configuración de MyTaskbar para fijar sus dimensiones con más exactitud:

# FvwmIconMan: barra de tareas

DestroyModuleConfig MyTaskbar: *
*MyTaskbar: Resolution global
*MyTaskbar: ManagerGeometry 1600x1-0+0
*MyTaskbar: ButtonGeometry 1x28

La opción nueva es "ButtonGeometry", en nuestro caso la hemos usado para fijar la altura del botón en 28 píxeles. La dimensión en el eje x no es relevante, porque por defecto FvwmIconMan se configura para rellenar todo el espacio disponible. Así que los botones se repartirán el espacio que haya, sin importar dicha dimensión. En cualquier caso, lo importante es que ahora sabemos que MyTaskbar tiene exactamente 28 píxeles de alto. Esto nos permite fijar nuestro EwmhBaseStrut del siguiente modo:

# Área de trabajo
EwmhBaseStruts 0 0 0 28

Y así es como queda una ventana maximizada junto a MyTaskbar al final de todo esto:

Aspecto final de FvwmIconMan

-.Acciones.-

El avance es significativo, sin embargo aún nos queda la parte de la funcionalidad. Por defecto, los botones de dicha barra no se comportan como cabría esperar en un wm moderno. Como con todo, las acciones podrían ser infinitamente complejas, y podemos usar condiciones, funciones y muchas cosas que fvwm pone a nuestro alcance. Pero a nuestro nivel actual, vamos a asignar acciones sencillas que nos ayuden a salir del paso. Lo vamos a solucionar con unas cuantas líneas más de configuración para MyTaskbar.

*MyTaskbar: Action Mouse 1 N sendcommand Iconify
*MyTaskbar: Action Mouse 2 N sendcommand Raise, sendcommand Focus, sendcommand "WarpToWindow 50 50"

La primera línea hace que una aplicación se iconifique (o se des-iconifique, según el caso) al pulsar sobre el botón correspondiente en la barra de tareas con el botón izquierdo del ratón. La segunda es para el botón central, y es una acción compuesta por tres acciones simples. En primer lugar usa el comando "Raise" para levantar la ventana, luego le cede el foco con "Focus". Por último, usa el comando "WarpToWindow 50 50" para mover el puntero del ratón al centro de la ventana escogida. Esto es una forma de moverse rápidamente a una aplicación que está en otra página (si tenemos Resolution configurado a global en nuestra configuración de MyTaskbar). Fíjate en el detalle del último "sendcommand": cuando un comando consta de más de un elemento, es necesario englobarlo con comillas. Los distintos sendcommand van separados por comas.

Con todo esto, MyTaskbar queda así:

# FvwmIconMan: barra de tareas
DestroyModuleConfig MyTaskbar: *
*MyTaskbar: Resolution global
*MyTaskbar: ManagerGeometry 1600x1+0-0
*MyTaskbar: ButtonGeometry 1x28
*MyTaskbar: Action Mouse 1 N sendcommand Iconify
*MyTaskbar: Action Mouse 2 N sendcommand Raise, sendcommand Focus, sendcommand "WarpToWindow 50 50"

Hemos añadido también esto a nuestra configuración:

# Estilos
Style FvwmIconMan BorderWidth 0, HandleWidth 0, !Title, Sticky, WindowListSkip

# Área de trabajo
EwmhBaseStruts 0 0 0 28

Y la línea para cargar el módulo en StartFunction:

+ I Module FvwmIconMan MyTaskbar

El botón derecho del ratón se ha dejado sin acción asignada por ahora, porque más adelante lo usaremos para abrir un menú al pulsar sobre los botones de MyTaskbar. Según manda la tradición :P Pero para ello, aún tendremos que aprender cómo se define un menú.

-.Navegación.-