mart-e

La vie, Linux, la tartiflette...

changer de fond d'ecran aléatoirement et adapter conky

Une simple recherche google nous donne de très nombreux moyen de changer de fond d'écran en prenant une image aléatoirement dans un dossier. Par contre je ne pense pas qu'il en existe qui modifie la couleur de votre conky en fonction !

Attention ! Le code source sur cette page n'est plus à jour, veuillez télécharger le code présent sur la page codes.

Petit avertissement ce script ne fonctionne malheureusement que dans gnome. Si quelqu'un connait l'alternative à la commande gconftool pour kde, xfce et les autres, n'hésitez pas.

Ce script est encore tout jeune (date de hier soir) et je vais donc le modifier (améliorer j'espère) au fur et à mesure du temps. N'hésitez aps à me faire part de vos conseils.

Présentation

Conky

Pour ceux qui ne connaissent pas pas, conky est un logiciel pour Linux et FreeBSD qui permet de surveiller à peut prêt tout ce qui se passe sur le disque et de l'afficher sur votre bureau dans un style +/- joli mais certainement très geek. En vrac, il peut vous afficher les processus en cours, l'espace libre de vos disques, la température de votre CPU, la météo, la musique que vous écoutez via MPD,... la liste est très grande et en fait quasi infinie puisque l'on peut intégrer à peut prête n'importe quoi. Si vous avez le temps, jetez un coup d'œil sur google, il y a de quoi satisfaire tout le monde et en se donnant un peu de mal à faire quelque chose de joli.

OpenCV

OpenCV est une librairie libre de vision par ordinateur. C'est celle que j'ai utilisé dans mon script c++. Cette librairie permet de faire vraiment des choses fantastiques. On peut ainsi analyser des images statiques (ce que je fais très simplement dans mon script) mais aussi des vidéos et permettre la détection du mouvement, reconnaissance des visages, interaction avec sa webcam. Ce n'est pas ce qui a de plus facile mais les résultats sont impressionnant de voir ce qu'on peut faire avec des outils distribués gratuitement et librement.
Pour l'utilisation d'OpenCv 2 sous linux, je vous conseille cette page.

Cron

Cron est un utilitaire permettant de planifier des tâches à exécuter à un moment donné. Cet outil est fort populaire sur les jeux web pour permettre de donner des points d'actions toutes les 15 minutes par exemple. Mais sur un ordinateur personnel, il est aussi très pratique pour les tâches d'administration, de sauvegarde,... Nous l'utilisions ici pour faire changer le fond d'écran à un temps déterminé.

Le fonctionnement

Avant la pratique, un peu de théorie pour expliquer le fonctionnement. Ce programme est composé de deux scripts : un bash (je compte regarder pour le transformer en python que je préfère) et un c++ utilisant la librairie OpenCV. Le bash, appelé random-background.sh, commence par sélectionné une image aléatoire dans un dossier donné. Il modifie ensuite le fond d'écran avec la commande gconftool. Le script c++, appelé conkywallpaper est appelé en passant en paramètre le nom de l'image et les dimensions du conky. Avec la couleur retournée par ce dernier, il suffit de modifier la ligne adéquate dans le fichier .conkyrc

J'ai créé un script c++ utilisant la librairie OpenCV qui analyse l'image à l'emplacement du conky et détecte la couleur principale. Ce script scan en fait pixel par pixel dans la zone définie et pour chacun vérifie si la couleur est plutôt noir ou blanche. En fin de compte la couleur qui a le plus de pixel est renvoyée.

En rajoutant une tâche cron

Le code

Bash

[cc lang="bash"]#! /bin/bash
## dependances : randomize-lines

## pour que le script fonctionne via cron
export DISPLAY=0

while read line ; do
echo \$line | grep -vqe "^#"
if [ \$? -eq 0 ]; then export \$line; fi
done \< ~/.dbus/session-bus/\$(cat /var/lib/dbus/machine-id)-\$DISPLAY

## position du conky
widthmin=0.8
widthmax=1
heightmin=0.1
heightmax=0.6
## chemin vers le dossier contenant tout les fonds d'ecran
pathToImage="\$HOME/Images/wallpaper/"

img="`find \$pathToImage -name *.jpg | rl | tail -n 1`"
/usr/bin/gconftool -t str -s /desktop/gnome/background/picture_filename \$img

res="`\$HOME/script/wallpaper/conkywallpaper \$img \$widthmin \$widthmax \$heightmin \$heightmax`"

sed "s/default_color .*/default_color \$res/" \$HOME/.conkyrc > \$HOME/newconky

mv \$HOME/newconky \$HOME/.conkyrc[/cc]

OpenCV

[cc lang="c++"]#include \<opencv/cv.h>
#include \<opencv/highgui.h>
#include \<opencv/cxcore.h>

#include \<algorithm>

#include \<iostream>

IplImage *img;
IplImage *img_nvg;

int main(int n, char *params[])
{

//on verifie l'existance du fichier
FILE* fp = NULL;
fp = fopen(params[1], "rb" );
if( fp != NULL )
{

fclose( fp );

//Initialisations
img=cvLoadImage(params[1]);

int seuil = 127;

int widthmin = img->width * atof(params[2]);
int widthmax = img->width * atof(params[3]);
int heightmin = img->height * atof(params[4]);
int heightmax = img->height *atof(params[5]);

int blanc = 0;
int noir = 0;

CvScalar scalaire;

//On parcourt toute l'image
for(int x=widthmin; x\<widthmax; x++)
{
for(int y=heightmin; y\<heightmax; y++)
{

//On récupère le pixel de coordonnées (x,y)
scalaire=cvGet2D(img, y, x);

//Si le niveau de gris est inférieur à p_min, il devient p_min
if(scalaire.val[0]\<seuil)
{
blanc++;
}
else
{
noir++;
}
}
}

if (blanc > noir)
{
std::cout \<\< "white" \<\< std::endl;
}
else
{
std::cout \<\< "black" \<\< std::endl;
}

}
else
{
std::cout \<\< "fichier n'existe pas" \<\< std::endl;
}

return 0;
}[/cc]

Cron

*/20 * * * * ~/script/wallpaper/random-background.sh

Utilisation

Tout d'abord créez deux fichiers que vous appellerez random-background.sh et conkywallpaper.cpp dans lequel vous copierez le code bash et c++. J'ai placé ces scripts dans le dossier /home/mon_user/script/wallpaper si vous les les placez ailleurs n'oubliez pas de changer le chemin (dans le cron pour le fichier bash et ligne 25 du fichier bash pour le fichier c++). Rendez le script bash exécutable : bouton droit > propriétés > permissions > rendre exécutable ou

\$ chmod +x ~/script/wallpaper/random-background.sh

compilez le script c. Il vous faut avoir installé les paquets (je vous laisse libre de la méthode) libcv1 libcvaux1 libhighgui1 libcv-dev libcvaux-dev libhighgui-dev opencv-doc et puis utilisez la commande dans le répertoire contenant le fichier c++

\$ g++ conkywallpaper.cpp -o conkywallpaper -lcv -lhighgui

qui vous produira un joli fichier conkywallpaper à placer à coté de random-background.

Maintenant passons au cron. Pour modifier la liste de vos tâches faites

\$ crontab -e

et ajoutez la liste la ligne cron que je donne un peu plus haut. Ici c'est réglé pour changé le fond toutes les 20 minutes. Pour plus de détails sur les différentes possibilités, allez voir ici.

L'emplacement vers le dossier qui contient toutes les images est contenu dans la variable pathToImage dans le script bash (ici /home/mon_user/Images/wallaper), la recherche se fait récursivement donc vous pouvez faire des sous-dossier ou des liens vers d'autres dossiers (attention aux boucles infinies) et il ira dedans. Les dimensions du conky sont données dans les 4 premières variables du script bash. 0.8 1 0.1 0.6 signifie que le conky démarre horizontalement à 80% de mon écran jusque le bord droit (100%) et verticalement commence à 10% et se fini à 60%. C'est à vous d'approximer cela.

Si vous avez des remarques n'hésitez pas.