Notification framework

Tagged:

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 :

#!/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 !