From 41427039904815063f29c79d68ce4064cacb311e Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sun, 10 Dec 2023 04:53:44 +0100 Subject: Try to make windows notifications prettier --- src/notifications/ManagerWin.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) (limited to 'src/notifications/ManagerWin.cpp') diff --git a/src/notifications/ManagerWin.cpp b/src/notifications/ManagerWin.cpp index 8d200abc..87c49e3c 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; @@ -34,9 +35,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"; } @@ -61,20 +62,35 @@ NotificationsManager::postNotification(const mtx::responses::Notification ¬if } 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, room_name, formatNotification, iconPath](QString, QSize, QImage, QString imgPath) { + if (imgPath.isEmpty()) + systemPostNotification(room_name, formatNotification, iconPath, ""); + else + systemPostNotification(room_name, formatNotification, iconPath, imgPath); + }); + } else { + systemPostNotification(room_name, formatNotification, iconPath, ""); + } } void NotificationsManager::systemPostNotification(const QString &line1, const QString &line2, - const QString &iconPath) + const QString &iconPath, + const QString &bodyImagePath) { if (!isInitialized) init(); @@ -85,6 +101,10 @@ 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()); } -- cgit 1.5.1 From d116deedd79379c5ae683ab653d93d75348fa85e Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Tue, 12 Dec 2023 03:30:25 +0100 Subject: Allow clicking notifications on Windows --- .gitlab-ci.yml | 1 + resources/AppxManifest.xml | 2 +- src/notifications/Manager.h | 4 +++- src/notifications/ManagerWin.cpp | 32 +++++++++++++++++++++++++------- 4 files changed, 30 insertions(+), 9 deletions(-) (limited to 'src/notifications/ManagerWin.cpp') diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c28efe23..43fd49fa 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -16,6 +16,7 @@ build-windows: variables: APPVEYOR_REPO_BRANCH: "${CI_COMMIT_REF_NAME}" APPVEYOR_REPO_COMMIT: "${CI_COMMIT_SHORT_SHA}" + CMAKE_BUILD_PARALLEL_LEVEL: 8 before_script: - mkdir -p hunter - Move-Item -Path hunter -Destination C:/hunter diff --git a/resources/AppxManifest.xml b/resources/AppxManifest.xml index b9a090e1..6951c3b7 100644 --- a/resources/AppxManifest.xml +++ b/resources/AppxManifest.xml @@ -26,7 +26,7 @@ uap10:RuntimeBehavior="packagedClassicApp" uap10:TrustLevel="mediumIL"> + Square44x44Logo="nheko.png" BackgroundColor="transparent" /> diff --git a/src/notifications/Manager.h b/src/notifications/Manager.h index 0efc9445..707a4fb3 100644 --- a/src/notifications/Manager.h +++ b/src/notifications/Manager.h @@ -93,7 +93,9 @@ public: #if defined(Q_OS_WINDOWS) private: - void systemPostNotification(const QString &line1, + void systemPostNotification(const QString &roomid, + const QString &eventid, + const QString &line1, const QString &line2, const QString &iconPath, const QString &bodyImagePath); diff --git a/src/notifications/ManagerWin.cpp b/src/notifications/ManagerWin.cpp index 87c49e3c..f1d3797b 100644 --- a/src/notifications/ManagerWin.cpp +++ b/src/notifications/ManagerWin.cpp @@ -21,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 { @@ -53,6 +64,8 @@ NotificationsManager::postNotification(const mtx::responses::Notification ¬if 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); @@ -75,19 +88,24 @@ NotificationsManager::postNotification(const mtx::responses::Notification ¬if QString::fromStdString(mtx::accessors::url(notification.event)) .remove(QStringLiteral("mxc://")), QSize(200, 80), - [this, room_name, formatNotification, iconPath](QString, QSize, QImage, QString imgPath) { + [this, roomid, eventid, room_name, formatNotification, iconPath]( + QString, QSize, QImage, QString imgPath) { if (imgPath.isEmpty()) - systemPostNotification(room_name, formatNotification, iconPath, ""); + systemPostNotification( + roomid, eventid, room_name, formatNotification, iconPath, ""); else - systemPostNotification(room_name, formatNotification, iconPath, imgPath); + systemPostNotification( + roomid, eventid, room_name, formatNotification, iconPath, imgPath); }); } else { - systemPostNotification(room_name, formatNotification, iconPath, ""); + 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 &bodyImagePath) @@ -106,7 +124,7 @@ NotificationsManager::systemPostNotification(const QString &line1, templ.setAudioPath(WinToastTemplate::IM); - WinToast::instance()->showToast(templ, new CustomHandler()); + WinToast::instance()->showToast(templ, new CustomHandler(this, roomid, eventid)); } // clang-format off -- cgit 1.5.1