From 62368f8cf46848a1a41971b48c36d8ac5b16617f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C3=ABl=20Bonithon?= Date: Sat, 29 Jan 2022 18:06:44 +0100 Subject: [PATCH] systray: Notify user once between two activations of the main window This cannot be done without leaving some indication to the user that a notification has been issued in the past, which may anyway appear as a lack even when notifications are issued with every new message. This is achieved by changing the icon semi-permanently (until the next activation of the main window), and by silently updating the tooltip when new notifications are issued with the total number of unread messages. This icon change is included in the minimal notification mode, as it is very non-intrusive. --- client/systemtrayicon.cpp | 33 ++++++++++++++++++++++++++++++--- client/systemtrayicon.h | 4 ++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/client/systemtrayicon.cpp b/client/systemtrayicon.cpp index efb0ac76..2983c91e 100644 --- a/client/systemtrayicon.cpp +++ b/client/systemtrayicon.cpp @@ -28,6 +28,7 @@ #include "linuxutils.h" #include #include +#include SystemTrayIcon::SystemTrayIcon(MainWindow* parent) : QSystemTrayIcon(parent) @@ -40,10 +41,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 +62,22 @@ 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* c: Quotient::AccountRegistry::instance().accounts()) + for (auto* r: c->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 +108,12 @@ void SystemTrayIcon::showHide() m_parent->setFocus(); } } + +void SystemTrayIcon::focusChanged(QWidget* old) +{ + 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..0daaa137 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); private: MainWindow* m_parent; + QIcon m_appIcon; + QIcon m_unreadIcon; + bool m_notified; void showHide(); };