diff options
Diffstat (limited to 'src/daemon/NotificationsService.cpp')
-rw-r--r-- | src/daemon/NotificationsService.cpp | 144 |
1 files changed, 112 insertions, 32 deletions
diff --git a/src/daemon/NotificationsService.cpp b/src/daemon/NotificationsService.cpp index 9ee757b..7709965 100644 --- a/src/daemon/NotificationsService.cpp +++ b/src/daemon/NotificationsService.cpp @@ -23,25 +23,26 @@ * */ +#include <tdeapplication.h> + #include "NotificationsService.h" -#define NOTIFICATIONS_DBUS_PATH "/org/freedesktop/Notifications" #define IMAGE_SIZE 48 -#define SRV_VERSION "1.1" -#define SPEC_VERSION "1.1" +#define SRV_VERSION "1.2" +#define SPEC_VERSION "1.2" #define NOTIFICATIONS_NAME "Notification Daemon" #define TRINITY_DESKTOP_PROJECT "Trinity Desktop Project" NotificationsService::NotificationsService(TQT_DBusConnection &conn) -: org::freedesktop::NotificationsInterface(), mConnection(&conn) +: org::freedesktop::NotificationsInterface(), mConnection(&conn), + mNotificationId(0) { - // TODO Auto-generated constructor stub } NotificationsService::~NotificationsService() { - // TODO Auto-generated destructor stub + notificationMap.clear(); } void NotificationsService::closeNotifyWidget(TQ_UINT32 id, TQ_UINT32 reason) { @@ -57,20 +58,22 @@ void NotificationsService::closeNotifyWidget(TQ_UINT32 id, TQ_UINT32 reason) { } bool NotificationsService::handleSignalSend(const TQT_DBusMessage& reply) { - mConnection->send(reply); return true; } TQString NotificationsService::objectPath() const { - return TQString(NOTIFICATIONS_DBUS_PATH); } bool NotificationsService::GetCapabilities(TQStringList& return_caps, TQT_DBusError& error) { return_caps.clear(); - return_caps << "action-icons" << "actions" << "body" << "body-hyperlinks" << "body-markup" << "icon-static"; + // action-icons, actions are not implemented + // hints are partially implemented (see Capabilities in the docs) + // - persistence and sound + return_caps << "body" << "body-hyperlinks" << "body-images" << + "body-markup" << "icon-static" << "persistence" << "sound"; return true; } @@ -97,38 +100,115 @@ bool NotificationsService::GetServerInformation(TQString& return_name, TQString& void NotificationsService::NotifyAsync( int asyncCallId, - const TQString& app_name, TQ_UINT32 id, const TQString& icon, - const TQString& summary, const TQString& body, + const TQString& app_name, + TQ_UINT32 id, + const TQString& icon, + const TQString& summary, + const TQString& body, const TQStringList& actions, - const TQMap<TQString, TQT_DBusVariant>& hints, TQ_INT32 timeout) + const TQMap<TQString, TQT_DBusVariant>& hints, + TQ_INT32 timeout) { - if (notificationMap.contains(id)) + TQ_UINT32 nId=id; +// if (nId != 0 && !notificationMap.contains(nId)) +// tqDebug("Requested id %i is not valid", nId); + bool found = notificationMap.contains(nId); + if (nId == 0 || !notificationMap.contains(nId)) // new notification + { + nId = ++mNotificationId; + notificationMap[nId] = new NotifyWidget(0, app_name.ascii(), this, nId); + } + + if(!hints.empty()) { - NotifyAsyncError(asyncCallId, TQT_DBusError::stdFailed("Requested id already displayed")); - tqDebug("Requested id %i already in use", id); - return; + TQString errStr; + TQMap<TQString, TQT_DBusVariant>::const_iterator it; + for ( it = hints.begin(); it != hints.end(); ++it ) { + bool ok = true; + if(it.key().latin1()=="category") + { + notificationMap[nId]->setCategory(it.data().value.toString(&ok)); + if(!ok) errStr += " category"; + } + else if (it.key().latin1()=="image-path") + { + notificationMap[nId]->setImage(it.data().value.toString(&ok)); + if(!ok) errStr += " image-path"; + } + else if (it.key().latin1()=="image-data" || it.key().latin1()=="image_data" || it.key().latin1()=="icon_data") + { + notificationMap[nId]->setImageData(it.data().value.toTQValueList(&ok)); + if(!ok) errStr += " image-data"; + } + else if (it.key().latin1()=="sound-file") + { + notificationMap[nId]->setSoundFile(it.data().value.toString(&ok)); + if(!ok) errStr += " sound-file"; + } + else if (it.key().latin1()=="sound-name") + { + notificationMap[nId]->setSoundName(it.data().value.toString(&ok)); + if(!ok) errStr += " sound-name"; + } + else if (it.key().latin1()=="suppress-sound") + { + notificationMap[nId]->setSuppressSound(it.data().value.toBool(&ok)); + if(!ok) errStr += " suppress-sound"; + } + else if (it.key().latin1()=="transient") + { + notificationMap[nId]->setTransient(it.data().value.toBool(&ok)); + if(!ok) errStr += " transient"; + } + else if (it.key().latin1()=="urgency") + { + notificationMap[nId]->setUrgency(it.data().value.toUInt16(&ok)); + if(!ok) errStr += " urgency"; + } + else if (it.key().latin1()=="sender-pid") + { + notificationMap[nId]->setSenderPid(it.data().value.toUInt64(&ok)); + if(!ok) errStr += " sender-pid"; + } + } + if(! errStr.isNull() ) + tqDebug("There was an error converting some of the hint values:" + errStr); } - notificationMap[id] = new NotifyWidget(0, app_name.ascii(), this, id ); - notificationMap[id]->setFrameStyle( TQFrame::NoFrame ); - notificationMap[id]->setPaletteBackgroundColor(TQt::black); - notificationMap[id]->setPaletteForegroundColor(TQt::white); + notificationMap[nId]->setFrameStyle( TQFrame::NoFrame ); +// notificationMap[nId]->setPaletteBackgroundColor(TQt::black); +// notificationMap[nId]->setPaletteForegroundColor(TQt::white); - if (icon.isEmpty() || ! notificationMap[id]->setIcon(icon)) { - notificationMap[id]->setTextFormat(TQt::RichText); - notificationMap[id]->setText(app_name + ":\n" + summary + "\n" + body); + if (icon.isEmpty() || ! notificationMap[nId]->setIcon(icon)) { + notificationMap[nId]->setTextFormat(TQt::RichText); + notificationMap[nId]->setText(app_name + ":\n" + summary + "\n" + body); + } + notificationMap[nId]->setActions(actions); + notificationMap[nId]->setTimeout(timeout); + notificationMap[nId]->adjustSize(); + notificationMap[nId]->raise(); + notificationMap[nId]->show(); + notificationMap[nId]->setActiveWindow(); + + // make sure we display the new notification above the older one + // and if we reach the top of the screen we start at the bottom + TQDesktopWidget *d = TQApplication::desktop(); + if (notificationMap.contains(nId-1) && notificationMap[nId-1] != 0) { + TQPoint pos = notificationMap[nId-1]->pos(); + if(pos.y()-notificationMap[nId-1]->height() < 0) + pos.setY(d->height()-notificationMap[nId]->height()); + pos.setX(d->width()-notificationMap[nId]->width()); + notificationMap[nId]->move(pos.x(),pos.y()-notificationMap[nId-1]->height()); + } else { + notificationMap[nId]->move( d->width()-notificationMap[nId]->width(), + d->height()-notificationMap[nId]->height()); } - notificationMap[id]->setActions(actions); - notificationMap[id]->setHints(hints); - notificationMap[id]->setTimeout(timeout); - notificationMap[id]->adjustSize(); - notificationMap[id]->raise(); - notificationMap[id]->show(); - notificationMap[id]->setActiveWindow(); - - NotifyAsyncReply(asyncCallId, id); + + NotifyAsyncReply(asyncCallId, nId); } void NotificationsService::handleMethodReply(const TQT_DBusMessage& reply) { mConnection->send(reply); } + + |