From 0e02024084db087552a53520e829f3e4a5ae0cb4 Mon Sep 17 00:00:00 2001 From: d42 Date: Sun, 5 Jun 2022 11:51:29 +0000 Subject: Unread messages count as an Unity compatible badge (#1085) Co-authored-by: DeepBlueV7.X --- src/dock/Dock.cpp | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/dock/Dock.cpp (limited to 'src/dock/Dock.cpp') diff --git a/src/dock/Dock.cpp b/src/dock/Dock.cpp new file mode 100644 index 00000000..04c7507d --- /dev/null +++ b/src/dock/Dock.cpp @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: 2022 Nheko Contributors +// +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "dock/Dock.h" +#include +#include +#if defined(NHEKO_DBUS_SYS) +#include +Dock::Dock(QObject *parent) + : QObject(parent) + , unityServiceWatcher(new QDBusServiceWatcher(this)) +{ + unityServiceWatcher->setConnection(QDBusConnection::sessionBus()); + unityServiceWatcher->setWatchMode(QDBusServiceWatcher::WatchForUnregistration | + QDBusServiceWatcher::WatchForRegistration); + unityServiceWatcher->addWatchedService(QStringLiteral("com.canonical.Unity")); + connect(unityServiceWatcher, + &QDBusServiceWatcher::serviceRegistered, + this, + [this](const QString &service) { + Q_UNUSED(service); + unityServiceAvailable = true; + }); + connect(unityServiceWatcher, + &QDBusServiceWatcher::serviceUnregistered, + this, + [this](const QString &service) { + Q_UNUSED(service); + unityServiceAvailable = false; + }); + QDBusPendingCall listNamesCall = + QDBusConnection::sessionBus().interface()->asyncCall(QStringLiteral("ListNames")); + QDBusPendingCallWatcher *callWatcher = new QDBusPendingCallWatcher(listNamesCall, this); + connect(callWatcher, + &QDBusPendingCallWatcher::finished, + this, + [this](QDBusPendingCallWatcher *watcher) { + QDBusPendingReply reply = *watcher; + watcher->deleteLater(); + + if (reply.isError()) { + return; + } + + const QStringList &services = reply.value(); + + unityServiceAvailable = services.contains(QLatin1String("com.canonical.Unity")); + }); +} + +void +Dock::setUnreadCount(const int count) +{ + unitySetNotificationCount(count); +} +void +Dock::unitySetNotificationCount(const int count) +{ + if (unityServiceAvailable) { + const QString launcherId = qApp->desktopFileName() + QLatin1String(".desktop"); + + const QVariantMap properties{{QStringLiteral("count-visible"), count > 0}, + {QStringLiteral("count"), count}}; + + QDBusMessage message = + QDBusMessage::createSignal(QStringLiteral("/im/nheko/Nheko/UnityLauncher"), + QStringLiteral("com.canonical.Unity.LauncherEntry"), + QStringLiteral("Update")); + message.setArguments({launcherId, properties}); + QDBusConnection::sessionBus().send(message); + } +} +#else +Dock::Dock(QObject *parent) + : QObject(parent) +{} +void +Dock::setUnreadCount(const int) +{} +#endif -- cgit 1.5.1