GoRiX blog

A blog about things

Screenshots Workspaces: i3wm

May 25, 2024 — n4ch0m4n

Alguna vez habrán visto en unixporn (reddit) o en algún lado una captura como una cinta de imágenes en la cual cada una es un espacio de trabajo (workspace), en formato vertical u horizontal.

Estimo que en los DE (kde, gnome, xfce, etc) existirá algo que lo haga, pero en los WM (i3w, dwm, bspwm, etc) hasta donde sé no los hay y si los hay no importa, podemos hacer el nuestro propio!

En mi caso, para el wm que utilizo, que es i3wm. El código es el siguiente, solo necesitarán imagemagick y scrot instalado:


 #!/bin/bash
outputfile=$1 
command="i3-msg -t get_workspaces" 
fileprefix="/tmp/screen-"
json=$(eval "$command")
decoded=$(echo "$json" | jq -r '.')
while IFS= read -r workspace; do
    current=$(echo "$workspace" | jq -r '.name')
    first=$(echo "$workspace" | jq -r '.name')
    i3-msg workspace "$current"
    sleep 0.2
    scrot "${fileprefix}${current}.png"
done < <(echo "$decoded" | jq -c '.[]')
montage ${fileprefix}*.png -geometry +0+0 -tile x1 "$outputfile"
rm /tmp/*.png

 Y se llama de la siguiente forma:

capture.sh ~/Pictures/screenshots/capture-$(date +%d-%m-%Y-%H%M).png

Y se podría utilizar el atajo de teclado que les guste, yo en este caso tengo esto en mi .config de i3wm:

bindsym $mod+Print exec --no-startup-id ~/donde/esta/capture.sh ~/donde/guardo/capture-$(date +%d-%m-%Y-%H%M).png

Resumiento este script lo que hace es tomar capturas de pantalla de todos los espacios de trabajo (workspaces) y luego combina dichas capturas en una sola imagen. 

Primero, obtiene el nombre del archivo de salida a partir del primer argumento del script, el cual sería el nombre del archivo de la captura:

outputfile=$1

Luego, define un comando para obtener información sobre los espacios de trabajo de i3:

command="i3-msg -t get_workspaces" 

y una ubicación/prefijo de archivo para las capturas de pantalla temporales 

fileprefix="/tmp/screen-"

El script ejecuta el comando para obtener los datos JSON de los espacios de trabajo

json=$(eval "$command")

y decodifica este JSON 

decoded=$(echo "$json" | jq -r '.')

A continuación, recorre cada espacio de trabajo en el JSON 

while IFS= read -r workspace; do.

Para cada espacio de trabajo, extrae su nombre, cambia a dicho espacio, espera un breve momento para asegurar que el cambio se haya completado, y toma una captura de pantalla guardándola con un nombre basado en el prefijo y el nombre del espacio de trabajo.

current=$(echo "$workspace" | jq -r '.name')
first=$(echo "$workspace" | jq -r '.name')
i3-msg workspace "$current"
sleep 0.2
scrot "${fileprefix}${current}.png"

Después de recorrer todos los espacios de trabajo y tomar las capturas de pantalla, el script utiliza la herramienta montage de ImageMagick para combinar todas las capturas en una sola imagen dispuesta en una fila horizontal (x1) o vertical (1x). 

montage ${fileprefix}*.png -geometry +0+0 -tile x1 "$outputfile"

Al final, elimina todas las capturas de pantalla temporales de la carpeta /tmp para que si, hay otra nueva nueva captura, no utilice los ya generados y haga una imagen interminable.

rm /tmp/*.png

Como verán, luego de leer la explicación de cada línea no se ve tan complicado una vez que comprenden que hace cada cosa.

Seguramente haya formas más fáciles y efectivas de hacer lo mismo, pero como siempre en estas cosas, si funciona …

Tags: Scripts