diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index 4e0d373c..495aa3c3 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -215,6 +215,12 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent)
if (pushrules) {
const auto local_user = utils::localUser().toStdString();
+ // Desktop notifications to be sent
+ std::vector<std::tuple<QSharedPointer<TimelineModel>,
+ mtx::events::collections::TimelineEvents,
+ std::string,
+ std::vector<mtx::pushrules::actions::Action>>>
+ notifications;
for (const auto &[room_id, room] : sync.rooms.join) {
// clear old notifications
for (const auto &e : room.ephemeral.events) {
@@ -334,30 +340,46 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent)
continue;
if (userSettings_->hasDesktopNotifications()) {
- auto info = cache::singleRoomInfo(room_id);
-
- AvatarProvider::resolve(
- roomModel->roomAvatarUrl(),
- 96,
- this,
- [this, te, room_id = room_id, actions](QPixmap image) {
- notificationsManager->postNotification(
- mtx::responses::Notification{
- .actions = actions,
- .event = std::move(te),
- .read = false,
- .profile_tag = "",
- .room_id = room_id,
- .ts = 0,
- },
- image.toImage());
- });
+ notifications.emplace_back(roomModel, te, room_id, actions);
}
}
}
}
}
}
+ if (notifications.size() <= 5) {
+ for (const auto &[roomModel, te, room_id, actions] : notifications) {
+ AvatarProvider::resolve(
+ roomModel->roomAvatarUrl(),
+ 96,
+ this,
+ [this, te = te, room_id = room_id, actions = actions](QPixmap image) {
+ notificationsManager->postNotification(
+ mtx::responses::Notification{
+ .actions = actions,
+ .event = std::move(te),
+ .read = false,
+ .profile_tag = "",
+ .room_id = room_id,
+ .ts = 0,
+ },
+ image.toImage());
+ });
+ }
+ } else if (!notifications.empty()) {
+ std::map<QSharedPointer<TimelineModel>, std::size_t> missedEvents;
+ for (const auto &[roomModel, te, room_id, actions] : notifications) {
+ missedEvents[roomModel]++;
+ }
+ QString body;
+ for (const auto &[roomModel, nbNotifs] : missedEvents) {
+ body += tr("%1 unread messages in room %2\n")
+ .arg(nbNotifs)
+ .arg(roomModel->roomName());
+ }
+ emit notificationsManager->systemPostNotificationCb(
+ "", "", "New messages while away", body, QImage());
+ }
}
});
diff --git a/src/notifications/ManagerLinux.cpp b/src/notifications/ManagerLinux.cpp
index 6babb447..fc92c9ae 100644
--- a/src/notifications/ManagerLinux.cpp
+++ b/src/notifications/ManagerLinux.cpp
@@ -187,11 +187,14 @@ NotificationsManager::systemPostNotification(const QString &room_id,
// The list of actions has always the action name and then a localized version of that
// action. Currently we just use an empty string for that.
// TODO(Nico): Look into what to actually put there.
- argumentList << (QStringList(QStringLiteral("default"))
- << QLatin1String("") << QStringLiteral("inline-reply")
- << QLatin1String("")); // actions
- argumentList << hints; // hints
- argumentList << (int)-1; // timeout in ms
+ QStringList actions;
+ actions << QStringList(QStringLiteral("default")) << QLatin1String("");
+ if (!room_id.isEmpty()) {
+ actions << QStringLiteral("inline-reply") << QLatin1String("");
+ }
+ argumentList << actions; // actions
+ argumentList << hints; // hints
+ argumentList << (int)-1; // timeout in ms
QDBusPendingCall call = dbus.asyncCallWithArgumentList(QStringLiteral("Notify"), argumentList);
auto watcher = new QDBusPendingCallWatcher{call, this};
|