Unread messages count as an Unity compatible badge (#1085)

Co-authored-by: DeepBlueV7.X <nicolas.werner@hotmail.de>
This commit is contained in:
d42 2022-06-05 11:51:29 +00:00 committed by GitHub
parent 163ef6ebdc
commit 0e02024084
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 116 additions and 0 deletions

View File

@ -354,6 +354,8 @@ set(SRC_FILES
# Generic notification stuff
src/notifications/Manager.cpp
src/dock/Dock.cpp
src/AvatarProvider.cpp
src/BlurhashProvider.cpp
src/Cache.cpp
@ -551,6 +553,7 @@ qt5_wrap_cpp(MOC_HEADERS
src/encryption/VerificationManager.h
src/notifications/Manager.h
src/dock/Dock.h
src/AvatarProvider.h
src/BlurhashProvider.h

View File

@ -39,6 +39,7 @@
#include "UserSettingsPage.h"
#include "UsersModel.h"
#include "Utils.h"
#include "dock/Dock.h"
#include "emoji/EmojiModel.h"
#include "emoji/Provider.h"
#include "encryption/DeviceVerificationFlow.h"
@ -99,6 +100,8 @@ MainWindow::MainWindow(QWindow *parent)
SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
trayIcon_->setVisible(userSettings_->tray());
dock_ = new Dock(this);
connect(chat_page_, SIGNAL(unreadMessages(int)), dock_, SLOT(setUnreadCount(int)));
// load cache on event loop
QTimer::singleShot(0, this, [this] {

View File

@ -14,6 +14,7 @@
#include <QSystemTrayIcon>
#include "UserSettingsPage.h"
#include "dock/Dock.h"
#include "jdenticoninterface.h"
@ -104,6 +105,7 @@ private:
QSharedPointer<UserSettings> userSettings_;
//! Tray icon that shows the unread message count.
TrayIcon *trayIcon_;
Dock *dock_;
MxcImageProvider *imgProvider = nullptr;

81
src/dock/Dock.cpp Normal file
View File

@ -0,0 +1,81 @@
// SPDX-FileCopyrightText: 2022 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#include "dock/Dock.h"
#include <QApplication>
#include <QObject>
#if defined(NHEKO_DBUS_SYS)
#include <qdbusconnectioninterface.h>
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<QStringList> 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

27
src/dock/Dock.h Normal file
View File

@ -0,0 +1,27 @@
// SPDX-FileCopyrightText: 2022 Nheko Contributors
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QObject>
#if defined(NHEKO_DBUS_SYS)
#include <QDBusServiceWatcher>
#include <QtDBus/QDBusArgument>
#include <QtDBus/QDBusInterface>
#endif
class Dock : public QObject
{
Q_OBJECT
public:
Dock(QObject *parent = nullptr);
public slots:
void setUnreadCount(const int count);
private:
#if defined(NHEKO_DBUS_SYS)
void unitySetNotificationCount(const int count);
QDBusServiceWatcher *unityServiceWatcher = nullptr;
bool unityServiceAvailable = false;
#endif
};