-.Índice.-
- Consideraciones iniciales
- Menú sencillo.
- Menú de ventana.
- Decorando el menú.
- Decorando el menú de alt+tab.
-.Consideraciones iniciales.-
Los menús son un elemento típico en la mayoría de los gestores de ventanas basados en el uso del ratón. Nos permiten acceder de forma gráfica a las funciones del gestor de ventanas y a nuestras aplicaciones. En fvwm se puede hacer todo esto, y mucho más. Los menús en fvwm se pueden usar para contener casi cualquier cosa imaginable, incluso información. Se pueden generar de forma dinámica a partir de los archivos de un directorio permitiéndonos usar el menú a modo de explorador, o incluso para gestionar nuestros tapices de escritorio, pero eso sería empezar la casa por el tejado ;)
-.Menu sencillo.-
Recordarás que ya hemos trabajado con un menú. El menú predeterminado de fvwm. Incluso definimos un atajo de teclado para poder abrirlo sin usar el ratón:
Key F1 A M Menu MenuFvwmRoot
Dicho menú viene predefinido con nuestro fvwm. Es por eso que no hemos tenido que crearlo a mano, como el resto de nuestra configuración para fvwm. Pero es bastante limitado, así que vamos a cambiarlo un poco. Los menús, al igual que las funciones, se deben destruir primero, antes de añadir más elementos. Porque si no, nuestros elementos nuevos se añadirían a los ya existentes:
# MenuFvwmRoot
DestroyMenu MenuFvwmRoot
AddToMenu MenuFvwmRoot
+ "Urxvt" Exec urxvtc
+ "FvwmConsole" Module FvwmConsole -terminal urxvtc
+ "Reiniciar" Restart
+ "Salir" Quit
Este menú es muy básico, está basado en el menú de fvwm. Solo que hemos eliminado cosas inútiles, y hemos cambiado otras. Las líneas se definen de forma sencilla. Primero destruimos el menú, limpieza. Luego comenzamos a añadir cosas. En cada línea hay dos partes principales: la etiqueta, y la acción. La etiqueta es lo que vamos a ver cuando abramos el menú, y va entre comillas. El resto de la línea es la acción a ejecutar si pulsamos sobre ese elemento del menú.
En mi caso, he sustituido xterm por urxvtc, que es mi terminal preferido, cada uno puede poner el suyo propio. También se pueden usar opciones. Por ejemplo, quién use urxvtc y quiera terminales transparentes puede usar esta línea en lugar de la de arriba:
+ "Urxvt" Exec urxvtc -tr
FvwmConsole es lo que en el menú original aparece como "Issue fvwm commands". Es un terminal especial que nos permite mandar directamente comandos a fvwm. Ya hablaré sobre él más adelante.
Al final he añadido las opciones para reiniciar fvwm y salir de fvwm. Nuestro menú tiene por ahora cuatro opciones.
Ahora vamos a hacer un submenú:
# MenuFvwmRoot
DestroyMenu MenuFvwmRoot
AddToMenu MenuFvwmRoot
+ "Aplicaciones" Popup MenuFvwmApps
+ Nop
+ "Urxvt" Exec urxvtc
+ "FvwmConsole" Module FvwmConsole -terminal urxvtc
+ "Reiniciar" Restart
+ "Salir" Quit
DestroyMenu MenuFvwmApps
AddToMenu MenuFvwmApps
+ "Firefox" Exec firefox
+ "Sylpheed" Exec sylpheed
+ "Kate" Exec kate
Encuentro la forma de definir los menús en fvwm bastante intuitiva. Como se puede ver, lo que hacemos aquí es definir otro menú llamado "MenuFvwmApps" (el nombre es lo de menos, se puede usar cualquier otro). Luego, anidamos nuestro nuevo menú en el anterior, añadiendo una línea con el comando "Popup". Dicho comando hace que al navegar sobre el elemento en cuestión, se muestre el menú especificado como si fuera un submenú del mismo. Como se puede ver, no hay diferencia entre menús y submenús. Un submenú es simplemente un menú normal que se añade dentro de otro menú normal usando el comando Popup. Una forma muy gráfica de verlo sería anidar el menú principal dentro de si mismo, por ejemplo:
# MenuFvwmRoot
DestroyMenu MenuFvwmRoot
AddToMenu MenuFvwmRoot
+ "Aplicaciones" Popup MenuFvwmApps
+ "Menú principal" Popup MenuFvwmRoot
+ Nop
+ "Urxvt" Exec urxvtc
+ "FvwmConsole" Module FvwmConsole -terminal urxvtc
+ "Reiniciar" Restart
+ "Salir" Quit
DestroyMenu MenuFvwmApps
AddToMenu MenuFvwmApps
+ "Firefox" Exec firefox
+ "Sylpheed" Exec sylpheed
+ "Kate" Exec kate
A modo de anécdota, podemos ver como el menú principal se anida dentro de sí mismo. Fvwm es capaz de manejar dicha situación perfectamente sin problema alguno, como podemos ver en la foto de turno:
Tras la comprobación, podemos borrar la línea Popup para FvwmMenuRoot.
Hemos añadido también una línea de separación entre el primer elemento y los demás. En un menú dado, podemos insertar un separador usando "+ Nop". Con estos conceptos tan básicos, ya podemos comenzar a poblar nuestros menús con las aplicaciones que más usemos, haciendo aún más funcional nuestro escritorio.
-.Menu de ventana.-
La mayoría de los gestores de ventanas ofrecen además un menú para controlar el comportamiento de las ventanas. Fvwm puede hacer más cosas con las ventanas que ningún otro wm, por tanto, parece lógico que también debería ofrecer un modo de gestionar las ventanas vía menú. Pues allá vamos:
DestroyMenu MenuFvwmWindowOps
AddToMenu MenuFvwmWindowOps
+ "Cerrar" Close
+ "Destruir" Destroy
+ "Maximizar" Maximize
+ "Minimizar" Iconify
Mouse 3 TI N Menu MenuFvwmWindowOps
El menú es poco sorprendente, a estas alturas. El atajo de ratón se define con el botón 3 (el derecho). Como contextos usa la barra de título y el icono (puede resultar conveniente, ¿no?). De modificador "none", y la acción es "Menu MenuFvwmWindowOps". Y la pregunta del millón es la siguiente: ¿por qué no hemos usado "Popup" igual que antes?
La respuesta es sencilla. Podríamos haberlo usado, pero con Popup, el menú se cierra automáticamente al soltar el botón del ratón. Mientras que con "Menu", el menú queda abierto, esperando al siguiente click. En realidad es una cuestión de preferencia. A quién le resulte más cómodo abrir con un click y seleccionar al soltar el click, deberá usar "Popup". El resto de los mortales que prefieran el comportamiento más típico de click para abrir + click para seleccionar, que use "Menu". A gusto del consumidor.
Puede que recuerdes que dejamos un botón sin asignar en la configuración de nuestro FvwmIconMan (MyTaskbar). Ahora vamos a arreglar eso añadiendo la línea correspondiente:
*MyTaskbar: Action Mouse 3 N sendcommand "Menu MenuFvwmWindowOps"
A partir de ahora, Podremos usar nuestro botón derecho sobre la barra de tareas para realizar acciones sobre las ventanas que no estén visibles. Si, sé que el menú está lejos de ser una maravilla, pero poco a poco iremos añadiendo acciones más avanzadas y completándolo. Por ahora, descansemos un poco del trabajo pesado, vamos a adecentar un poco el menú, que ahora desentona en nuestra configuración.
-.Decorando el menú.-
El menú, como todo en fvwm, es configurable. Así que vamos a parar unos minutos para hacerlo un poco más bonito. Lo vemos sobre el código. Primero cambiaremos la cabecera del menú root de esta forma:
# MenuFvwmRoot
DestroyMenu MenuFvwmRoot
AddToMenu MenuFvwmRoot "Menú Raíz" Title
Ésto nos da un título en el menú. Si no te gusta, eres libre de quitarlo.
# Colorsets menu
Colorset 5 bg grey20, fg green, sh grey90, hi grey90
Colorset 6 bg grey40, fg white
# Configuración del menú
MenuStyle * TitleFont "xft:DejaVu Sans:size=10:style=bold"
MenuStyle * Font "xft:DejaVu Sans:size=8:style=bold"
MenuStyle * TitleUnderlines1
MenuStyle * MouseWheel ScrollsMenuBackwards
MenuStyle * Animation
MenuStyle * HilightBack, Hilight3DThin
MenuStyle * ActiveColorset 5
MenuStyle * MenuColorset 6
MenuStyle * ItemFormat "%3.0s%3.0|%0.0i%5.5l%5.5>%0.3|"
MenuStyle * PopupOffset 0 99
MenuStyle * PopupImmediately
MenuStyle * PopdownImmediately
MenuStyle * BorderWidth 1
MenuStyle * VerticalItemSpacing 0 0
MenuStyle * VerticalTitleSpacing 4 4
MenuStyle * SeparatorsShort
MenuStyle * TrianglesUseFore
MenuStyle * TrianglesSolid
Los colorsets no necesitan mucha explicación. En el quinto he puesto sh y hi iguales para que el marco de la selección parezca eso, un marco, y no un relieve.
Las opciones de configuración del menú requieren algo más de explicación:
TitleFont y Font son las fuentes del título del menú, y del resto del menú. TitleUnderLines1 es una opción que dibuja una línea bajo el título del menú para separarlo del menú en sí. También existen TitleUnderLines2 y TitleUnderLines0. El significado de cada cual es obvio.
MouseWheel hace que el menú se mueva arriba o abajo al darle a la rueda del ratón (si, soy vago).
Animation hace que el menú retroceda si choca con el borde de la pantalla, de esta forma podemos verlo completo siempre, sin que la pantalla nos lo corte. Hay gente que encuentra molesto este comportamiento.
HilightBack hace que el fondo del elemento seleccionado se resalte, y Hilight3DThin hace que dicho borde sea fino. Al usar HilightBack, se activa también la posibilidad de usar HilightColorset para darle un colorset distinto al elemento activo. MenuColorset es el colorset del resto del menú.
ItemFormat es la opción más compleja de todas. En ella se puede especificar de forma bastante minuciosa la geometría de cada línea de menú. La cadena de ItemFormat va siempre entre comillas, y se desmenuza en unidades sintácticas menores. Cada una de estas "sílabas", por así llamarlas, comienza con el signo de porcentaje (%), va seguida de dos números separados por un punto, y al final lleva otro elemento, que puede ser uno de entre todos estos: lcri><|p
De forma somera, explico el significado de dichos signos. ItemFormat describe el formato de una línea, es decir, a lo ancho. Cada sílaba, describe uno de los componentes que hay en cada línea del menú. Nosotros solo vemos el texto, pero hay más cosas. Los número en la sílaba, especifican el espacio en píxeles que hay a la izquierda y a la derecha de dicho elemento.
Tomemos la primera sílaba, "%3.0s". Sin los números, %s. Dicho elemento hace referencia al "sidepic", una imagen que podemos poner en uno de los laterales del menú. Dicho elemento siempre será el primero o el último del menú. En éste caso, va al principio, con 3 píxeles de margen delante, y 0 a la derecha.
"%3.0|". %| (es el símbolo de pipe o tubería) denota el comienzo o el final del área que se resalta cuando se selecciona un elemento. Es decir, es como el margen del menú. Puede aparecer un máximo de dos veces en la cadena de ItemFormat, una al principio, y otra al final. Solo hay un elemento que puede ir delante del primer %| (o detrás del último), y es %s. Por tanto, "%3.0|" significa que, antes de dicho margen, van 3 píxeles, y después del mismo, 0 píxeles.
El siguiente elemento es "%0.0i", %i es el icono. Por supuesto, nosotros no vemos iconos porque aún no sabemos como ponerlos, pero ya tenemos nuestro menú configurado para soportarlos ;)
En la posición de "%5.5l" se insertará el texto del elemento de menú, dejando 5 píxeles de margen por la izquierda, y otros 5 por la derecha. Solo uno de entre %l, %c y %r pueden aparecer en ItemFormat. Los tres cumplen la misma función, solo que insertan el texto a la izquierda, en el centro, o a la derecha, respectivamente.
"%5.5>" inserta la flecha a la derecha de los elementos que usan Menu o Popup como acción. Indicando que son submenús que se expandirán si los activamos. También podríamos haber usado %< a la izquierda del icono si tenemos el menú configurado para abrirse hacia la izquierda.
Por último, "%0.3|" especifica el final del área que se coloreará al seleccionar un elemento, dejando 3 píxeles, pero esta vez a la derecha.
Con todo esto, nuestro menú se ve más o menos así:

Ahora le vamos a añadir un bitmap decorativo en el lateral. El "sidepic" del que hablábamos antes. Podríamos hacerlo con la opción de menú "Sidepic", pero si lo hacemos así saldrá en todos los menús, y eso no es lo que queremos. Solo queremos poner un dibujo en el menú raíz. Así que lo haremos cambiando la cabecera del menú de esta forma:
# MenuFvwmRoot
DestroyMenu MenuFvwmRoot
AddToMenu MenuFvwmRoot@/home/i92guboj/.fvwm/sidepic.png@ "Menú Raíz" Title
Y añadimos:
MenuStyle * SideColor grey20
A continuación hay un link para descargar sidepic.png (si, ya lo se, el arte no es lo mío :P ):
Con todo y con eso, no queda mal del todo:

-.Decorando el menú de alt+tab.-
Ya se está haciendo largo el capítulo, así que terminaré brevemente. La lista de alt+tab no es exactamente un menú, pero en lo que respecta a las decoraciones podemos tratarla como si así fuera:
# Alt+tab menu configuration
MenuStyle WindowList Font "xft:DejaVu Sans:size=12:style=bold"
MenuStyle WindowList HilightBack, Hilight3DThin
MenuStyle WindowList ActiveColorset 5
MenuStyle WindowList MenuColorset 6
MenuStyle WindowList ItemFormat "%0.17|%0.7i%0.5l%17.0|"
MenuStyle WindowList BorderWidth 3
MenuStyle WindowList VerticalItemSpacing 10 10
Las opciones son las mismas, como puedes ver, lo único que he hecho es cambiar la fuente por una más grande, el espaciado, y el tamaño del borde. Poco más hay que explicar sobre esto.

No hemos ni siquiera rascado la superficie de lo que son los menús. Pero el capítulo se está haciendo largo. Así que cortaremos aquí. En siguientes capítulos iremos viendo más cosas sobre los menús. Son realmente una de las cosas más complejas de fvwm.
Aquí hay un enlace a la configuración tal y como queda en este capítulo, por si tienes alguna duda.
