Midilibre.fr
Tous les blogs | Alerter le modérateur| Envoyer à un ami | Créer un Blog

02/10/2008

[screenlets] - Faire son screenlets sous gnome

9b912c025c22ca2d6b27c01886b63d78.pngVous avez du remarquez sur ma capture d'écran de ksnapshot sous kde4.1, qu'il y avait la BD de garfield sur le bureau. J'aime bien cette bd, alors je voulais la même chose sous gnome, j'ai donc installé Screenlets, cela sera l'occasion d'apprendre à faire des Screenlets.

Pré-requis : installer curl qui nous permettra d'analyser la page html de notre vignett et imagemagick pour convertir notre image en png

Analysons maintenant la page http://www.gocomics.com/garfield/  qui fourni la vignette, le lien vers la vignette est http://picayune.uclick.com/comics/ga/2008/ga081002.gif, la partie final du fichier est ce qui change (faisons abstraction du 2008 pour ne pas alourdir le tutorial), l'image fait 600*178 pixels. Nous avons là tout ce qu'il nous faut pour commencer notre screenlets.

Tout d'abors créez un fichier qui va s'appeller garfieldScreenlet.py (il faut respecter la règle du nom_de_l_appletScreenlet.py) et éditez le avec votre éditeur préféré. Comme c'est en python (d'ou l'extension .py) vous allez voir que tout cela va être trés simple.

Etape 1 - la tête du fichier :

Il faut importer les fichiers nécéssaires:

#!/usr/bin/env python
import screenlets
import cairo
import os
import commands
import gtk

cairo et gtk, pour la gestion des images. Screenlets pour avoir les fonctions de screnlets. os et commands pour pouvoir manipuler la page html et en récupérer les informations nécéssaire. 

Etape 2 - Le pied du fichier :

 if __name__ == "__main__":
   import screenlets.session
   screenlets.session.create_session(garfieldScreenlet)

Nous rajoutons ces 3 lignes qui vont nous permettre de lancer une session screenlets dans le cas ou nous appelerions directement le fichier (avec python garfieldScreenlet.py par exemple , trés pratique pour tester)

Etape 3 - La création de la classe : 

 class garfieldScreenlet (screenlets.Screenlet):
   __name__    = 'Affiche Garfield'
   __version__    = '0.0'
   __author__    = 'Stephane de la linuxerie'
   __desc__    = 'Exemple pour afficher Garfield sur le bureau'

Nous laissons donc le nom de la classe en adéquation avec notre nom de fichier, les informations qui suivent permettent d'afficher des informations sur votre screenlets dans le gestionnaire de screenlets qu moment ou vous l'installerez. 

Etape 4 - Les fonctions :

Nous allons avoir 3 fonctions dans notre classe :
__init__ & on_init : qui seront appellé lors de la création de la classe (l'initialisation)
on_draw : qui sera appelé a chaque fois que le screenlets aura un appel de type dessin.

def __init__ (self, **keyword_args):
    screenlets.Screenlet.__init__(self, width=600, height=178, drag_drop=True, **keyword_args)

ici nous déterminons les informations nécéssaire pour la création de l'applet (taille, drag and drop...)

def on_init (self):
    self.add_default_menuitems()
    URL = commands.getoutput("curl -s http://www.gocomics.com/garfield/ | grep -o --regexp='http://picayune.uclick.com/comics/ga/2008/.*.gif' | head -n 1")
    os.system("wget "+ URL +" -O "+ self.get_screenlet_dir() +"/tmp.gif")          
    os.system("convert "+ self.get_screenlet_dir() +"/tmp.gif "+ self.get_screenlet_dir() +"/current.png")
    self.redraw_canvas()

Ligne 1 nous rajoutons les menu par défaut (zoom, fermeture du screenlets....)
Ligne 2 nous stockons dans la variable URL le retour de la commande utilisant curl et grep, le principe est simple curl retourne le contenu de la page, grep récupére le lien avec un regexp
Ligne 3 comme nous avons le lien vers l'image nous la récupérons et la stockons dans un fichier temporaire que nous appelerons tmp.gif dans le répertoire du screenlet ( get_screenlet_dir() )
Ligne 4 cairo ne gérant pas les gif nous sommes obligé de convertir le fichier en png
Ligne 5 nous forçons le screenlets a se "redessiner" qui appelera la fonction on_draw()

def on_draw (self, ctx):
    img = cairo.ImageSurface.create_from_png(self.get_screenlet_dir() + "/current.png")
    ctx.set_source_surface(img, 0, 0)
    ctx.paint()

Ligne 1 la variable img, est une surface pour cairo crée avec notre png (current.png)
Ligne 2 nous attribuons notre img au screenlets
Ligne 3 on affiche l'ensemble

4 Etapes pour créer un screenlets tout simple... vous pouvez le tester en lancant python garfieldScreenlet.py.

La dernière étape est la création que paquet screenlets, celui qui va pouvoir être intégré dans le manager de screenlets. cela est aussi extremement simple admettons que votre fichier est dans un dossier grafiled il suffit de taper : 
screenlets-packager garfield

Il ne vous reste plus qu'a l'importer dans le gestionnaire de screenlets. Ce programme n'est pas parfait loin de là, il permet juste de mettre en évidence la simplicité de création d'un screenlets.L'ajout de menu supplémentaire étant également trés simple. (je l'aborderais lors d'une prochaine note)

Voici le fichier dans son ensemble ici