Blob Blame History Raw
--- a/src/widgets/util/qsystemtrayicon.cpp
+++ b/src/widgets/util/qsystemtrayicon.cpp
@@ -672,6 +672,74 @@
     QWidget::timerEvent(e);
 }
 
+//////////////////////////////////////////////////////////////////////
+void QSystemTrayIconPrivate::install_sys_qpa()
+{
+    qpa_sys->init();
+    QObject::connect(qpa_sys, SIGNAL(activated(QPlatformSystemTrayIcon::ActivationReason)),
+                     q_func(), SLOT(_q_emitActivated(QPlatformSystemTrayIcon::ActivationReason)));
+    QObject::connect(qpa_sys, &QPlatformSystemTrayIcon::messageClicked,
+                     q_func(), &QSystemTrayIcon::messageClicked);
+    updateMenu_sys();
+    updateIcon_sys();
+    updateToolTip_sys();
+}
+
+void QSystemTrayIconPrivate::remove_sys_qpa()
+{
+    qpa_sys->cleanup();
+}
+
+QRect QSystemTrayIconPrivate::geometry_sys_qpa() const
+{
+    return qpa_sys->geometry();
+}
+
+void QSystemTrayIconPrivate::updateIcon_sys_qpa()
+{
+    qpa_sys->updateIcon(icon);
+}
+
+void QSystemTrayIconPrivate::updateMenu_sys_qpa()
+{
+    if (menu) {
+        if (!menu->platformMenu()) {
+            QPlatformMenu *platformMenu = qpa_sys->createMenu();
+            if (platformMenu)
+                menu->setPlatformMenu(platformMenu);
+        }
+        qpa_sys->updateMenu(menu->platformMenu());
+    }
+}
+
+void QSystemTrayIconPrivate::updateToolTip_sys_qpa()
+{
+    qpa_sys->updateToolTip(toolTip);
+}
+
+void QSystemTrayIconPrivate::showMessage_sys_qpa(const QString &message,
+                                                 const QString &title,
+                                                 QSystemTrayIcon::MessageIcon icon,
+                                                 int msecs)
+{
+    QIcon notificationIcon;
+    switch (icon) {
+    case QSystemTrayIcon::Information:
+        notificationIcon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation);
+        break;
+    case QSystemTrayIcon::Warning:
+        notificationIcon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxWarning);
+        break;
+    case QSystemTrayIcon::Critical:
+        notificationIcon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxCritical);
+        break;
+    default:
+        break;
+    }
+    qpa_sys->showMessage(message, title, notificationIcon,
+                     static_cast<QPlatformSystemTrayIcon::MessageIcon>(icon), msecs);
+}
+
 QT_END_NAMESPACE
 
 #endif // QT_NO_SYSTEMTRAYICON
--- a/src/widgets/util/qsystemtrayicon_p.h
+++ b/src/widgets/util/qsystemtrayicon_p.h
@@ -98,6 +98,15 @@
     QSystemTrayIconSys *sys;
     QPlatformSystemTrayIcon *qpa_sys;
     bool visible;
+
+private:
+    void install_sys_qpa();
+    void remove_sys_qpa();
+    void updateIcon_sys_qpa();
+    void updateToolTip_sys_qpa();
+    void updateMenu_sys_qpa();
+    QRect geometry_sys_qpa() const;
+    void showMessage_sys_qpa(const QString &msg, const QString &title, QSystemTrayIcon::MessageIcon icon, int secs);
 };
 
 class QBalloonTip : public QWidget
--- a/src/widgets/util/qsystemtrayicon_qpa.cpp
+++ b/src/widgets/util/qsystemtrayicon_qpa.cpp
@@ -65,28 +65,20 @@
 
 void QSystemTrayIconPrivate::install_sys()
 {
-    if (qpa_sys) {
-        qpa_sys->init();
-        QObject::connect(qpa_sys, SIGNAL(activated(QPlatformSystemTrayIcon::ActivationReason)),
-                         q_func(), SLOT(_q_emitActivated(QPlatformSystemTrayIcon::ActivationReason)));
-        QObject::connect(qpa_sys, SIGNAL(messageClicked()),
-                         q_func(), SIGNAL(messageClicked()));
-        updateMenu_sys();
-        updateIcon_sys();
-        updateToolTip_sys();
-    }
+    if (qpa_sys)
+        install_sys_qpa();
 }
 
 void QSystemTrayIconPrivate::remove_sys()
 {
     if (qpa_sys)
-        qpa_sys->cleanup();
+        remove_sys_qpa();
 }
 
 QRect QSystemTrayIconPrivate::geometry_sys() const
 {
     if (qpa_sys)
-        return qpa_sys->geometry();
+        return geometry_sys_qpa();
     else
         return QRect();
 }


@@ -94,25 +86,19 @@
 void QSystemTrayIconPrivate::updateIcon_sys()
 {
     if (qpa_sys)
-        qpa_sys->updateIcon(icon);
+        updateIcon_sys_qpa();
 }
 
 void QSystemTrayIconPrivate::updateMenu_sys()
 {
-    if (qpa_sys && menu) {
-        if (!menu->platformMenu()) {
-            QPlatformMenu *platformMenu = qpa_sys->createMenu();
-            if (platformMenu)
-                menu->setPlatformMenu(platformMenu);
-        }
-        qpa_sys->updateMenu(menu->platformMenu());
-    }
+    if (qpa_sys)
+        updateMenu_sys_qpa();
 }
 
 void QSystemTrayIconPrivate::updateToolTip_sys()
 {
     if (qpa_sys)
-        qpa_sys->updateToolTip(toolTip);
+        updateToolTip_sys_qpa();
 }
 
 bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys()
@@ -138,25 +124,8 @@
                                              QSystemTrayIcon::MessageIcon icon,
                                              int msecs)
 {
-    if (!qpa_sys)
-        return;
-
-    QIcon notificationIcon;
-    switch (icon) {
-    case QSystemTrayIcon::Information:
-        notificationIcon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxInformation);
-        break;
-    case QSystemTrayIcon::Warning:
-        notificationIcon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxWarning);
-        break;
-    case QSystemTrayIcon::Critical:
-        notificationIcon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxCritical);
-        break;
-    default:
-        break;
-    }
-    qpa_sys->showMessage(message, title, notificationIcon,
-                     static_cast<QPlatformSystemTrayIcon::MessageIcon>(icon), msecs);
+    if (qpa_sys)
+        showMessage_sys_qpa(message, title, icon, msecs);
 }
 
 QT_END_NAMESPACE
--- a/src/widgets/util/qsystemtrayicon_x11.cpp
+++ b/src/widgets/util/qsystemtrayicon_x11.cpp
@@ -55,6 +55,9 @@
 #include <qscreen.h>
 #include <qbackingstore.h>
 #include <qpa/qplatformnativeinterface.h>
+#include <qpa/qplatformsystemtrayicon.h>
+#include <qpa/qplatformtheme.h>
+#include <private/qguiapplication_p.h>
 #include <qdebug.h>
 
 #ifndef QT_NO_SYSTEMTRAYICON


@@ -209,16 +212,22 @@
 
 QSystemTrayIconPrivate::QSystemTrayIconPrivate()
     : sys(0),
+      qpa_sys(QGuiApplicationPrivate::platformTheme()->createPlatformSystemTrayIcon()),
       visible(false)
 {
 }
 
 QSystemTrayIconPrivate::~QSystemTrayIconPrivate()
 {
+    delete qpa_sys;
 }
 
 void QSystemTrayIconPrivate::install_sys()
 {
+    if (qpa_sys) {
+        install_sys_qpa();
+        return;
+    }
     Q_Q(QSystemTrayIcon);
     if (!sys && locateSystemTray()) {
         sys = new QSystemTrayIconSys(q);
@@ -229,6 +238,8 @@
 
 QRect QSystemTrayIconPrivate::geometry_sys() const
 {
+    if (qpa_sys)
+        return geometry_sys_qpa();
     if (!sys)
         return QRect();
     return sys->globalGeometry();
@@ -236,6 +247,10 @@
 
 void QSystemTrayIconPrivate::remove_sys()
 {
+    if (qpa_sys) {
+        remove_sys_qpa();
+        return;
+    }
     if (!sys)
         return;
     QBalloonTip::hideBalloon();


@@ -246,17 +261,26 @@
 
 void QSystemTrayIconPrivate::updateIcon_sys()
 {
+    if (qpa_sys) {
+        updateIcon_sys_qpa();
+        return;
+    }
     if (sys)
         sys->updateIcon();
 }
 
 void QSystemTrayIconPrivate::updateMenu_sys()
 {
-
+    if (qpa_sys)
+        updateMenu_sys_qpa();
 }
 
 void QSystemTrayIconPrivate::updateToolTip_sys()
 {
+    if (qpa_sys) {
+        updateToolTip_sys_qpa();
+        return;
+    }
     if (!sys)
         return;
 #ifndef QT_NO_TOOLTIP
@@ -266,6 +290,11 @@
 
 bool QSystemTrayIconPrivate::isSystemTrayAvailable_sys()
 {
+    QScopedPointer<QPlatformSystemTrayIcon> sys(QGuiApplicationPrivate::platformTheme()->createPlatformSystemTrayIcon());
+    if (sys)
+        return sys->isSystemTrayAvailable();
+
+    // no QPlatformSystemTrayIcon so fall back to default xcb platform behavior
     const QString platform = QGuiApplication::platformName();
     if (platform.compare(QStringLiteral("xcb"), Qt::CaseInsensitive) == 0)
        return locateSystemTray();

@@ -274,12 +303,21 @@
 
 bool QSystemTrayIconPrivate::supportsMessages_sys()
 {
+    QScopedPointer<QPlatformSystemTrayIcon> sys(QGuiApplicationPrivate::platformTheme()->createPlatformSystemTrayIcon());
+    if (sys)
+        return sys->supportsMessages();
+
+    // no QPlatformSystemTrayIcon so fall back to default xcb platform behavior
     return true;
 }
 
 void QSystemTrayIconPrivate::showMessage_sys(const QString &message, const QString &title,
                                    QSystemTrayIcon::MessageIcon icon, int msecs)
 {
+    if (qpa_sys) {
+        showMessage_sys_qpa(message, title, icon, msecs);
+        return;
+    }
     if (!sys)
         return;
     const QPoint g = sys->globalGeometry().topLeft();