PDA

View Full Version : Script per cambiare sfondo automaticamente su gnome 2


cerbert
18-11-2005, 16:11
Ciao a tutti,
dopo mesi di ricerca, insoddisfatto dai vari programmini datati, dalle gdesklets beta, dal dover sopprimere nautilus come gestore del desktopbkg nonostante le sue funzioni utili, mi sono finalmente chiesto: "ma non è che sto sbagliando tutto e la soluzione è più semplice di quanto credo?".
Ebbene, come per il 99% delle cose che riguardano Linux... lo era.
Quanto segue è il risultato della consultazione di due man e dell'help di gnome.


#!/bin/bash

declare -i LAST_WP=`cat /home/cerbert/.last_wallpaper`
declare -i WP_SIZE
declare WP_STYLE
declare -a lista_files
WP_PATH=/home/cerbert/documents/immagini/wallpapers/
lista_files=(`ls $WP_PATH`)

if [ $LAST_WP -ge ${#lista_files } ]
then
LAST_WP=0
fi

IMAGE_FILE=${lista_files[$LAST_WP]}
THIS_WP=$[LAST_WP+1]

echo $THIS_WP > /home/cerbert/.last_wallpaper

WP_SIZE=`/usr/bin/identify -format %h $WP_PATH$IMAGE_FILE`

if [ $WP_SIZE -ge 750 ]
then
WP_STYLE="scaled"
else
WP_STYLE="centered"
fi

gconftool-2 -s "/desktop/gnome/background/picture_options" --type string $WP_STYLE -s "/desktop/gnome/background/picture_filename" --type string $WP_PATH$IMAGE_FILE

unset lista_files



Cosa fa?
Molto semplice:



declare -i LAST_WP=`cat /home/cerbert/.last_wallpaper`


dichiara una variabile e la riempie con un numero scritto in un file apposito.


declare -a lista_files
WP_PATH=[percorso assoluto della cartella dove tenete i wallpapers]
lista_files=(`ls $WP_PATH`)


dichiara un array e lo riempie con tutti i nomi files presenti in una cartella apposita . Due accorgimenti:
1) i nomi devono essere regolari, niente spazi ne caratteri strani.
2) non ci devono essere null'altro che immagini


if [ $LAST_WP -ge ${#lista_files } ]
then
LAST_WP=0
fi


controlla che l'indice dell'immagine che vogliamo caricare non sia superiore al numero di immagini presenti nella cartella. Altrimenti riparte dalla prima (indice 0)


IMAGE_FILE=${lista_files[$LAST_WP]}
THIS_WP=$[LAST_WP+1]


Ricava il nome dell'immagine all'indice, incrementa poi di uno l'indice (i nomi delle variabili non sono proprio corretti, ma abbiate pazienza, avevo cambiato il codice in corso d'opera).


echo $THIS_WP > /home/cerbert/.last_wallpaper


Registra l'indice aggiornato nel file in modo che non si reinizi sempre da 0 ad ogni riavvio.


WP_SIZE=`/usr/bin/identify -format %h $WP_PATH$IMAGE_FILE`

if [ $WP_SIZE -ge 750 ]
then
WP_STYLE="scaled"
else
WP_STYLE="centered"
fi


Grazie al comando "identify" facente parte del pacchetto ImageMagick (ATTENZIONE: NON TUTTE LE DISTRIBUZIONI PORTANO IMAGEMAGICK DI DEFAULT. SE NON LO AVETE, SCARICATELO CHE E' DI MOLTO FIGO!!) con argomento -format %h ottiene l'altezza in pixel dell'immagine. Dopo di che fa un confronto con un parametro fisso (altezza standard della risoluzione schermo... immagino si possa anche ricavare con un comando, ma non ho voglia di sbattermi, tanto io la tengo sempre al massimo sul portatile :P ) e se l'immagine "sfora" imposta la modalità "scalata", se invece resta nei limiti, imposta la modalità "centrata" nella variabile che abbiamo preimpostato.


gconftool-2 -s "/desktop/gnome/background/picture_options" --type string $WP_STYLE -s "/desktop/gnome/background/picture_filename" --type string $WP_PATH$IMAGE_FILE

unset lista_files


E finalmente setta il background tramite gconftool-2 impostandone anche il modo (scalato o centrato).
Quindi, per pulizia, cancella l'array.

Infine, come ultimo passo, nella crontab dell'utente andate a settare l'intervallo di escuzione che ritenete più opportuno, questo il mio (5 minuti):


SHELL=/bin/bash
*/5 * * * * /home/cerbert/usr_scripts/ch_wp > /dev/null 2>&1


In una sera ho risolto un problema che mi assillava da mesi... certo, direte voi, di tempo da perdere ne ho. :D

PiloZ
18-11-2005, 21:31
WP_PATH=/home/cerbert/documents/immagini/wallpapers/
lista_files=(`ls $WP_PATH`)


per evitare questo problema:

2) non ci devono essere null'altro che immagini

potresti migliorarlo con una cosa del genere:
lista_files=(`ls $WP_PATH{*.jpg,*.png}`)
riguarda la sintassi perchè mi trovo a lavoro e non posso terstarlo :)

cerbert
21-11-2005, 08:57
per evitare questo problema:

potresti migliorarlo con una cosa del genere:
lista_files=(`ls $WP_PATH{*.jpg,*.png*.}`)
riguarda la sintassi perchè mi trovo a lavoro e non posso terstarlo :)

Interessante, ci provo quanto prima...
Stavo anche cercando di vedere se riesco ad avere da qualche eseguibile un analisi delle dimensioni in pixel, in questo modo posso cambiare da "centrato" a "scalato" le impostazioni del WP.

PiloZ
21-11-2005, 11:27
Interessante, ci provo quanto prima...
Stavo anche cercando di vedere se riesco ad avere da qualche eseguibile un analisi delle dimensioni in pixel, in questo modo posso cambiare da "centrato" a "scalato" le impostazioni del WP.
occhio che c'è un *. finale di troppo :)

cerbert
21-11-2005, 13:07
occhio che c'è un *. finale di troppo :)

Tranquillo, nonostante io sia un programmatore (e giù grasse risate) non vado di copiincolla per pezzi così brevi di codice...
:D

gefri
11-01-2006, 17:16
innanzitutto ringrazio cerbert per i pm, però rispondo qui;
vorrei sapere se questo script va bene anche su k3b, e, se è possibile far si che lo sfondo cambi ogni primo del mese, o, se non è possibile, sapere se i minuti vengono contati anche a pc spento; grazie ancora!

cerbert
26-01-2006, 12:01
Ho trovato finalmente il tempo per rimettere mano allo script e, grazie al potere di ImageMagick, ho sistemato le cose in modo che nella cartella uno possa mettere immagini di QUALUNQUE dimensione e trovarsele adattate al proprio schermo (a seconda di quello che preferisce).

@gefri (scusandomi per il ritardo).
Immagino che tu intenda KDE. Mi pare di ricordare che KDE lo avesse di default un "wallpaper rotator", se no sono sicuro che abbia un equivalente di gconftool, controlla il suo help on-line.
Per cambiare lo sfondo ad ogni primo del mese, basta modificare opportunamente crontab, fai riferimento ad un qualsiasi "crontab HOWTO".
I minuti, ovviamente, NON vengono contati a PC spento.