diff --git a/libnotificationmanager/job.cpp b/libnotificationmanager/job.cpp --- a/libnotificationmanager/job.cpp +++ b/libnotificationmanager/job.cpp @@ -285,5 +285,5 @@ void Job::kill() { - emit d->cancelRequested(); + d->kill(); } diff --git a/libnotificationmanager/job_p.h b/libnotificationmanager/job_p.h --- a/libnotificationmanager/job_p.h +++ b/libnotificationmanager/job_p.h @@ -32,6 +32,7 @@ #include "notifications.h" #include "job.h" +class QTimer; class KFilePlacesModel; namespace NotificationManager @@ -50,6 +51,8 @@ QUrl descriptionUrl() const; QString text() const; + void kill(); + // DBus // JobViewV1 void terminate(const QString &errorMessage); @@ -118,6 +121,8 @@ void finish(); + QTimer *m_killTimer = nullptr; + uint m_id = 0; QDBusObjectPath m_objectPath; diff --git a/libnotificationmanager/job_p.cpp b/libnotificationmanager/job_p.cpp --- a/libnotificationmanager/job_p.cpp +++ b/libnotificationmanager/job_p.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -203,6 +204,28 @@ return QString(); } +void JobPrivate::kill() +{ + emit cancelRequested(); + + // In case the application doesn't respond, remove the job + if (!m_killTimer) { + m_killTimer = new QTimer(this); + m_killTimer->setSingleShot(true); + connect(m_killTimer, &QTimer::timeout, this, [this] { + qCWarning(NOTIFICATIONMANAGER) << "Application" << m_applicationName << "failed to respond to a cancel request in time"; + Job *job = static_cast(parent()); + job->setError(KIO::ERR_USER_CANCELED); + job->setState(Notifications::JobStateStopped); + finish(); + }); + } + + if (!m_killTimer->isActive()) { + m_killTimer->start(2000); + } +} + QUrl JobPrivate::descriptionUrl() const { QUrl url = localFileOrUrl(m_descriptionValue2);