diff options
author | Nep Nep <nepnep91@protonmail.com> | 2023-12-17 21:35:01 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-12-17 21:35:01 -0300 |
commit | 7dbad2c648b4f698b8a953cf8b8d10c9dfe968fb (patch) | |
tree | 97c9db3b6919800670ddc54a20986c6744aaf2be /src | |
parent | Multiple changes (diff) | |
parent | Merge pull request #1640 from q234rty/fix-slow-new-window-plasma-6 (diff) | |
download | nheko-7dbad2c648b4f698b8a953cf8b8d10c9dfe968fb.tar.xz |
Merge branch 'Nheko-Reborn:master' into ignore-command
Diffstat (limited to 'src')
-rw-r--r-- | src/MainWindow.cpp | 5 | ||||
-rw-r--r-- | src/MainWindow.h | 3 | ||||
-rw-r--r-- | src/encryption/SelfVerificationStatus.cpp | 3 | ||||
-rw-r--r-- | src/notifications/Manager.h | 8 | ||||
-rw-r--r-- | src/notifications/ManagerLinux.cpp | 3 | ||||
-rw-r--r-- | src/notifications/ManagerWin.cpp | 52 | ||||
-rw-r--r-- | src/timeline/RoomlistModel.cpp | 8 |
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 ¬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); |