diff --git a/src/qt/notificator.cpp b/src/qt/notificator.cpp index 3d588cd3171..93174690a54 100644 --- a/src/qt/notificator.cpp +++ b/src/qt/notificator.cpp @@ -31,6 +31,18 @@ #ifdef USE_DBUS // https://wiki.ubuntu.com/NotificationDevelopmentGuidelines recommends at least 128 const int FREEDESKTOP_NOTIFICATION_ICON_SIZE = 128; + +void DBusInitThread::run() { + auto interface = new QDBusInterface("org.freedesktop.Notifications", "/org/freedesktop/Notifications", "org.freedesktop.Notifications"); + if (!interface->isValid()) { + delete interface; + return; + } + interface->moveToThread(m_notificator.thread()); + m_notificator.interface = interface; + m_notificator.mode = Notificator::Freedesktop; +} + #endif Notificator::Notificator(const QString &programName, QSystemTrayIcon *trayicon, QWidget *parent) : @@ -48,12 +60,8 @@ Notificator::Notificator(const QString &programName, QSystemTrayIcon *trayicon, mode = QSystemTray; } #ifdef USE_DBUS - interface = new QDBusInterface("org.freedesktop.Notifications", - "/org/freedesktop/Notifications", "org.freedesktop.Notifications"); - if(interface->isValid()) - { - mode = Freedesktop; - } + m_dbus_init_thread = new DBusInitThread(*this); + m_dbus_init_thread->start(); #endif #ifdef Q_OS_MAC // check if users OS has support for NSUserNotification @@ -82,6 +90,8 @@ Notificator::Notificator(const QString &programName, QSystemTrayIcon *trayicon, Notificator::~Notificator() { #ifdef USE_DBUS + m_dbus_init_thread->wait(); + delete m_dbus_init_thread; delete interface; #endif } @@ -296,8 +306,7 @@ void Notificator::notifyMacUserNotificationCenter(Class cls, const QString &titl void Notificator::notify(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout) { - switch(mode) - { + switch (Mode(mode)) { #ifdef USE_DBUS case Freedesktop: notifyDBus(cls, title, text, icon, millisTimeout); diff --git a/src/qt/notificator.h b/src/qt/notificator.h index 61c27e7ff88..96b9a74116c 100644 --- a/src/qt/notificator.h +++ b/src/qt/notificator.h @@ -11,6 +11,9 @@ #include #include +#include + +#include QT_BEGIN_NAMESPACE class QSystemTrayIcon; @@ -20,6 +23,23 @@ class QDBusInterface; #endif QT_END_NAMESPACE +class Notificator; + +#ifdef USE_DBUS +class DBusInitThread : public QThread +{ + Q_OBJECT + + Notificator& m_notificator; + +public: + DBusInitThread(Notificator& notificator) : m_notificator(notificator) {}; + +protected: + void run() override; +}; +#endif + /** Cross-platform desktop notification client. */ class Notificator: public QObject { @@ -63,11 +83,15 @@ public slots: UserNotificationCenter /**< Use the 10.8+ User Notification Center (Mac only) */ }; QString programName; - Mode mode; + std::atomic mode; QSystemTrayIcon *trayIcon; #ifdef USE_DBUS + QThread *m_dbus_init_thread{nullptr}; +protected: QDBusInterface *interface; + friend class DBusInitThread; +private: void notifyDBus(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout); #endif void notifySystray(Class cls, const QString &title, const QString &text, const QIcon &icon, int millisTimeout);