#include #include #include #include #include "notificationmonitor.h" #include "notifications_adaptor.h" static NotificationMonitor *global_monitor = 0; NotificationMonitor::NotificationMonitor(QObject *parent) : QObject(parent) { QDBusConnection bus = QDBusConnection::sessionBus(); QDBusConnectionInterface *dbus = bus.interface(); dbus->call("AddMatch", "interface='org.freedesktop.Notifications',member='Notify',type='method_call',eavesdrop='true'"); new NotificationsAdaptor(this); bus.registerObject("/org/freedesktop/Notifications", this); } NotificationMonitor::~NotificationMonitor() { QDBusConnection bus = QDBusConnection::sessionBus(); QDBusConnectionInterface *dbus = bus.interface(); dbus->call("RemoveMatch", "interface='org.freedesktop.Notifications',member='Notify',type='method_call',eavesdrop='true'"); } NotificationMonitor *NotificationMonitor::instance() { if (!global_monitor) { global_monitor = new NotificationMonitor; } return global_monitor; } uint NotificationMonitor::Notify(const QString &app_name, uint replaces_id, const QString &app_icon, const QString &summary, const QString &body, const QStringList &actions, const QVariantHash &hints, int expire_timeout) { QIcon icon; qDebug() << "Got notification" << app_name << app_icon << summary << body; // Avoid sending a reply for this method call, since we've received it // because we're eavesdropping. // The actual target of the method call will send the proper reply, not us. Q_ASSERT(calledFromDBus()); setDelayedReply(true); if (app_icon.startsWith("/")) { icon = QIcon(app_icon); } else if (app_icon.startsWith("file:")) { QUrl url(app_icon); icon = QIcon(url.toLocalFile()); } else { icon = QIcon::fromTheme(app_icon); } emit incomingNotification(app_name, icon, summary, body); return 0; }