Mejoras en mi escritorio (i3-wm)

· 4 min · @Linux · #i3wm #Debian

Después de mucho tiempo usando i3-wm, estaba constantemente cambiando de wallpaper (seguramente a más de uno le pasa), pensé que habría alguna manera de hacer que cada X tiempo el wallpaper que estoy utilizando cambiara automáticamente, de los que tengo en el directorio donde los guardo.

Así que me puse a la búsqueda de cómo se puede hacer.

Encontré unas cuantas maneras de hacer lo que yo quería:

Yo me quedé con la idea del segundo script, aunque le añadí la posibilidad de enviar notificaciones al escritorio de los cambios de fondos de pantalla a través de notify-send.

#!/usr/bin/bash
shopt -s nullglob

if [[ -z $(which feh) ]]; then
    echo "wallpaper err: Can not find command feh." > ~/i3wm-wallpaper.err
    exit 127
fi

# DIRECTORIO DONDE ESTÁN LOS FONDOS DE PANTALLA
path=~/.config/wallpapers

# TIEMPO / INTERVALO ENTRE LOS CAMBIOS DE FONDO DE PANTALLA
interval=59m

# INICIO DEL SCRIPT
cd $path

# BUCLE PRINCIPAL DEL SCRIPT
while true
do
  files=()

  for i in *.jpg *.png;
  do
    [[ -f $i ]] && files+=("$i")
  done

  range=${#files[@]}

  CURRENT_WALLPAPER="${files[RANDOM % range]}"
  CURRENT_IMAGE=$path"/"$CURRENT_WALLPAPER

  ((range)) && feh --bg-scale "$CURRENT_WALLPAPER"

  #
  # ENVIAMOS LA NOTIFICACIÓN AL SISTEMA PARA QUE SE VEA EN PANTALLA
  #
  notify-send -i "$CURRENT_IMAGE" 'Desktop Changed' "$(basename -- "$CURRENT_WALLPAPER")"

  sleep $interval
done

El script en esencia es muy simple. Lo único que hace es poner en un array todos los archivos del directorio que le indicas donde estarán las imágenes (wallpapers), para que cada X minutos (interval) que hayas configurado haga el cambio de fondo de pantalla y te notifique (notify-send) de dicho cambio. Se necesita el paquete libnotify-bin para que te avise del cambio.

Lo único que queda es configurar el fichero de i3-wm para que:

  • Haga la carga inicial del wallpaper
  • Inicie el script del cambio de wallpaper, que a su vez tomará el control y cada X tiempo (según tengas configurado) irá realizando el cambio de fondo de pantalla

Para que funcione, tienes que añadir lo siguiente en el fichero de configuración:

# PARA VISUALIZAR EL FONDO DE PANTALLA
exec_always --no-startup-id feh --bg-scale --no-fehbg ~/.config/wallpapers/Wallpaper_10.jpg

# AQUÍ SE CONFIGURA EL CAMBIO AUTOMÁTICO DEL WALLPAPER
exec --no-startup-id ~/.config/i3/scripts/wallpaper.sh &

La otra modificación que he realizado ha sido la de que en la barra de i3-wm (i3blocks) me informe de los paquetes que se tienen que actualizar. Era una información que me gustaba tener y después de mucho buscar, encontré el comando / instrucción que me daba lo que necesitaba.

Lo primero, necesitas el script apt-upgrades y descargarlo en algún sitio desde donde puedas tener acceso. En mi caso lo he dejado en el directorio de i3-wm/scripts, que es donde tengo todos los scripts que uso para i3-wm.

El script en cuestión (tener en cuenta que depende de aptitude) hace lo siguiente:

#!/usr/bin/env bash
#
# Copyright (C) 2015 James Murphy
# Licensed under the terms of the GNU GPL v2 only.
#
# i3blocks blocklet script to display pending system upgrades

PENDING_SYMBOL=${PENDING_SYMBOL:-""}
SYMBOL_ONLY=${SYMBOL_ONLY:-0}
ALWAYS_PRINT=${ALWAYS_PRINT:-1}

PENDING_COLOR=${PENDING_COLOR:-"#FF0000"}
NONPENDING_COLOR=${NONPENDING_COLOR:-"#FFFFFF"}

while getopts s:oc:n:Nh opt; do
    case "$opt" in
        s) PENDING_SYMBOL="$OPTARG" ;;
        o) SYMBOL_ONLY=1 ;;
        c) PENDING_COLOR="$OPTARG" ;;
        n) NONPENDING_COLOR="$OPTARG" ;;
        N) ALWAYS_PRINT=0 ;;
        h) printf "Usage..." && exit 0;;
    esac
done

read upgraded new removed held < <(
aptitude full-upgrade --simulate --assume-yes |\
    grep -m1 '^[0-9]\+ packages upgraded,' |\
    tr -cd '0-9 ' |\
    tr ' ' '\n' |\
    grep '[0-9]\+' |\
    xargs echo)

if [[ $upgraded != 0 ]] || [[ $new != 0 ]] || [[ $removed != 0 ]] || [[ $held != 0 ]]; then
    color="$PENDING_COLOR"
    echo "$PENDING_SYMBOL$upgraded/$new/$removed/$held"
elif [[ $ALWAYS_PRINT == 1 ]]; then
    color="$NONPENDING_COLOR"
    echo "$PENDING_SYMBOL$upgraded/$new/$removed/$held"
fi

Una vez tengas el script, vamos a la configuración del archivo de i3block.conf:

[apt_upgrades]
command=/home/usuari/.config/i3/scripts/apt-upgrades
interval=1440
signal=1
label=

Cuando ya tenemos configurada toda la parte del usuario, solamente nos queda configurar la parte de root, que es el encargado de realizar el aptitude update para actualizar los paquetes y que a su vez hace que el script obtenga los paquetes a actualizar.

Para eso, tenemos que hacer lo siguiente (a través de sudo, en mi caso):

sudo -i

Una vez tenemos acceso a la consola de root, pasamos a configurar el cron:

crontab -e

Ahora pasamos a la creación de nuestro cron:

@daily aptitude update

Y con este sencillo script obtenemos la siguiente información:

  • Los paquetes a actualizar
  • Los nuevos paquetes que se van a instalar
  • Los paquetes que se van a eliminar
  • Los paquetes que no se actualizarán

Todo esto, claro está, siempre que realices la actualización.

En pantalla quedaría de la siguiente manera:

◇ Referencia