From 42a08098d1b11bcf4dff2ed9483d6398e8a49085 Mon Sep 17 00:00:00 2001 From: Ivailo Monev Date: Mon, 8 Apr 2024 20:46:12 +0300 Subject: [PATCH] plasma: use singletons for the notifications applet adaptors Signed-off-by: Ivailo Monev --- kdialog/kdialog.cpp | 2 +- .../notifications/applicationswidget.cpp | 7 ++--- plasma/applets/notifications/jobswidget.cpp | 7 ++--- .../notifications/jobtrackeradaptor.cpp | 30 ++++++++++++++++++- .../applets/notifications/jobtrackeradaptor.h | 8 +++++ .../notifications/notificationsadaptor.cpp | 30 ++++++++++++++++++- .../notifications/notificationsadaptor.h | 8 +++++ 7 files changed, 81 insertions(+), 11 deletions(-) diff --git a/kdialog/kdialog.cpp b/kdialog/kdialog.cpp index f8bb8a44..5779f6c8 100644 --- a/kdialog/kdialog.cpp +++ b/kdialog/kdialog.cpp @@ -123,7 +123,7 @@ bool sendVisualNotification(const QString &text, const QString &title, const QSt notificationData.insert("appIcon", icon); notificationData.insert("summary", title); notificationData.insert("body", text); - notificationData.insert("timeout", timeout); // expire timout, unused + // NOTE: missing appRealName, not configurable reply = notificationInterface.call("updateNotification", notificationId, notificationData); if (!reply.isValid()) { // kDebug() << "Error: failed to send D-Bus message" << reply.error().message(); diff --git a/plasma/applets/notifications/applicationswidget.cpp b/plasma/applets/notifications/applicationswidget.cpp index 41e05fc6..5b1d6afb 100644 --- a/plasma/applets/notifications/applicationswidget.cpp +++ b/plasma/applets/notifications/applicationswidget.cpp @@ -18,7 +18,6 @@ #include "applicationswidget.h" -#include #include #include #include @@ -142,7 +141,7 @@ ApplicationsWidget::ApplicationsWidget(QGraphicsItem *parent, NotificationsWidge m_layout->addStretch(); setLayout(m_layout); - m_adaptor = new NotificationsAdaptor(this); + m_adaptor = NotificationsAdaptor::self(); connect( m_adaptor, SIGNAL(notificationAdded(QString)), this, SLOT(slotNotificationAdded(QString)) @@ -151,12 +150,12 @@ ApplicationsWidget::ApplicationsWidget(QGraphicsItem *parent, NotificationsWidge m_adaptor, SIGNAL(notificationUpdated(QString,QVariantMap)), this, SLOT(slotNotificationUpdated(QString,QVariantMap)) ); - QDBusConnection session = QDBusConnection::sessionBus(); - session.registerObject("/Notifications", this); + m_adaptor->registerObject(); } ApplicationsWidget::~ApplicationsWidget() { + m_adaptor->unregisterObject(); } int ApplicationsWidget::count() const diff --git a/plasma/applets/notifications/jobswidget.cpp b/plasma/applets/notifications/jobswidget.cpp index 96f4df22..404b9855 100644 --- a/plasma/applets/notifications/jobswidget.cpp +++ b/plasma/applets/notifications/jobswidget.cpp @@ -18,7 +18,6 @@ #include "jobswidget.h" -#include #include #include #include @@ -145,7 +144,7 @@ JobsWidget::JobsWidget(QGraphicsItem *parent, NotificationsWidget *notifications m_layout->addItem(m_label); setLayout(m_layout); - m_adaptor = new JobTrackerAdaptor(this); + m_adaptor = JobTrackerAdaptor::self(); connect( m_adaptor, SIGNAL(jobAdded(QString)), this, SLOT(slotJobAdded(QString)) @@ -154,12 +153,12 @@ JobsWidget::JobsWidget(QGraphicsItem *parent, NotificationsWidget *notifications m_adaptor, SIGNAL(jobUpdated(QString,QVariantMap)), this, SLOT(slotJobUpdated(QString,QVariantMap)) ); - QDBusConnection session = QDBusConnection::sessionBus(); - session.registerObject("/JobTracker", this); + m_adaptor->registerObject(); } JobsWidget::~JobsWidget() { + m_adaptor->unregisterObject(); } int JobsWidget::count() const diff --git a/plasma/applets/notifications/jobtrackeradaptor.cpp b/plasma/applets/notifications/jobtrackeradaptor.cpp index 7ed6e226..d67e0b24 100644 --- a/plasma/applets/notifications/jobtrackeradaptor.cpp +++ b/plasma/applets/notifications/jobtrackeradaptor.cpp @@ -19,8 +19,15 @@ #include "jobtrackeradaptor.h" +#include +#include +#include + +K_GLOBAL_STATIC_WITH_ARGS(JobTrackerAdaptor, kJobTrackerAdaptor, (qApp)) + JobTrackerAdaptor::JobTrackerAdaptor(QObject *parent) - : QDBusAbstractAdaptor(parent) + : QDBusAbstractAdaptor(parent), + m_ref(0) { } @@ -39,4 +46,25 @@ void JobTrackerAdaptor::stopJob(const QString &name) emit stopRequested(name); } +JobTrackerAdaptor* JobTrackerAdaptor::self() +{ + return kJobTrackerAdaptor; +} + +void JobTrackerAdaptor::registerObject() +{ + if (m_ref == 0) { + QDBusConnection::sessionBus().registerObject("/JobTracker", qApp); + } + m_ref.ref(); +} + +void JobTrackerAdaptor::unregisterObject() +{ + m_ref.deref(); + if (m_ref == 0) { + QDBusConnection::sessionBus().unregisterObject("/JobTracker"); + } +} + #include "moc_jobtrackeradaptor.cpp" diff --git a/plasma/applets/notifications/jobtrackeradaptor.h b/plasma/applets/notifications/jobtrackeradaptor.h index 437f1249..4c5c6b44 100644 --- a/plasma/applets/notifications/jobtrackeradaptor.h +++ b/plasma/applets/notifications/jobtrackeradaptor.h @@ -22,6 +22,7 @@ #include #include +#include // Adaptor class for interface org.kde.JobTracker class JobTrackerAdaptor: public QDBusAbstractAdaptor @@ -31,6 +32,10 @@ class JobTrackerAdaptor: public QDBusAbstractAdaptor public: JobTrackerAdaptor(QObject *parent); + static JobTrackerAdaptor* self(); + void registerObject(); + void unregisterObject(); + public Q_SLOTS: void addJob(const QString &name); void updateJob(const QString &name, const QVariantMap &data); @@ -41,6 +46,9 @@ Q_SIGNALS: void jobUpdated(const QString &name, const QVariantMap &data); void stopRequested(const QString &name); + +private: + QAtomicInt m_ref; }; #endif // JOBTRACKERADAPTOR_H diff --git a/plasma/applets/notifications/notificationsadaptor.cpp b/plasma/applets/notifications/notificationsadaptor.cpp index 9812e13f..6bc4a385 100644 --- a/plasma/applets/notifications/notificationsadaptor.cpp +++ b/plasma/applets/notifications/notificationsadaptor.cpp @@ -19,8 +19,15 @@ #include "notificationsadaptor.h" +#include +#include +#include + +K_GLOBAL_STATIC_WITH_ARGS(NotificationsAdaptor, kNotificationsAdaptor, (qApp)) + NotificationsAdaptor::NotificationsAdaptor(QObject *parent) - : QDBusAbstractAdaptor(parent) + : QDBusAbstractAdaptor(parent), + m_ref(0) { } @@ -44,4 +51,25 @@ void NotificationsAdaptor::invokeAction(const QString &name, const QString &acti emit actionRequested(name, action); } +NotificationsAdaptor* NotificationsAdaptor::self() +{ + return kNotificationsAdaptor; +} + +void NotificationsAdaptor::registerObject() +{ + if (m_ref == 0) { + QDBusConnection::sessionBus().registerObject("/Notifications", qApp); + } + m_ref.ref(); +} + +void NotificationsAdaptor::unregisterObject() +{ + m_ref.deref(); + if (m_ref == 0) { + QDBusConnection::sessionBus().unregisterObject("/Notifications"); + } +} + #include "moc_notificationsadaptor.cpp" diff --git a/plasma/applets/notifications/notificationsadaptor.h b/plasma/applets/notifications/notificationsadaptor.h index 70beb0bf..06350fc5 100644 --- a/plasma/applets/notifications/notificationsadaptor.h +++ b/plasma/applets/notifications/notificationsadaptor.h @@ -22,6 +22,7 @@ #include #include +#include // Adaptor class for interface org.kde.Notifications class NotificationsAdaptor: public QDBusAbstractAdaptor @@ -31,6 +32,10 @@ class NotificationsAdaptor: public QDBusAbstractAdaptor public: NotificationsAdaptor(QObject *parent); + static NotificationsAdaptor* self(); + void registerObject(); + void unregisterObject(); + public Q_SLOTS: void addNotification(const QString &name); void updateNotification(const QString &name, const QVariantMap &data); @@ -43,6 +48,9 @@ Q_SIGNALS: void closeRequested(const QString &name); void actionRequested(const QString &name, const QString &action); + +private: + QAtomicInt m_ref; }; #endif // NOTIFICATIONSADAPTOR_H