X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fqtui%2Fstatusnotifieritem.cpp;h=8d7972f453015ceb9cbcbaba0a1b48c47ab91113;hb=97553ea9232d59dab4a57ece9266c9449b0d0d76;hp=4df13dc5ebe1041204150a1a92e4bdd68b510d0b;hpb=4476cfb22f36ad9ba96e4978c3bcce1c2f6b5a04;p=quassel.git diff --git a/src/qtui/statusnotifieritem.cpp b/src/qtui/statusnotifieritem.cpp index 4df13dc5..8d7972f4 100644 --- a/src/qtui/statusnotifieritem.cpp +++ b/src/qtui/statusnotifieritem.cpp @@ -26,22 +26,26 @@ #include "statusnotifieritem.h" #include "statusnotifieritemdbus.h" +#include #include #include +#include const int StatusNotifierItem::_protocolVersion = 0; StatusNotifierItem::StatusNotifierItem(QWidget *parent) : StatusNotifierItemParent(parent), _statusNotifierItemDBus(0), - _statusNotifierWatcher(0) + _statusNotifierWatcher(0), + _notificationsClient(0), + _notificationsClientSupportsMarkup(true), + _lastNotificationsDBusId(0) { } StatusNotifierItem::~StatusNotifierItem() { delete _statusNotifierWatcher; - } void StatusNotifierItem::init() { @@ -51,11 +55,25 @@ void StatusNotifierItem::init() { _statusNotifierItemDBus = new StatusNotifierItemDBus(this); + connect(this, SIGNAL(toolTipChanged(QString,QString)), _statusNotifierItemDBus, SIGNAL(NewToolTip())); + connect(this, SIGNAL(animationEnabledChanged(bool)), _statusNotifierItemDBus, SIGNAL(NewAttentionIcon())); + connect(QDBusConnection::sessionBus().interface(), SIGNAL(serviceOwnerChanged(QString,QString,QString)), SLOT(serviceChange(QString,QString,QString))); setMode(StatusNotifier); + _notificationsClient = new org::freedesktop::Notifications("org.freedesktop.Notifications", "/org/freedesktop/Notifications", + QDBusConnection::sessionBus(), this); + + connect(_notificationsClient, SIGNAL(NotificationClosed(uint,uint)), SLOT(notificationClosed(uint,uint))); + connect(_notificationsClient, SIGNAL(ActionInvoked(uint,QString)), SLOT(notificationInvoked(uint,QString))); + + if(_notificationsClient->isValid()) { + QStringList desktopCapabilities = _notificationsClient->GetCapabilities(); + _notificationsClientSupportsMarkup = desktopCapabilities.contains("body-markup"); + } + StatusNotifierItemParent::init(); trayMenu()->installEventFilter(this); } @@ -72,7 +90,7 @@ void StatusNotifierItem::registerToDaemon() { _statusNotifierWatcher->RegisterStatusNotifierItem(_statusNotifierItemDBus->service()); } else { - qDebug() << "StatusNotifierWatcher not reachable!"; + //qDebug() << "StatusNotifierWatcher not reachable!"; setMode(Legacy); } } @@ -117,6 +135,20 @@ void StatusNotifierItem::serviceChange(const QString& name, const QString& oldOw } } +bool StatusNotifierItem::isSystemTrayAvailable() const { + if(mode() == StatusNotifier) + return true; // else it should be set to legacy on registration + + return StatusNotifierItemParent::isSystemTrayAvailable(); +} + +bool StatusNotifierItem::isVisible() const { + if(mode() == StatusNotifier) + return shouldBeVisible(); // we don't have a way to check, so we need to trust everything went right + + return StatusNotifierItemParent::isVisible(); +} + void StatusNotifierItem::setMode(Mode mode_) { StatusNotifierItemParent::setMode(mode_); @@ -132,6 +164,21 @@ void StatusNotifierItem::setState(State state_) { emit _statusNotifierItemDBus->NewIcon(); } +void StatusNotifierItem::setVisible(bool visible) { + LegacySystemTray::setVisible(visible); + + if(mode() == StatusNotifier) { + if(shouldBeVisible()) { + _statusNotifierItemDBus->registerService(); + registerToDaemon(); + } else { + _statusNotifierItemDBus->unregisterService(); + _statusNotifierWatcher->deleteLater(); + _statusNotifierWatcher = 0; + } + } +} + QString StatusNotifierItem::title() const { return QString("Quassel IRC"); } @@ -144,7 +191,10 @@ QString StatusNotifierItem::iconName() const { } QString StatusNotifierItem::attentionIconName() const { - return QString("quassel_message"); + if(animationEnabled()) + return QString("quassel_message"); + else + return QString("quassel"); } QString StatusNotifierItem::toolTipIconName() const { @@ -174,4 +224,44 @@ bool StatusNotifierItem::eventFilter(QObject *watched, QEvent *event) { return StatusNotifierItemParent::eventFilter(watched, event); } +void StatusNotifierItem::showMessage(const QString &title, const QString &message_, SystemTray::MessageIcon icon, int timeout, uint notificationId) { + QString message = message_; + if(_notificationsClient->isValid()) { + if(_notificationsClientSupportsMarkup) + message = Qt::escape(message); + + QStringList actions = QStringList() << "activate" << "View"; + + // we always queue notifications right now + QDBusReply reply = _notificationsClient->Notify(title, 0, "quassel", title, message, actions, QVariantMap(), timeout); + if(reply.isValid()) { + uint dbusid = reply.value(); + _notificationsIdMap.insert(dbusid, notificationId); + _lastNotificationsDBusId = dbusid; + } + } else + StatusNotifierItemParent::showMessage(title, message, icon, timeout, notificationId); +} + +void StatusNotifierItem::closeMessage(uint notificationId) { + foreach(uint dbusid, _notificationsIdMap.keys()) { + if(_notificationsIdMap.value(dbusid) == notificationId) { + _notificationsIdMap.remove(dbusid); + _notificationsClient->CloseNotification(dbusid); + } + } + _lastNotificationsDBusId = 0; +} + +void StatusNotifierItem::notificationClosed(uint dbusid, uint reason) { + Q_UNUSED(reason) + _lastNotificationsDBusId = 0; + emit messageClosed(_notificationsIdMap.take(dbusid)); +} + +void StatusNotifierItem::notificationInvoked(uint dbusid, const QString &action) { + Q_UNUSED(action) + emit messageClicked(_notificationsIdMap.value(dbusid, 0)); +} + #endif