Listening to incoming libnotify notifications using DBus
I am attempting to filter every notification through espeak. However, I can't seem to find a way to get the notification body from a python script, or even what signal_name to listen to.
bus.add_signal_receiver(espeak,
dbus_interface="org.freedesktop.Notifications",
signal_name="??")
Trying to google for this only seems to yield results involving creating new notifications, so I am completely lost now.
Anyone can help me with this?
In short, what I want is to listen for incoming notifications using python, and obtaining the "body" attribute of the notification.
Solution 1:
To keep this up to date: from dbus 1.5.something an extra parameter is required when adding a match string with bus.add_match_string_non_blocking
to make sure we receive everything.
The resulting code would be the following:
import glib
import dbus
from dbus.mainloop.glib import DBusGMainLoop
def notifications(bus, message):
print [arg for arg in message.get_args_list()]
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
bus.add_match_string_non_blocking("eavesdrop=true, interface='org.freedesktop.Notifications', member='Notify'")
bus.add_message_filter(notifications)
mainloop = glib.MainLoop()
mainloop.run()
Solution 2:
By notifications you mean the "OSD bubbles" that some software sends, like changing volume, IM chat, etc? You want to create a python program to capture those?
Well, Ask Ubuntu is not a programmer's QA, and software development is a bit beyond the scope, but here is a little code I did do capture notification bubbles:
import glib
import dbus
from dbus.mainloop.glib import DBusGMainLoop
def notifications(bus, message):
if message.get_member() == "Notify":
print [arg for arg in message.get_args_list()]
DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
bus.add_match_string_non_blocking("interface='org.freedesktop.Notifications'")
bus.add_message_filter(notifications)
mainloop = glib.MainLoop()
mainloop.run()
Leave this running in a terminal, then open another terminal window and test it:
notify-send --icon=/usr/share/pixmaps/debian-logo.png "My Title" "Some text body"
And the program will output this:
[dbus.String(u'notify-send'), dbus.UInt32(0L), dbus.String(u'/usr/share/pixmaps/debian-logo.png'), dbus.String(u'My Title'), dbus.String(u'Some text body'),...
As you may have guessed, message.get_args_list()[0]
is the sender, [2] for icon, [3] for summary and [4] for body text.
For the meaning of the other fields, check the official specification docs