diff options
author | Carl Schwan <carl.schwan@kdab.com> | 2023-04-03 18:05:52 +0200 |
---|---|---|
committer | Carl Schwan <carl.schwan@kdab.com> | 2023-04-04 23:53:37 +0200 |
commit | ac973cb74fecdaedf31922dfd48ea522a7af8f51 (patch) | |
tree | 411f48905d17e475bc8f6cede51d21d877b87244 | |
parent | 447f3ade9a284d52552352e2752c53be2cf0a57e (diff) | |
download | qtbase-ac973cb74fecdaedf31922dfd48ea522a7af8f51.tar.gz |
Implement setBadgeNumber for xcb backend
This use the unity launcher specification which is defined here
https://wiki.ubuntu.com/Unity/LauncherAPI
This spec is used by Plasma and Unity. On other Linux desktop platform
where the unity DBus interface is not detected this is no-op.
Change-Id: I81a9b95fe4886ad597bb4e775641926b161c49a5
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: David Edmundson <davidedmundson@kde.org>
-rw-r--r-- | src/gui/kernel/qguiapplication.cpp | 3 | ||||
-rw-r--r-- | src/gui/platform/unix/qgenericunixservices.cpp | 31 | ||||
-rw-r--r-- | src/gui/platform/unix/qgenericunixservices_p.h | 1 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbintegration.cpp | 6 | ||||
-rw-r--r-- | src/plugins/platforms/xcb/qxcbintegration.h | 2 |
5 files changed, 42 insertions, 1 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp index 96f1a02971..febef13c98 100644 --- a/src/gui/kernel/qguiapplication.cpp +++ b/src/gui/kernel/qguiapplication.cpp @@ -751,7 +751,8 @@ QString QGuiApplication::applicationDisplayName() of unread messages or similar. The badge will be overlaid on the application's icon in the Dock - on \macos, the home screen icon on iOS, or the task bar on Windows. + on \macos, the home screen icon on iOS, or the task bar on Windows + and Linux. If the number is outside the range supported by the platform, the number will be clamped to the supported range. If the number does diff --git a/src/gui/platform/unix/qgenericunixservices.cpp b/src/gui/platform/unix/qgenericunixservices.cpp index 4e27a33af5..e834ad1f07 100644 --- a/src/gui/platform/unix/qgenericunixservices.cpp +++ b/src/gui/platform/unix/qgenericunixservices.cpp @@ -575,6 +575,37 @@ bool QGenericUnixServices::hasCapability(Capability capability) const return false; } +void QGenericUnixServices::setApplicationBadge(qint64 number) +{ +#if QT_CONFIG(dbus) + if (qGuiApp->desktopFileName().isEmpty()) { + qWarning("QGuiApplication::desktopFileName() is empty"); + return; + } + + + const QString launcherUrl = QStringLiteral("application://") + qGuiApp->desktopFileName() + QStringLiteral(".desktop"); + const qint64 count = qBound(0, number, 9999); + QVariantMap dbusUnityProperties; + + if (count > 0) { + dbusUnityProperties[QStringLiteral("count")] = count; + dbusUnityProperties[QStringLiteral("count-visible")] = true; + } else { + dbusUnityProperties[QStringLiteral("count-visible")] = false; + } + + auto signal = QDBusMessage::createSignal(QStringLiteral("/com/canonical/unity/launcherentry/") + + qGuiApp->applicationName(), QStringLiteral("com.canonical.Unity.LauncherEntry"), QStringLiteral("Update")); + + signal.setArguments({launcherUrl, dbusUnityProperties}); + + QDBusConnection::sessionBus().send(signal); +#else + Q_UNUSED(number) +#endif +} + QT_END_NAMESPACE #include "qgenericunixservices.moc" diff --git a/src/gui/platform/unix/qgenericunixservices_p.h b/src/gui/platform/unix/qgenericunixservices_p.h index 701bcfc78f..56e15103f7 100644 --- a/src/gui/platform/unix/qgenericunixservices_p.h +++ b/src/gui/platform/unix/qgenericunixservices_p.h @@ -35,6 +35,7 @@ public: bool openDocument(const QUrl &url) override; QPlatformServiceColorPicker *colorPicker(QWindow *parent = nullptr) override; + void setApplicationBadge(qint64 number); virtual QString portalWindowIdentifier(QWindow *window); private: diff --git a/src/plugins/platforms/xcb/qxcbintegration.cpp b/src/plugins/platforms/xcb/qxcbintegration.cpp index e32891e814..6b2a20bb30 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.cpp +++ b/src/plugins/platforms/xcb/qxcbintegration.cpp @@ -585,4 +585,10 @@ QPlatformVulkanInstance *QXcbIntegration::createPlatformVulkanInstance(QVulkanIn } #endif +void QXcbIntegration::setApplicationBadge(qint64 number) +{ + auto unixServices = dynamic_cast<QGenericUnixServices *>(services()); + unixServices->setApplicationBadge(number); +} + QT_END_NAMESPACE diff --git a/src/plugins/platforms/xcb/qxcbintegration.h b/src/plugins/platforms/xcb/qxcbintegration.h index abdfe7112c..9284f6de54 100644 --- a/src/plugins/platforms/xcb/qxcbintegration.h +++ b/src/plugins/platforms/xcb/qxcbintegration.h @@ -102,6 +102,8 @@ public: static QXcbIntegration *instance() { return m_instance; } + void setApplicationBadge(qint64 number) override; + private: QXcbConnection *m_connection = nullptr; |