danirod

Modificando Unity para tenerle menos manía

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.
  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 tanto 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, para así además perderle miedo a modificar el código fuente de mi propio entorno de escritorio.

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 con mis modificaciones.