Notification framework
Une particularité du bureau gnome 2.14 est qu'il utilise un nouveau système de notification. Alors qu'est ce que c'est ? c'est grosso modo le truc qui vous informe de ce qu'il se passe sur votre PC (attention batterie faible, plus d'espace disque ...). Ca s'appelle notification framework (regardez ici ils en cosent !)
Nonobstant la longueur des recherches, j'ai trouvé un certain nombre de choses que voici :
- Le framework porte un nom ... il s'appelle galago !
- Il utilise libnotify ce qui ne m'arange pas puisque python n'a pas de bindings qui vont bien
- Par contre il a la formidable idée d'utiliser dbus qui est formidable pour sa portabilité interlangages ;)
- là j'ai cherché comment utiliser dbus avec python mais en vain ...
- J'ai par contre trouvé les spécif dbus de galago
- j'ai aussi éxploré "alamano" l'api dbus pour python :
#!/usr/bin/env python import dbus interface = 'org.freedesktop.Notifications' path = '/org/freedesktop/Notifications' bus = dbus.SessionBus() obj = bus.get_object('org.freedesktop.DBus', '/org/freedesktop/DBus') dbus_iface = dbus.Interface(obj, 'org.freedesktop.DBus') avail = dbus_iface.ListNames() print avail print interface in avail obj = bus.get_object(interface, path) print dbus.Interface(obj, interface) print dbus print dir(dbus)
Donc voila une classe qui va bien et qui fait ce que je veux :
#!/usr/bin/env python import dbus class Notification: def __init__(self): self.app_name = "" self.replaces_id = 0 self.app_icon = "" self.summary = "" self.body = "" self.actions = [] self.hints = {} self.expire_timeout = 1000 try: session_bus = dbus.SessionBus() obj = session_bus.get_object("org.freedesktop.Notifications","/org/freedesktop/Notifications") self.interface = dbus.Interface(obj, "org.freedesktop.Notifications") except Exception: self.interface = None def setAppName(self, app_name): self.app_name = app_name def setReplacesId(self, replaces_id): self.replaces_id = replaces_id def setIcon(self, app_icon): self.app_icon = app_icon def setSummary(self, summary): self.summary = summary def setBody(self, body): self.body = body def addAction(self, action): t.append(action) def addHint(self, hint): pass # TODO def setTimeout(self, expire_timeout): self.expire_timeout = expire_timeout * 1000 def setMSTimeout(self, expire_timeout): self.expire_timeout = expire_timeout def notify(self): self.interface.Notify(self.app_name, self.replaces_id, self.app_icon, self.summary, self.body, self.actions, self.hints, self.expire_timeout) notif = Notification() notif.setAppName("AppliTest") notif.setSummary("Notification quand tu nous tiens") notif.setBody("Voici mon premier test on va faire un texte un temps soit peu long pour voir comment se comporte la boite quand le texte est long ... un texte court n'aurait peut etre pas donne le meme effet !!!") notif.setIcon("/usr/share/pixmaps/vlc.png") notif.setTimeout(7) notif.notify()
et son résultat prometeur vous allez constater par vous même :

La prochaine étape étant de rajouter les fonctionnalités de Hint et d'Actions qui vont bien, programmer tout ça correctement, utiliser les fonctionalités offertes par galago qui ont l'air d'être assez nombreuses ... mais si j'avance dans tout ça je complèterai !!! En attendant ça nous fait a tous une bonne base de départ !

Comments
Super intéressant ! Mais pas très élégant ;p
Pourquoi ne pas faire :
notif.summary = "Notification quand tu nous tiens"
(etc...)
Et virer tous les appels à des sets ?
Du coup ta classe est beaucoup plus courte :)
En tout cas merci, je vais essayer de faire quelquechose d'intéressant avec.
Parce que quand tu fais de l'objet tu présupposes que tous les membres d'une classes sont privés et que l'accès extérieur doit être controlé au minimum avec des getter/setters ... Evidemment dans ce cas la ça sert a rien mais si tu veux que le fait de définir un summary agisse sur autre chose il faut une fonction quelque part ...
Bon python propose d'autres solutions pour résoudre ce problème, mais la solution la plus élégante c'est encore un get/set !
Dans ce cas là, si tu veux faire propre, dérive ta classe de `object` et utilise property().
Si vraiment tu es perfectionniste, __slots__ est ton ami ;).
Je connais pas slots, mais quand je disais que Python offrait d'autres moyen de résoudre le problème, je pensais effectivement a Property !!! mais c'est une particularité de Python, c'est pas possible en Java par exemple...
C'est néanmoins [url=users.rcn.com/python/down... solution toute aussi longue finalement...[/url]
Remarque, un peu après coup, mais ça peut toujours servir: il existe une documentation dbus pour python, maintenant. Je ne l'ai pas lue, mais ça peut être bon à savoir !
C'est ici:
dbus-python tutorial
Très précieux comme doc, merci de l'avoir postée ici !