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 ¬if
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 ¬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);
@@ -61,20 +75,40 @@ 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, 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);
|