Eventos y acciones en Polybar

PolybarPolybar

Este es uno de los capítulos del tutorial Polybar. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

En general con lo que has visto hasta el momento ya tienes mas que suficiente, incluso para crear tus propios módulos. Sin embargo, es posible ir un paso más allá. Y en este paso te va a ayudar sin duda este capítulo del tutorial sobre eventos y acciones en Polybar.

Para que te hagas una idea de la potencia que te ofrece los eventos y acciones en Polybar, un ejemplo sencillo. Puedes cambiar el formato del módulo fecha desde haciendo clic en otro módulo, o por ejemplo, comenzar a reproducir con mpd utilizando algo similar a mimpd.play… No está nada mal ¿no te parece?.

Eventos y acciones en Polybar

Eventos y acciones en Polybar

Las acciones

Las acciones se utilizan en Polybar para invocar sucesos en los diferentes módulos. Por ejemplo, cuando haces clic en el módulo de volumen, ya sea alsa o pulseaudio, lo que sucede entre bambalinas es que se envía este evento a ese módulo. Cuando el módulo recibe el evento, dependiendo del estado en que se encuentre se silenciará el audio o todo lo contrario. Así es como funciona los eventos y acciones en Polybar.

Las acciones no solo son utilizadas internamente por los distintos módulos, sino que tu también puede hacer uso de ellas utilizando Inter Process Communication. Aunque esto último lo veremos mas adelante.

Formato de las acciones

¿Como puedes de forma programática en un módulo desencadenar una acción? Tendrás que utilizar el siguiente formato,

#nombre.accion[.data]

Donde,

  • nombre es el nombre del módulo sobre el que queremos realizar la acción. Por ejemplo, si tienes el módulo [modulo/mpd] que es del tipo internal/mpd con el que puedes reproducir música, tienes distintas opciones a tu alcance. Por ejemplo, pausar la reproducción utilizando la acción #mpd.pause.
  • accion es la acción que quieres realizar. En el ejemplo anterior, es pausar la reproducción, pero esto dependerá básicamente del módulo sobre el que quieres actuar. Cada módulo permite que realices diferentes acciones sobre el mismo.
  • data es la información adicional que le quieres pasar a la acción en el caso de que sea necesario hacerlo. Por ejemplo, en el caso del módulo tipo menú para abrir un determinado elemento del tipo menú es necesario que le indiques el nivel que quieres abrir.

Desencadenando acciones

Una vez conoces el formato con el que tienes que llamar a una determinada acción, seguro que la siguiente pregunta que te surge es ¿como llamar a la acción?. Básicamente tienes dos opciones,

  • Puedes definir una acción asociada a un evento. Por ejemplo, cuando haces clic con el botón izquierdo del ratón sobre una barra. En el ejemplo anterior, el de poner en pausa, podrías hacerlo de la siguiente forma,
click-left = #mpd.pause
  • La segunda de las opciones que tienes para desencadenar acciones es utilizando los formatos que pudiste ver en el capítulo anterior. Por ejemplo,
%{A1:#mpd.pause:}Pausar%{A}

Y básicamente con estos conceptos ya puede comenzar a desencadenar acciones como si no hubiera un mañana.

Acciones disponibles

Como te he comentado, cada módulo tiene diferentes acciones. Puedes encontrar un listado completo de todas las acciones que tienes disponibles en la documentación sobre acciones. Sin embargo, quiero mencionarte algunas interesantes, para el resto, el enlace que te acabo de indicar.

  • Para los módulos internal/alsa e internal/pulseaudio, tienes tres acciones, inc, dec y toggle, que te permiten, aumentar, disminuir y silenciar el volumen.
  • En el caso de internal/mpd tienes play, pause, stop, prev, next, repeat, y algunas mas que te permiten reproducir, pausar, detener, pasar a la pista anterior o siguiente o activar el modo repetir.
  • Los módulos internal/xworkspaces, internal/bspwm e internal/i3 tienen las acciones focus, next y prev que te permiten cambiar a un determinado espacio de trabajo, pasar al siguiente o al anterior espacio de trabajo, respectivamente.

Inter Process Messaging (IPC)

No te preocupes, que esto no tiene nada que ver con el temido índice de precios. Esto te permite enviar acciones entre diferentes módulos, incluso te permite simular acciones del ratón o directamente controlar una barra de estado o reiniciarla.

Habilitar el IPC en una barra

Para poder hacer uso de esto del IPC en una barra, o en todas, según tu quieras, tienes que habilitar el parámetro enable-ipc dentro de la sección de la correspondiente barra. Así por ejemplo,

[bar/bar1]
...
enable-ipc = true
...

Una vez habilitado el IPC en tu barra, por curiosidad, tienes que darle un vistazo al directorio temporal /tmp, donde deberías encontrar un archivo como /tmp/polybar_mqueue.410510 que es justo el que tengo ahora mismo. Y ¿que es ese número extraño?. Si, lo adivinaste, el PID de Polybar. Puedes ver todas las instancias de Polybar que estás ejecutando con

$ ps -ef | grep polybar | grep -v grep

lorenzo   410510       1  0 10:51 ?        00:00:37 polybar bar1
lorenzo   410511       1  0 10:51 ?        00:00:26 polybar bar2

También puedes obtener el PID, ejecutando pidof polybar. Aunque de esta forma, no obtienes el nombre de la barra que estás ejecutando, que seguro te resulta interesante para posteriormente mandarle mensajes.

Enviar acciones

Ahora que ha tienes habilitado el IPC, el siguiente paso es enviar tu barra de estados, a una o a todas, esto a tu elección. Vamos con un ejemplo, el de pausar mpd como hemos visto anteriormente,

echo "action#mpd.pause" > /tmp/polybar_mqueue.410510

Si se lo qusieras envair a todas las barras que tengas en funcionamiento, y que tengan el IPC habilitado, tendrías que utilizar el siguiente comando,

echo "action#mpd.pause" | tee /tmp/polybar_mqueue.* > /dev/null

El problema, como ya te habrás dado cuenta, radica en que el PID no siempre será el mismo. ¿Como identificarlo?. Puedes obtener el PID de una barra concreta utilizando el siguiente comando,

ps -e -o pid -o cmd | grep "polybar bar1" | grep -v grep | cut -d" " -f2

Podrías encadenarlo todo en un solo comando o utilizando lo siguiente,

PID=$(ps -e -o pid -o cmd | grep "polybar bar1" | grep -v grep | cut -d" " -f2)
echo "action#mpd.pause" > /tmp/polybar_mqueue.${PID}

polybar-msg

Otra opción que tienes para hacer esto mismo que acabas de ver es utilizar la herramienta polybar-msg. Esta herramienta te permite enviar mensajes a Polybar de forma sencilla utilizando,

polybar-msg -p <pid> <type> <payload>

En type puedes utilizar tres tipos, action, cmd y hook. Las acciones, action, son las que has visto hasta el momento. En el caso de los comandos, son mensajes que puedes enviar para controlar tu barra de estado, o barras, en el caso de que no especifiques una en concreto. ¿Que comandos puedes enviar?

  • quit para cerrar una barra
  • restart reinicia una barra
  • hide oculta una barra
  • show muestra la barra
  • toggle cambia entre oculto y visible el estado de la barra

El caso de los hooks, se relaciona con el módulo de tipo custom/ipc que podrás ver en el capítulo correspondiente.


Imagen de portada de Ethan Elisara en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *