Cómo mantener las extensiones tras un reinicio (Ubuntu 14.04 y Gnome Shell)

Holas a todos y todas. No es novedad que Gnome-Shell y Ubuntu-Unity no se llevan del todo bien. Decirlo así puede sonar fuerte, pero es la verdad. Incluso luego de la salida Ubuntu-Gnome aún pueden encontrarse un sin fin de bugs, algunos graves, otros tontos, pero la tónica es que la mayoría permanecen sin solucionar desde el lanzamiento alpha. Y lo cierto es que los muchachos de Ubuntu Gnome son bastante herméticos en dejar entrar gente a participar de la distro (una lástima).

Anyway, dejando mis inconformidades de lado, hoy me voy a meter con uno de los bugs más molestos de Ubuntu-Gnome (que existe desde la versión alpha y perdura hasta la versión final LTS -wtf-). El problema: tras un reinicio se desactivan todas las extensiones.

A buscarse el café o la birrita porque me emocioné y escribí un montón. :P
… ah! A lo último hice un resumen para los que tengan fiaca. :)

El bug

Antes que nada, parece que esto sólo sucede en Ubuntu-Gnome. Resulta que uno entra contento a ver cómo anda la shell en su última versión en un entorno de la familia debian, como lo es ubuntu gnome. Una de las primeras cosas que se hacen luego del primer boot es chusmear las nuevas extensiones en el sitio oficial e instalar las viejas, clásicas que nos gustan y siempre ponemos. Abrimos Gnome Tweak Tool y empezamos a configurar todo para dejar nuestro escritorio en sintonía con lo que nos imaginamos debería ser el “entorno definitivo” para trabajar (o lo que cada uno haga con su computadora :P ).

Luego de pasar 2 o 3 horitas toqueteando, probando, instalando, sacando, poniendo, hacemos un lindo dist-upgrade y reiniciamos, como corresponde. Amargo momento es el que nos espera cuando vemos que tras el reinicio todas las extensiones que teníamos configuradas ya no están más. Todo rústico, todo feo como si fuera el primer boot.

Gnome Tweak Tool con las cosas activadas

¿Qué pasó? Bueno aparentemente Ubuntu-Gnome no reconoce el reboot como una forma de apagado seguro y tras reiniciarse entra en una especia de “modo a prueba de fallos” en el que desactiva todas las extensiones. Esto es porque si estamos usando extensiones experimentales (o estamos jugando a desarrollar una), la shell se puede crashear y este mecanismo nos permite reinciar todo y solucionar el problema.

Gnome Tweak Tool luego del reinicio: trisísimo.

Pero en realidad ni estabamos probando extensiones experimentales ni desarrollando una, sino que todo funcionaba perfecto. Incluso el bug sucede si no instalamos nuevas extensiones desde el sitio, sino sólo activando las oficiales que vienen en los repos. Y ya, tras un reinicio, PAM!, a configurar todo de nuevo. Todo lo que activaste está olvidado en el recuerdo. A la segunda vez que te pasa querés instalar un KDE corriendo, con una sensación de frustración súper justificada.

Estas son las cosas que hacen que la gente piense que gnome-shell es una mierda. Y tienen razón, porque claramente es un aspecto crítico del sistema que definitamente destruye la experiencia de usuario en un boot… :/

La solución

Bueno, como siempre, buscando y buscando todo se puede solucionar. Dadas mis limitaciones técnicas (eso de que no soy programador y bla bla) el work-around que encontré es bastante simple. Se trata de “atar con alambre” lo que no anda forzando el inicio de las extensiones mediante la ejecución de gsettings al inicio de la sesión.

El trabajo consiste en tres partes: primero tenemos que saber mediante línea de comando qué extensiones tenemos instaladas. Segundo tenemos que crear UNA línea de gsettings que nos active todas extensiones a la vez. Tercero, tenemos que agregar eso a las aplicaciones que se activas al iniciar sesión.

Paso 1: listando las extensiones

Entonces parece que queremos listar las extensiones que tenemos activadas. Es muy fácil, se hace con un comando en la terminal que devuelve los valores activos de gsettings. Sólo asegúrense de que antes de correr el comando hayan activado todo lo que quieren activar desde Gnome Tweak Tool.

Abran una terminal y peguen:

gsettings get org.gnome.shell enabled-extensions

devuelve algo así:

Esa lista es la que queremos copiar y pegar para el paso siguiente. Así, lo que guardamos en un gedit es:

['alternate-tab@gnome-shell-extensions.gcampax.github.com', 'hide-dash@xenatt.github.com', 'hide-workspace@xenatt.github.com', 'panel-osd@berend.de.schouwer.gmail.com', 'user-theme@gnome-shell-extensions.gcampax.github.com', 'apps-menu@gnome-shell-extensions.gcampax.github.com', 'remove-dropdown-arrows@mpdeimos.com', 'SkypeNotification@chrisss404.gmail.com']


(para curiosos y detallistas) Listando todo todo lo que haya:

Las extensiones activas provienen de dos fuentes: las que vienen por defecto en gnome-shell y las que nosotros instalamos manualmente. Para saber qué extensiones tenemos instaladas (en lugar de “activas”, que es lo de arriba) podemos correr un comandito que va a listar todas. Hay un modo bastante simple de listar todas las extensiones disponibles desde la terminal usando “ls”.

Para listar SÓLO las extensiones que nosotros instalamos manualmente, simplemente tenemos que ejecutar esta línea:

ls ~/.local/share/gnome-shell/extensions

El output será algo así:

Sólo para que quede claro, todas las extensiones están en una carpeta y cada extensión es un directorio, por lo que las podemos listar de la forma que querramos. También podemos ver qué extensiones instalamos desde nautilus, navegando a .local > share > gnome-shell > extensions, como se ve en la captura. Por supuesto, usar la terminal hace el trabajo más fácil para el objetivo que tenemos. Un dato más: acá también van a estar todas las extensiones que alguna vez probamos, si saben que no las van a usar nunca más, entonces no pierdan oportunidad y bórrenlas al carajo jeje.

Para listar todas las extensiones (incluso las que ya vienen incorporadas a gnome shell por defecto), podemos correr este comando:

ls ~/.local/share/gnome-shell/extensions && ls /usr/share/gnome-shell/extensions/

Recuerden que no todas las extensiones instaladas tienen que estar activadas! En mi caso, sólo a modo de ejemplo, “Launch and Exposè” (Launch-And-Expose@xenatt.github.com) está instalada pero no activada. Lo mismo con otras extensiones de sistema, como por ejemplo “Auto move windows” (auto-move-windows@gnome-shell-extensions.gcampax.github.com) que todavía no entiendo bien qué hace :P.

Ok, entonces lo primero es hacer la lista de qué queremos y qué no. La forma general es como dije arriba. Listamos y nos anotamos cuáles queremos y cuales no en un gedit o donde quieran. Si quieren hacer una lista de todo y luego seleccionar, pueden ir con este último comando que les pasé.

Paso 2: forzar la activación de extensiones

Como se imaginarán, una vez que tenemos la lista de las extensiones que nos interesan, la cuestión es simplemente correr un comando que active “esa” lista.

En una terminal pegamos:

gsettings set org.gnome.shell enabled-extensions "['alternate-tab@gnome-shell-extensions.gcampax.github.com', 'hide-dash@xenatt.github.com', 'hide-workspace@xenatt.github.com', 'panel-osd@berend.de.schouwer.gmail.com', 'user-theme@gnome-shell-extensions.gcampax.github.com', 'apps-menu@gnome-shell-extensions.gcampax.github.com', 'remove-dropdown-arrows@mpdeimos.com', 'SkypeNotification@chrisss404.gmail.com']"

Si se fijan con cuidado simplemente estamos haciendo esto:

gsettings set org.gnome.shell enabled-extensions " XXXX "

Reesmplazando XXXX por la lista de extensiones que obtuvimos en el primer paso. :)

La terminal siempre manda, así que con este comando “pisamos” toda la configuración de Gnome Tweak Tool. Si la extensión no está en la lista, estará apagada.

Cada vez que tengamos un problema, simplemente podemos correr este comando y ya. Todas las extensiones que hayamos listado se activan. Obviamente asegúrense de que las extensiones que corren funcionan correctamente y que no hacen “crashear” la shell… sino, buah, básicamente estarán haciendo cagada :)

Así que, para hacerla corta, en la lista sólo tenemos que poner extensiones que hayamos probado mucho y que funcionen bien. Mientras tanto, si no confiamos ciegamente en todas las extensiones que usamos, conviene tener un listadito con aquellas que son indispensables y que necesitamos para ser súper felices (léase user themes y alternate-tab jeje) y luego con cautela ir agregando otras, con cautela, repito.

Y repito de nuevo. Las extensiones que funcionan mal crashean la shell. Si las agregan y fuerzan su activación están atentando contra la estabilidad del entorno. Ojo.

Paso 3: Ejecución al inicio de sesión

El tercer paso consiste en autoejecutar al inicio de la sesión el resultado del paso 2, nuestro comando que fuerza la activación de las extensiones. Para eso tenemos que agregar un “launcher” al menú de autostart de gnome. Es muy sencillo.

Abran un gedit o editor de texto favorito y peguen:

[Desktop Entry]
Type=Application

Exec=gsettings set org.gnome.shell enabled-extensions " XXXXXX "

Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=false
Name[es_ES]=extensions.desktop
Name=shell extensions
Comment[es_ES]=
Comment=

Se va a ver algo así. Recuerden que tienen que reemplazar ” XXXXXX “ por sus extensiones y que las comillas son importantísimas.

Guardamos el archivo en el destino ~/.config/autostart (el rulito ~ significa su carpeta de usuario). Tienen que activar ver los archivos ocultos para acceder a “.config”. El nombre que le vamos a poner es shell-extensions.temp. Si, .temp. Ahí vamos.

Por último creamos el .desktop le damos permisos de ejecución al nuevo launcher. Abrimos una terminal y pegamos:

mv ~/.config/autostart/shell-extensions.temp ~/.config/autostart/shell-extensions.desktop && chmod +x ~/.config/autostart/shell-extensions.desktop

Listo. Terminamos. Para checkear podemos jugar un poco y desactivar todas las extensiones antes de reinicar. Reiniciamos y “vualá”, tutto aposto. Las extensiones que seleccionamos tendrían que estar activadas.

 


 

 

Resumen sin palabrerío:

El post en 3 pasos
1) Listamos las extensiones activas. Terminal: gsettings get org.gnome.shell enabled-extensions. Copiamos el output.
2) Probamos la activación forzosa. gsettings set org.gnome.shell enabled-extensions " XXXXXX ". Donde XXXX es el output del paso 1.
3) Hacemos un .desktop con el comando del paso 2 y lo metemos en la carpeta de aplicaciones al inicio.

Eso es todo por hoy amigos y amigas. Espero les sirva y, como siempre, preguntas, comentarios y experiencias serán más que bienvenidos.

Ps. algún día tengo que hacer el post con mis extensiones preferidas. O más bien sobre extensiones en gnome-shell. Pero como verán, me da un poco de miedo porque cada vez que empiezo termino haciendo estos posts que son bastante largos. Todo muy lindo, pero mi jefe me va a cortar las bolas si no me pongo las pilas, jajaj. Me voy a trabajar. :)

Salú!

 

Aside