Atentiendo señales dbus en python
Ya hablé sobre python y dbus hace un tiempo. Ahora vamos a aprender como atender a las señales que se mandan a través de este bus de escritorio. En el interesante tutorial de Pidgin tenemos un buen ejemplo. En este ejemplo se va a atender a la señal que emite pidgin cuando algún amigo se conecta. En el ejemplo de la web se lanza una ventana de notificación.
#!/usr/bin/env python import dbus, gobject, dbus.glib # Initiate a connection to the Session Bus bus = dbus.SessionBus() # Associate Pidgin's D-Bus interface with Python objects obj = bus.get_object( "im.pidgin.purple.PurpleService", "/im/pidgin/purple/PurpleObject") pidgin = dbus.Interface(obj, "im.pidgin.purple.PurpleInterface") # Create a global Pidgin buddy data cache buddy_data_cache = {} def onSignOn(bId): # Extract a Pidgin buddy's name and alias buddyAlias = pidgin.PurpleBuddyGetAlias(bId) buddyName = pidgin.PurpleBuddyGetName(bId) # Generate notification text based on the buddy's name and alias print "Se ha conectado: %s"%(buddyName) # Bind the onSignOn function with Pidgin's BuddySignedOn event bus.add_signal_receiver(onSignOn, dbus_interface="im.pidgin.purple.PurpleInterface", signal_name="BuddySignedOn") # Start the main loop gobject.MainLoop().run()
Como veis es bastante sencillo. Iniciamos un bus de sessión. Obtenemos el objeto de purple (el servicio de pidgin). Creamos una función (onSigOn) que será la que se lance cuando ocurra la señal. Y ya solo nos queda unir esta función con la señal con el método add_signal_receiver. ¿Sencillo no? Como mola python
Para otro día dejo la parte final, crear un “servidor” que se conecte a dbus y atienda peticiones a través de el.