Una extensión de GNOME Shell para dominarlas a todas

Mientras me hago a las extensiones de GNOME Shell, he encontrado un extensión que seguro va a hacer las delicias de mas de uno. ¿Quien no ha querido hacer una extensión de GNOME Shell en unos segundos?. Si ese es tu caso, Argos es la solución para ti.

La mayoría de las extensiones, indicadores, etc, en GNOME Shell, hacen una única cosa, añadir un botón con un menú desplegable al panel. En ocasiones también pueden mostrar algún tipo de información o alguna funcionalidad.

Hasta el momento, todavía no he podido meterme a fondo en el desarrollo de extensiones, por varias razones además del tiempo. Pero sobre todo es por que la API JavaScript de GNOME Shell está poco documentada. Esto me lleva a dedicarle mucho tiempo de investigación, y pruebas, y en muchos casos me desespero.

Sin embargo con Argos, hacer una extensión de GNOME Shell es muy sencillo.

Una extensión de GNOME Shell para dominarlas a todas. Logo.

Hacer una extensión de GNOME Shell con Argos en segundos

Argos no es mas que una extensión de GNOME Shell que convierte un ejecutable normal en un menú desplegable del panel. Así de simple, así de sencillo.

Esta extensión de GNOME Shell, está inspirada en BitBar. BitBar es una aplicación de macOS.

Pero no solo es que Argos esté inspirada en BitBar, sino que además admite muchos de sus complementos, sin que sea necesario hacer ninguna modificación. Esto evidentemente, nos da accesos a una gran biblioteca de scripts que ya han sido suficientemente probados. Además a estos, podrás añadir todos los que tu hagas.

En esa biblioteca que comento, hay cientos de complementos, que puedes añadir, y configurar a tu gusto. Puedes pasar un par de horas (sin problemas) probando cada uno de ellos. La verdad es que es muy recomendable que si quieres hacer una extensión de GNOME Shell con Argos los pruebes, modifiques y configures. Esto de dará una visión de como puedes hacer los tuyos propios.

Características de Argos

Como he comentado, Argos se caracteriza por ser compatible con BitBar. Muchas de sus características están precisamente centradas en esta cualidad.

  • Argos es 100% compatible con BitBar 1.9.2. Todos los complementos que se pueden ejecutar en Linux (y que no contienen código específico de macOS) funcionarán perfectamente con Argos.
  • Pero no solamente es 100% compatible, sino que va mas allá, permitiéndonos hacer determinadas acciones que todavía no se pueden hacer con BitBar.
  • Argos tiene un sofisticado motor de ejecución asíncrono. No importa lo que tu script tarde en ejecutarse, Argos se encarga de programarlo de forma automática y de esta manera impedir los bloqueos.
  • Soporta el texto unicode. Tan solo te tienes que preocupar de imprimir lo que quieras ver. Argos, se encarga de renderizarlo de la forma que tu esperas.
  • Argos está optimizado para hacer un consumo de recursos reducido. Incluso en el caso de que tengas varios complementos actualizándose cada segundo, el consumo de CPU típico de Argos es de menos del 1%.
  • Argos está perfectamente documentado (eso si, en inglés). Sigue este enlace para encontrar la documentación de Argos

Uso y funcionamiento

Si todavía no te has decidido a probar Argos y crear tu propia extensión de GNOME Shell en segundos, a continuación te explicaré como hacerlo.

Argos monitoriza el directorio ~/.config/argos, de forma que cualquier cambio se ve reflejado de inmediato en el panel.

De esta forma, cualquier ejecutable que se encuentra en ese directorio es considerado un complemento. Sin embargo, todas los archivos ocultos (que empiezan con un punto) o los archivos que están en directorios dentro de ~/.config/argos, se ingnoran.

Para cada complemento (ejecutable) se crea un botón y un menú y desplegable en el panel. El orden de los paneles va de izquierda a derecha por orden alfabético del nombre del ejecutable. Esto es así, a menos que en el nombre del ejecutables se especifica la posición.

Cada vez que se añade o edita un complemento (ejecutable), se detecta automáticamente detectado. Los cambios que se producen se reflejan de inmediato en el panel.

El formato de los complementos

Los complementos se pueden nombrar de cualquier forma, la única condición es que sea ejecutable. Sin embargo, cuando el complemento tiene un formato como el que indico a continuación, tiene unas connotaciones específicas,

NOMBRE.POSICION.INTERVALO.EXTENSION

donde,

  • POSICION es un entero seguido de una letra, que puede ser, l para izquierda, c para centro y r para derecha.
  • INTERVALO es un entero seguido de una letra, que puede ser, s para segundos, m para minutos, h para horas y d para días.

Así por ejemplo un complemento que se llame complemento.10s.sh se actualizará cada diez segundos. Si el complemento se llama complemento.1c..sh se colocará justo a la derecha del reloj de GNOME Shell, mientras que si se llama complemento.l.1m.sh se mostrará a la izquierda de Actividades y se actualizará cada minuto.

Formato de salida

Como he comentado de forma reiterada, todos los complementos de Argos son ejecutables. Lo único que se espera del ejecutable es una impresión. Si, nada mas que esto. Se trata de líneas sencillas con el siguiente formato:

TEXT | ATTRIBUTO1=VALOR1 ATRIBUTO2=VALOR2...

Decir que los atributos son opcionales, es decir, puedes hacer una salida tan sencilla como líneas de texto y punto.

Por otro lado, líneas que solo contienen guiones, --- son separadores.

Las líneas que se encuentran por encima del primer separador corresponden con el botón propiamente dicho. Si hay varias líneas antes del primer separador estas aparecerán de forma sucesiva, una tras la otra, transcurridos 3 segundos. Además todos los botones tendrán un menú desplegable excepto si el atributo dropdown se le asigna el valor false.

Es posible crear sub menus, para ello simplemente tenemos que añadir -- delante del texto. Por ejemplo,

echo "Submenú"
echo "--Ejemplo 1"
echo "--Ejemplo 2"
echo "----Ejemplo 3"

Se mostrará como sigue,

Una extensión de GNOME Shell para dominarlas a todas. Ejemplo.

Los códigos emoji como :horse: o :smile: se reemplazarán por su carácter Unicode correspondientes, siempre y cuando el atributo emojize no sea false.

Por último las secuencias de escape como \n y \t en la línea de texto, se reemplazarán por sus correspondientes caracteres , nueva línea y tabulador respectivamente.Al igual que en el caso anterior, esto también se puede evitar si establecemos el atributo unescape a false.

Atributos de línea

Como he comentado, existen diferentes atributos que nos permitirán definir y controlar como la línea de texto se ve. Así tenemos,

  • color. Es una valor hexadecimal que estable el color del texto.
  • font. El nombre de la fuente.
  • size. El tamaño de la fuente.
  • iconName. El nombre del icono, siguiendo la especificación de nombres de freedesktop.org
  • image. Se trata de una imagen codificada en Base64. Establece la imagen que aparecerá al principio de la linea. La imagen se ubicará a la izquierda del texto.
  • imageWidth, imageHeight. Establecen las dimensiones de la imagen. Si solo se define una dimensión, se mantendrá la relación de aspecto.
  • length. Limita el texto al máximo establecido por este atributo.
  • trim. Si este atributo toma el valor falsepreservará los espacios en blanco al principio y al final del texto.
  • dropdown. Si este atributo tiene el valor false y es la primera línea se excluirá de aparecer en el menú desplegable.
  • alternate. Si este atributo tiene el valor truela línea estará oculta por defecto, y se mostrará en lugar de la línea precedente cuando se presione la tecla Alt.
  • emojize. Como he comentado anteriormente, este atributo controla la sustitución de los valores del tipo :nombre-del-emoji: por su valor correspondiente.
  • ansi. Hace lo mismo que en el caso anterior pero con secuencias ANSI.
  • unescape. Igual que anterior, pero para secuencias del tipo \n o \t.
  • useMarkup. Permite la interpretación de texto Pango markup.

Acciones

Además de poder mostrar texto en el menú, también es posible definir acciones que se ejecutarán cuando el usuario haga clic en la correspondiente línea.

  • bash. Ejecuta una orden utilizando bashen un terminal.
  • terminal. Si este parámetro tiene valor false, la orden se ejecuta en segundo plano sin que se muestre el terminal.
  • href. Abre una dirección con la aplicación asociada para gestionarla. Por ejemplo, si comienza con http://la abrirá con el navegador web, mientras que si comienza con file:// se abrirá con la aplicación asociada.
  • eval. Pasa el código a la función eval de JavaScript.
  • refresh. Si este atributo es true ejecuta el complemento de nuevo actualizando la salida.

Complementos

Puedes encontrar encontrar cientos de complementos para Argos, directamente en la página de BitBar, que podrás utilizar fácilmente, con tan solo copiar los al directorio ~/.config/argos.

A continuación puedes ver algunos complementos tal y como se muestran con BitBar en macOS y con Argos en GNOME Shell.

Complemento BitBar en macOS Argos en GNOME Shell
Ping Ping/BitBar Ping/Argos
Stock Ticker Stock Ticker/BitBar Stock Ticker/Argos
World Clock World Clock/BitBar World Clock/Argos
Unicorn Unicorn/BitBar Unicorn/Argos
ANSI ANSI/BitBar ANSI/Argos

Instalación

Tienes dos opciones, o bien recurres a la página de extensiones de GNOME Shell,

O bien, descargando el complemento y copiando el directorio argos@pew.worldwidemann.com en ~/.local/share/gnome-shell/extensions.

Una vez copiado, reinicia GNOME Shell, utilizando el atajo de teclado Alt+F2. Esto en algunos casos no hace falta.

En mi caso particular, he tenido que recurrir a la segunda opción, porque la primera ha sido completamente imposible.

Una vez instalado, solo tienes que copiar los complementos de BitBar o crear los tuyos propios.

Si no puedes esperar a probarlo, a continuación te dejo un par:

Lanzador simple

Copia el código que te muestro a continuación en el archivo lanzador.sh en el directorio ~\.config\argos. Cuando lo guardes dale permisos de ejecución,

#!/usr/bin/env bash

echo "Launcher | iconName=starred"
echo "---"

WIKIPEDIA_ICON=$(curl -s "https://en.wikipedia.org/static/favicon/wikipedia.ico" | base64 -w 0)
echo "Wikipedia | image='$WIKIPEDIA_ICON' imageWidth=20 font=serif href='https://en.wikipedia.org'"

echo "---"
echo "Gedit | iconName=gedit bash=gedit terminal=false"
echo "Nautilus | iconName=system-file-manager bash=nautilus terminal=false"
echo "Process list (<span color='yellow'><tt>top</tt></span>) | iconName=utilities-terminal-symbolic bash=top"
echo "---"
echo "Looking Glass | eval='imports.ui.main.createLookingGlass(); imports.ui.main.lookingGlass.toggle();'"

Un lanzador avanzado

Igual que en el caso anterior, pero le llamas lanzador.py,

#!/usr/bin/env python3

import re
from gi.repository import Gio

applications = {}

for app_info in Gio.AppInfo.get_all():
  icon, categories = app_info.get_icon(), app_info.get_categories()
  if icon is None or categories is None:
    continue
  # Remove "%U" and "%F" placeholders
  command_line = re.sub("%\\w", "", app_info.get_commandline()).strip()
  app = (app_info.get_name(), icon.to_string(), command_line)
  for category in categories.split(";"):
    if category not in ["GNOME", "GTK", ""]:
      if category not in applications:
        applications[category] = []
      applications[category].append(app)
      break

print("Applications\n---")

for category, apps in sorted(applications.items()):
  print(category)
  for app in sorted(apps):
    print("--%s | useMarkup=false iconName=%s bash='%s' terminal=false" % app)

Que se mostrará como sigue,

Una extensión de GNOME Shell para dominarlas a todas. Otro ejemplo.

Conclusiones

Se trata de un complemento brutal con el que con unos pocos conocimientos de programación conseguirás resultados espectaculares.

Te recomiendo, que no esperes ni un segundo, y lo pruebes cuanto antes, y comiences a sacarle el máximo partido.


Más información

  • Lionel Bino

    Excelente artículo!! Como siempre de lo mejor

  • Neu OldMan

    Probad esta: shellTltle:
    https://www.youtube.com/watch?v=xX9HUBFj5XE
    windows grouping: justificado de instancias sobre otras con el control y y luego re-dimensiones otra vez con el control y afectando a todas las agrupada.. sin palabras.
    Bueno bueno! esta es la extensión de gnome shell excelencia.. Wow!!
    De verdad no dejéis de probarlo los que tengáis gnome.. es como tener una matriz de monitores

    • Neu OldMan

      espero o guste

    • Muchas gracias, es espectacular…, voy a tener que hacer un artículo dedicado a las mejores extensiones,…

      Muy bueno, gracias.