Nunca le he tenido mucho aprecio a Unity, a veces de forma justificada y a veces de forma injustificada. Uno de los argumentos que siempre he tenido en su contra es lo mal planteado que está, y lo poco personalizable que es en comparación con otros entornos como XFCE, si bien esto no es nuevo. Es como si se hubiese puesto de moda en muchos entornos de escritorio dejar el sistema poco personalizable, haciendo que los usuarios que quieren tocar cosas tengan que instalar programas especiales, como Unity Tweaks, GNOME Tweaks, Elementary Tweaks, cuando en otros entornos como GNOME 2/MATE o XFCE tienes a tu disposición un ajuste más rico de cómo funciona tu ordenador, especialmente de cómo se ve.

Sin embargo, en un pequeño experimento que hice ayer, recompilé una versión modificada por mí de Unity-2D 5.14 (la versión que se usa en Ubuntu 12.04 LTS) para adaptarla un poco a mis necesidades y tenerle menos manía. Y básicamente, quería compartir los cambios que hice.

Mi cambio ha consistido en modificar el código fuente del panel superior de Unity-2D para que la barra de menús sea siempre visible. No me gusta que el menú sea sólo visible cuando se mantiene el ratón por encima. Me parece más útil poder escanear con el ojo dónde está el menú en el que quiero hacer clic antes de empezar a mover el ratón, para poder mover el ratón justo donde quiero; y no que tal y como está planteado Unity, tengo que mover primero el ratón arriba para ver el susodicho menú.

Ya sé que no es el mejor momento para hablar de menús con la controversia que hay sobre si la barra de menús debe desaparecer o no. Entiendo que en muchas aplicaciones sea un elemento inútil que sólo pone los mismos comandos que hay en la barra de herramientas de forma jerarquizada. Sin embargo, dado el trabajo que hago con el ordenador y las aplicaciones que uso (entornos de desarrollo como Eclipse, edición de vídeo como Kdenlive, edición de imagen como GIMP, edición de audio como Audacity…), que son aplicaciones que se controlan fundamentalmente con la barra de menús, no tener acceso a este elemento sería una gran pérdida de usabilidad a mi punto de vista.

Como una screenshot vale más que mil palabras, he aquí el aspecto final de mi panel de Unity y debajo comento cómo lo he logrado, que es muy simple:

Unity tras haber hecho mi modificación
Unity tras haber hecho mi modificación

Como se ve, el panel superior ahora se comporta tal que así:

  1. Cuando la aplicación tiene tamaño normal (no maximizada), la barra de menús nunca se oculta. El nombre de la aplicación de la izquierda tiene un tamaño variable, es decir, nunca es tapada por el menú, a diferencia de lo que hace Ubuntu por defecto, si no que es el menú el que se desplaza a la derecha.
  2. Cuando la aplicación se maximiza, en vez de mostrarse la barra de título de la ventana, se sigue mostrando el nombre de la aplicación, como antes. Es decir, no puedes ver el título de la ventana cuando la aplicación se maximiza. Podría ser una deficiencia, pero tampoco suelo maximizar la mayoría de las ventanas, excepto Chrome quizás, pero Chrome tampoco te muestra el título de la ventana por defecto así que me da igual. Ahora está de moda que los entornos de escritorio te oculten cosas que ellos consideran “redundantes”, sea la barra de menús, sean los botones de la ventana (vease las ventanas de GNOME Shell que no tienen botón minimizar ni botón maximizar), sea el menú Inicio (vease Windows 8)… por lo tanto, no creo que nadie tenga valor a decirme que soy un desalmado por “ocultar algo que podría ser importante” cuando ellos no hacen más que ocultar cosas que para mí si son importantes.
  3. Cuando se pone el ratón sobre el panel en una aplicación maximizada, se muestran los botones de ventana, como antes. El espacio para mostrar el nombre de la aplicación se reduce y por ende las letras finales se desvanecen. La barra de menús no se mueve ni un píxel.

Este hecho lo recalco en negrita porque me parece importante que la barra de menús no se mueva ni un pixel. Al fin y al cabo, esto es como antes, ¿de qué te sirve que el usuario escanee con el ojo el menú en el que va a hacer clic si cuando pone el ratón encima, se mueve a la derecha o a la izquierda?

Finalmente, comparto el código. Por ahora el cambio sólo funciona en Unity-2D. Tengo que ver cómo integrarlo en Unity, pero por ahora no me parece apetecible ya que estoy usando Ubuntu 12.04, el cual dentro de dos semanas seguramente se actualizará por la siguiente LTS, Ubuntu 14.04, de esperar con una versión nueva de Unity, lo que seguramente hará que tenga que reescribir mi cambio, así que no me merece la pena modificar eso ahora. Esto que hice ayer fue sólo un experimento.

Sólo tengo que modificar el archivo panel/applets/appname/appnameapplet.cpp, que es el archivo encargado de mostrar la parte izquierda del menú. Y concretamente todos los cambios se centran en la función AppNameApplet::updateWidgets(), que es la que se llama cuando se quiere actualizar la apariencia del panel. Aquí está el snippet. Está embebido al final de este post, ya que es un poco largo. Por describir los cambios que hago:

  1. Como se ve en la línea 105, la barra de menú ahora es visible siempre, no sólo si la variable showMenu, que se pone a true cuando el ratón se sitúa sobre el widget, está activa (línea 104).
  2. En la línea 76, el título negrita que hay a la izquierda ahora muestra siempre el nombre de la aplicación. Antes, si la ventana estaba maximizada se mostraba el título de la ventana (como se determinaba en el IF que hay entre las líneas 66 y 75).
  3. El ancho de este título ahora es flexible, como se ve entre las líneas 91 y 95. QFontMetrics es una clase que te puede decir cuántos píxeles mide una cadena de caracteres. Es la que uso para hacer que el ancho de la etiqueta sea lo que vaya a medir el texto que lleva dentro. Antes, si el menú estaba oculto, el ancho era toda la barra de menús, y si el menú estaba visible era un tamaño pequeño para que el menú se quedase siempre a la izquierda; líneas 86 a 90.
  4. Anteriormente, si ponías el ratón sobre la barra de menús en una aplicación maximizada, el título de la ventana se ocultaba (línea 97). Pero eso antes no era un problema porque la barra de menús siempre se iba a mostrar a la izquierda. Ahora que se puede desplazar horizontalmente si el título de la aplicación es largo, es necesario meter algo de hueco a su izquierda para que la barra de menús siga en la misma posición. Y como me daba igual lo que fuese, en vez de dejar el espacio en blanco puse otra vez el título de la aplicación, aunque restando el tamaño de los botones de ventana para que no se moviese el menú. Esto lo hago entre las líneas 98 y 101.

Ya digo que no me extrañaría nada que en el Unity que traiga Ubuntu 14.04 las cosas hayan cambiado algo y deba reescribir este código de cero. Lo haré sin problemas. Esto era una prueba de concepto. Habrá a quien no le guste esta forma de usar el menú, y lo entenderé. Pero este cambio es mío, para mí. Esto es parte del software libre. Poder modificar el código para que el software se adapte a tí. ¿O serías capaz de modificar el código fuente de Windows para hacer que se comporte como tu quieras? Creo que no.