diff --git a/client/systemtrayicon.cpp b/client/systemtrayicon.cpp index efb0ac76..33e87139 100644 --- a/client/systemtrayicon.cpp +++ b/client/systemtrayicon.cpp @@ -40,10 +40,14 @@ SystemTrayIcon::SystemTrayIcon(MainWindow* parent) showHideAction->setText(visible ? tr("Hide") : tr("Show")); }); - setIcon(QIcon::fromTheme(appIconName(), QIcon(":/icon.png"))); + m_appIcon = QIcon::fromTheme(appIconName(), QIcon(":/icon.png")); + m_unreadIcon = QIcon::fromTheme("mail-unread", m_appIcon); + m_notified = false; + setIcon(m_appIcon); setToolTip("Quaternion"); setContextMenu(contextMenu); connect( this, &SystemTrayIcon::activated, this, &SystemTrayIcon::systemTrayIconAction); + connect(qApp, &QApplication::focusChanged, this, &SystemTrayIcon::focusChanged); } void SystemTrayIcon::newRoom(Quotient::Room* room) @@ -57,9 +61,21 @@ void SystemTrayIcon::unreadStatsChanged(Quotient::Room* room) { using namespace Quotient; const auto mode = Settings().get("UI/notifications", "intrusive"); - if (mode == "none") + int nNotifs = 0; + + if (qApp->activeWindow() != nullptr || room->notificationCount() == 0) return; - if (qApp->activeWindow() != nullptr && room->notificationCount() > 0) { + + for (auto* r: room->connection()->allRooms()) + nNotifs += r->notificationCount(); + setToolTip(tr("%Ln notification(s)", "", nNotifs)); + + if (!m_notified) { + setIcon(m_unreadIcon); + m_notified = true; + if (mode == "none") + return; + showMessage( //: %1 is the room display name tr("Notification in %1").arg(room->displayName()), @@ -90,3 +106,12 @@ void SystemTrayIcon::showHide() m_parent->setFocus(); } } + +void SystemTrayIcon::focusChanged(QWidget* old, QWidget* now) +{ + if (m_notified && old == nullptr && qApp->activeWindow() != nullptr) { + setIcon(m_appIcon); + setToolTip("Quaternion"); + m_notified = false; + } +} diff --git a/client/systemtrayicon.h b/client/systemtrayicon.h index f978df90..434f09a4 100644 --- a/client/systemtrayicon.h +++ b/client/systemtrayicon.h @@ -40,8 +40,12 @@ class SystemTrayIcon: public QSystemTrayIcon private slots: void unreadStatsChanged(Quotient::Room* room); void systemTrayIconAction(QSystemTrayIcon::ActivationReason reason); + void focusChanged(QWidget* old, QWidget* now); private: MainWindow* m_parent; + QIcon m_appIcon; + QIcon m_unreadIcon; + bool m_notified; void showHide(); };