summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/MainWindow.cpp5
-rw-r--r--src/MainWindow.h3
-rw-r--r--src/encryption/SelfVerificationStatus.cpp3
-rw-r--r--src/notifications/Manager.h8
-rw-r--r--src/notifications/ManagerLinux.cpp3
-rw-r--r--src/notifications/ManagerWin.cpp52
-rw-r--r--src/timeline/RoomlistModel.cpp8
7 files changed, 69 insertions, 13 deletions
diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp
index b7834cba..a4a0eff0 100644
--- a/src/MainWindow.cpp
+++ b/src/MainWindow.cpp
@@ -201,9 +201,14 @@ NhekoFixupPaletteEventFilter::eventFilter(QObject *obj, QEvent *event)
     // reason?!?
     if (event->type() == QEvent::ChildAdded &&
         obj->metaObject()->className() == QStringLiteral("QQuickRootItem")) {
+        QSet<QWindow *> newWindows;
         for (const auto window : QGuiApplication::topLevelWindows()) {
+            newWindows.insert(window);
+            if (m_postedWindows.contains(window))
+                continue;
             QGuiApplication::postEvent(window, new QEvent(QEvent::ApplicationPaletteChange));
         }
+        m_postedWindows.swap(newWindows);
     }
     return false;
 }
diff --git a/src/MainWindow.h b/src/MainWindow.h
index c493b5b2..928446aa 100644
--- a/src/MainWindow.h
+++ b/src/MainWindow.h
@@ -45,6 +45,9 @@ public:
     }
 
     bool eventFilter(QObject *obj, QEvent *event) override;
+
+private:
+    QSet<QWindow *> m_postedWindows;
 };
 
 class MainWindow : public QQuickView
diff --git a/src/encryption/SelfVerificationStatus.cpp b/src/encryption/SelfVerificationStatus.cpp
index 32e75c4f..b5549ca1 100644
--- a/src/encryption/SelfVerificationStatus.cpp
+++ b/src/encryption/SelfVerificationStatus.cpp
@@ -24,11 +24,12 @@ SelfVerificationStatus::SelfVerificationStatus(QObject *o)
   : QObject(o)
 {
     connect(ChatPage::instance(), &ChatPage::contentLoaded, this, [this] {
+        // We connect INSIDE a lambda, not A lambda...
         connect(cache::client(),
                 &Cache::selfVerificationStatusChanged,
                 this,
                 &SelfVerificationStatus::invalidate,
-                Qt::UniqueConnection);
+                Qt::UniqueConnection); // clazy:exclude=lambda-unique-connection
         cache::client()->markUserKeysOutOfDate({http::client()->user_id().to_string()});
     });
 
diff --git a/src/notifications/Manager.h b/src/notifications/Manager.h
index fbebfcba..707a4fb3 100644
--- a/src/notifications/Manager.h
+++ b/src/notifications/Manager.h
@@ -93,8 +93,12 @@ public:
 
 #if defined(Q_OS_WINDOWS)
 private:
-    void
-    systemPostNotification(const QString &line1, const QString &line2, const QString &iconPath);
+    void systemPostNotification(const QString &roomid,
+                                const QString &eventid,
+                                const QString &line1,
+                                const QString &line2,
+                                const QString &iconPath,
+                                const QString &bodyImagePath);
 #endif
 
     // these slots are platform specific (D-Bus only)
diff --git a/src/notifications/ManagerLinux.cpp b/src/notifications/ManagerLinux.cpp
index b181fdc3..11a7c1a1 100644
--- a/src/notifications/ManagerLinux.cpp
+++ b/src/notifications/ManagerLinux.cpp
@@ -114,7 +114,8 @@ NotificationsManager::postNotification(const mtx::responses::Notification &notif
 
     if (hasMarkup_) {
         if (hasImages_ &&
-            mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Image) {
+            (mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Image ||
+             mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Image)) {
             MxcImageProvider::download(
               QString::fromStdString(mtx::accessors::url(notification.event))
                 .remove(QStringLiteral("mxc://")),
diff --git a/src/notifications/ManagerWin.cpp b/src/notifications/ManagerWin.cpp
index 8d200abc..f1d3797b 100644
--- a/src/notifications/ManagerWin.cpp
+++ b/src/notifications/ManagerWin.cpp
@@ -13,6 +13,7 @@
 
 #include "Cache.h"
 #include "EventAccessors.h"
+#include "MxcImageProvider.h"
 #include "Utils.h"
 
 using namespace WinToastLib;
@@ -20,10 +21,21 @@ using namespace WinToastLib;
 class CustomHandler : public IWinToastHandler
 {
 public:
-    void toastActivated() const {}
+    CustomHandler(NotificationsManager *manager_, const QString &roomid_, const QString &eventid_)
+      : manager(manager_)
+      , roomid(roomid_)
+      , eventid(eventid_)
+    {
+    }
+
+    void toastActivated() const { manager->notificationClicked(roomid, eventid); }
     void toastActivated(int) const {}
     void toastFailed() const { std::wcout << L"Error showing current toast" << std::endl; }
     void toastDismissed(WinToastDismissalReason) const {}
+
+    NotificationsManager *manager;
+    QString roomid;
+    QString eventid;
 };
 
 namespace {
@@ -34,9 +46,9 @@ init()
 {
     isInitialized = true;
 
-    WinToast::instance()->setAppName(L"Nheko");
     WinToast::instance()->setAppUserModelId(
       WinToast::configureAUMI(L"NhekoReborn", L"in.nheko.Nheko"));
+    WinToast::instance()->setAppName(L"Nheko");
     if (!WinToast::instance()->initialize())
         std::wcout << "Your system is not compatible with toast notifications\n";
 }
@@ -52,6 +64,8 @@ NotificationsManager::postNotification(const mtx::responses::Notification &notif
                                        const QImage &icon)
 {
     const auto room_name = QString::fromStdString(cache::singleRoomInfo(notification.room_id).name);
+    auto roomid          = QString::fromStdString(notification.room_id);
+    auto eventid         = QString::fromStdString(mtx::accessors::event_id(notification.event));
 
     auto formatNotification = [this, notification] {
         const auto template_ = getMessageTemplate(notification);
@@ -61,20 +75,40 @@ NotificationsManager::postNotification(const mtx::responses::Notification &notif
         }
 
         return template_.arg(utils::stripReplyFallbacks(notification.event, {}, {}).quoted_body);
-    };
+    }();
 
     auto iconPath = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + room_name +
                     "-room-avatar.png";
     if (!icon.save(iconPath))
         iconPath.clear();
 
-    systemPostNotification(room_name, formatNotification(), iconPath);
+    if (mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Image ||
+        mtx::accessors::msg_type(notification.event) == mtx::events::MessageType::Image) {
+        MxcImageProvider::download(
+          QString::fromStdString(mtx::accessors::url(notification.event))
+            .remove(QStringLiteral("mxc://")),
+          QSize(200, 80),
+          [this, roomid, eventid, room_name, formatNotification, iconPath](
+            QString, QSize, QImage, QString imgPath) {
+              if (imgPath.isEmpty())
+                  systemPostNotification(
+                    roomid, eventid, room_name, formatNotification, iconPath, "");
+              else
+                  systemPostNotification(
+                    roomid, eventid, room_name, formatNotification, iconPath, imgPath);
+          });
+    } else {
+        systemPostNotification(roomid, eventid, room_name, formatNotification, iconPath, "");
+    }
 }
 
 void
-NotificationsManager::systemPostNotification(const QString &line1,
+NotificationsManager::systemPostNotification(const QString &roomid,
+                                             const QString &eventid,
+                                             const QString &line1,
                                              const QString &line2,
-                                             const QString &iconPath)
+                                             const QString &iconPath,
+                                             const QString &bodyImagePath)
 {
     if (!isInitialized)
         init();
@@ -85,8 +119,12 @@ NotificationsManager::systemPostNotification(const QString &line1,
 
     if (!iconPath.isNull())
         templ.setImagePath(iconPath.toStdWString());
+    if (!bodyImagePath.isNull())
+        templ.setHeroImagePath(bodyImagePath.toStdWString(), true);
+
+    templ.setAudioPath(WinToastTemplate::IM);
 
-    WinToast::instance()->showToast(templ, new CustomHandler());
+    WinToast::instance()->showToast(templ, new CustomHandler(this, roomid, eventid));
 }
 
 // clang-format off
diff --git a/src/timeline/RoomlistModel.cpp b/src/timeline/RoomlistModel.cpp
index cdaa02ec..da639843 100644
--- a/src/timeline/RoomlistModel.cpp
+++ b/src/timeline/RoomlistModel.cpp
@@ -271,11 +271,13 @@ RoomlistModel::addRoom(const QString &room_id, bool suppressInsertNotification)
 {
     if (!models.contains(room_id)) {
         // ensure we get read status updates and are only connected once
+        // WORKAROUND(Nico): This is not a lambda, but clazy on alpine currently doesn't
+        // believe us...
         connect(cache::client(),
                 &Cache::roomReadStatus,
                 this,
                 &RoomlistModel::updateReadStatus,
-                Qt::UniqueConnection);
+                Qt::UniqueConnection); // clazy:exclude=lambda-unique-connection
 
         QSharedPointer<TimelineModel> newRoom(new TimelineModel(manager, room_id));
         newRoom->setDecryptDescription(ChatPage::instance()->userSettings()->decryptSidebar());
@@ -529,11 +531,13 @@ RoomlistModel::sync(const mtx::responses::Sync &sync_)
         addRoom(qroomid);
         const auto &room_model = models.value(qroomid);
 
+        // WORKAROUND(Nico): This is not a lambda, but clazy on alpine currently doesn't
+        // believe us
         connect(room_model.data(),
                 &TimelineModel::newCallEvent,
                 ChatPage::instance()->callManager(),
                 &CallManager::syncEvent,
-                Qt::UniqueConnection);
+                Qt::UniqueConnection); // clazy:exclude=lambda-unique-connection
 
         room_model->sync(room);