The tray icon now blinks as long as there are still buffers with unread highlights. As
added bonus, repeated clicks on the tray icon now switch to the next highlighted buffer in
line (rather than hiding the window).
Also, notifications (in KDE) will be properly closed as soon as you switch to the appropriate
buffer.
After all highlighted buffers have been visited, the icon stops blinking. Fixes #720.
#include "systemtray.h"
KNotificationBackend::KNotificationBackend(QObject *parent)
#include "systemtray.h"
KNotificationBackend::KNotificationBackend(QObject *parent)
-: AbstractNotificationBackend(parent),
- _lastNotificationId(0)
+: AbstractNotificationBackend(parent)
{
connect(QtUi::mainWindow()->systemTray(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
SLOT(notificationActivated(QSystemTrayIcon::ActivationReason)));
{
connect(QtUi::mainWindow()->systemTray(), SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
SLOT(notificationActivated(QSystemTrayIcon::ActivationReason)));
|KNotification::CloseWhenWidgetActivated
|KNotification::CloseOnTimeout);
connect(notification, SIGNAL(activated(uint)), SLOT(notificationActivated()));
|KNotification::CloseWhenWidgetActivated
|KNotification::CloseOnTimeout);
connect(notification, SIGNAL(activated(uint)), SLOT(notificationActivated()));
- connect(notification, SIGNAL(closed()), SLOT(notificationClosed()));
notification->setActions(QStringList("View"));
notification->setActions(QStringList("View"));
- _notificationIds[notification] = _lastNotificationId = n.notificationId;
+ notification->setProperty("notificationId", n.notificationId);
+
+ _notifications.append(qMakePair(n.notificationId, QPointer<KNotification>(notification)));
QtUi::mainWindow()->systemTray()->setAlert(true);
}
void KNotificationBackend::removeNotificationById(uint notificationId) {
QtUi::mainWindow()->systemTray()->setAlert(true);
}
void KNotificationBackend::removeNotificationById(uint notificationId) {
- QHash<KNotification *, uint>::iterator i = _notificationIds.begin();
- while(i != _notificationIds.end()) {
- if(i.value() == notificationId)
- i = _notificationIds.erase(i);
- else
+ QList<QPair<uint, QPointer<KNotification> > >::iterator i = _notifications.begin();
+ while(i != _notifications.end()) {
+ if(i->first == notificationId) {
+ if(i->second)
+ i->second->close();
+ i = _notifications.erase(i);
+ } else
- if(_lastNotificationId == notificationId)
- _lastNotificationId = 0;
}
void KNotificationBackend::close(uint notificationId) {
removeNotificationById(notificationId);
}
void KNotificationBackend::close(uint notificationId) {
removeNotificationById(notificationId);
- if(!_notificationIds.count())
+ if(!_notifications.count())
QtUi::mainWindow()->systemTray()->setAlert(false);
}
void KNotificationBackend::notificationActivated() {
uint id = 0;
KNotification *n = qobject_cast<KNotification *>(sender());
QtUi::mainWindow()->systemTray()->setAlert(false);
}
void KNotificationBackend::notificationActivated() {
uint id = 0;
KNotification *n = qobject_cast<KNotification *>(sender());
- if(n && _notificationIds.contains(n))
- id = _notificationIds.value(n);
+ if(n)
+ id = n->property("notificationId").toUInt();
notificationActivated(id);
}
void KNotificationBackend::notificationActivated(QSystemTrayIcon::ActivationReason reason) {
notificationActivated(id);
}
void KNotificationBackend::notificationActivated(QSystemTrayIcon::ActivationReason reason) {
- if(reason == QSystemTrayIcon::Trigger && _lastNotificationId > 0) {
- notificationActivated(_lastNotificationId); // most recent one
+ if(reason == QSystemTrayIcon::Trigger && _notifications.count()) {
+ notificationActivated(_notifications.first().first); // oldest one
}
}
void KNotificationBackend::notificationActivated(uint notificationId) {
}
}
void KNotificationBackend::notificationActivated(uint notificationId) {
- removeNotificationById(notificationId);
-
QtUi::mainWindow()->systemTray()->setInhibitActivation();
emit activated(notificationId);
QtUi::mainWindow()->systemTray()->setInhibitActivation();
emit activated(notificationId);
- if(!_notificationIds.count())
- QtUi::mainWindow()->systemTray()->setAlert(false);
-
-}
-
-void KNotificationBackend::notificationClosed() {
- //KNotification *n = qobject_cast<KNotification *>(sender());
- //if(n && _notificationIds.contains(n))
- // _notificationIds.remove(n);
}
SettingsPage *KNotificationBackend::createConfigWidget() const {
}
SettingsPage *KNotificationBackend::createConfigWidget() const {
void notificationActivated();
void notificationActivated(QSystemTrayIcon::ActivationReason);
void notificationActivated(uint notificationId);
void notificationActivated();
void notificationActivated(QSystemTrayIcon::ActivationReason);
void notificationActivated(uint notificationId);
- void notificationClosed();
private:
class ConfigWidget;
void removeNotificationById(uint id);
private:
class ConfigWidget;
void removeNotificationById(uint id);
- QHash<KNotification *, uint> _notificationIds;
- uint _lastNotificationId;
+ QList<QPair<uint, QPointer<KNotification> > > _notifications;
};
class KNotificationBackend::ConfigWidget : public SettingsPage {
};
class KNotificationBackend::ConfigWidget : public SettingsPage {
#include "systemtray.h"
SystrayNotificationBackend::SystrayNotificationBackend(QObject *parent)
#include "systemtray.h"
SystrayNotificationBackend::SystrayNotificationBackend(QObject *parent)
- : AbstractNotificationBackend(parent), _activeId(0)
+ : AbstractNotificationBackend(parent)
{
NotificationSettings notificationSettings;
_showBubble = notificationSettings.value("Systray/ShowBubble", true).toBool();
{
NotificationSettings notificationSettings;
_showBubble = notificationSettings.value("Systray/ShowBubble", true).toBool();
if(notification.type != Highlight && notification.type != PrivMsg)
return;
if(notification.type != Highlight && notification.type != PrivMsg)
return;
- /* fancy stuff to be implemented later: show notifications in order
- _notifications.append(notification);
- if(_showBubble && _notifications.count() == 1) {
- showBubble();
- }
- */
- _notifications.clear();
_notifications.append(notification);
if(_showBubble)
showBubble();
_notifications.append(notification);
if(_showBubble)
showBubble();
}
void SystrayNotificationBackend::close(uint notificationId) {
}
void SystrayNotificationBackend::close(uint notificationId) {
- Q_UNUSED(notificationId);
- /* fancy stuff to be implemented later
- int idx = _notifications.indexOf(notificationId);
-
- if(_notifications.isEmpty()) {
- */
- _notifications.clear();
- _activeId = 0;
+ QList<Notification>::iterator i = _notifications.begin();
+ while(i != _notifications.end()) {
+ if(i->notificationId == notificationId)
+ i = _notifications.erase(i);
+ else
+ ++i;
+ }
+
- QtUi::mainWindow()->systemTray()->setAlert(false);
+
+ if(!_notifications.count())
+ QtUi::mainWindow()->systemTray()->setAlert(false);
}
void SystrayNotificationBackend::showBubble() {
}
void SystrayNotificationBackend::showBubble() {
// for now, we just show the last message
if(_notifications.isEmpty())
return;
// for now, we just show the last message
if(_notifications.isEmpty())
return;
- Notification n = _notifications.takeLast();
- _activeId = n.notificationId;
+ Notification n = _notifications.last();
QString title = Client::networkModel()->networkName(n.bufferId) + " - " + Client::networkModel()->bufferName(n.bufferId);
QString message = QString("<%1> %2").arg(n.sender, n.message);
QtUi::mainWindow()->systemTray()->showMessage(title, message);
QString title = Client::networkModel()->networkName(n.bufferId) + " - " + Client::networkModel()->bufferName(n.bufferId);
QString message = QString("<%1> %2").arg(n.sender, n.message);
QtUi::mainWindow()->systemTray()->showMessage(title, message);
void SystrayNotificationBackend::notificationActivated() {
if(QtUi::mainWindow()->systemTray()->isAlerted()) {
QtUi::mainWindow()->systemTray()->setInhibitActivation();
void SystrayNotificationBackend::notificationActivated() {
if(QtUi::mainWindow()->systemTray()->isAlerted()) {
QtUi::mainWindow()->systemTray()->setInhibitActivation();
- emit activated(_activeId);
+ uint id = _notifications.count()? _notifications.last().notificationId : 0;
+ emit activated(id);
bool _showBubble;
bool _animate;
QList<Notification> _notifications;
bool _showBubble;
bool _animate;
QList<Notification> _notifications;
};
class SystrayNotificationBackend::ConfigWidget : public SettingsPage {
};
class SystrayNotificationBackend::ConfigWidget : public SettingsPage {