diff --git a/src/services/notifications/notification.cpp b/src/services/notifications/notification.cpp index e267699b..46a337aa 100644 --- a/src/services/notifications/notification.cpp +++ b/src/services/notifications/notification.cpp @@ -39,6 +39,11 @@ QString NotificationAction::identifier() const { return this->mIdentifier; } QString NotificationAction::text() const { return this->mText; } void NotificationAction::invoke() { + if (this->notification->isRetained()) { + qCritical() << "Cannot invoke destroyed notification" << this; + return; + } + NotificationServer::instance()->ActionInvoked(this->notification->id(), this->mIdentifier); if (!this->notification->isResident()) { @@ -57,6 +62,11 @@ void Notification::expire() { this->close(NotificationCloseReason::Expired); } void Notification::dismiss() { this->close(NotificationCloseReason::Dismissed); } void Notification::close(NotificationCloseReason::Enum reason) { + if (this->isRetained()) { + qCritical() << "Cannot close destroyed notification" << this; + return; + } + this->mCloseReason = reason; if (reason != 0) { diff --git a/src/services/notifications/notification.hpp b/src/services/notifications/notification.hpp index 5be56172..2dab36dc 100644 --- a/src/services/notifications/notification.hpp +++ b/src/services/notifications/notification.hpp @@ -8,6 +8,8 @@ #include #include +#include "../../core/retainable.hpp" + namespace qs::service::notifications { class NotificationImage; @@ -50,7 +52,12 @@ public: class NotificationAction; ///! A notification emitted by a NotificationServer. -class Notification: public QObject { +/// A notification emitted by a NotificationServer. +/// > [!INFO] This type is [Retainable](/docs/types/quickshell/retainable). It +/// > can be retained after destruction if necessary. +class Notification + : public QObject + , public Retainable { Q_OBJECT; /// Id of the notification as given to the client. Q_PROPERTY(quint32 id READ id CONSTANT); diff --git a/src/services/notifications/server.cpp b/src/services/notifications/server.cpp index 5b89a894..3e035e0c 100644 --- a/src/services/notifications/server.cpp +++ b/src/services/notifications/server.cpp @@ -105,7 +105,7 @@ void NotificationServer::deleteNotification( this->idMap.remove(notification->id()); emit this->NotificationClosed(notification->id(), reason); - delete notification; + notification->retainedDestroy(); } void NotificationServer::tryRegister() {