X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fstatusnotifieritem.cpp;h=8dead19d93e71fe12f118fef00b43adea2a2dc00;hp=25b14bfb19a7ea0a4fb7656332d26489fd0c01e7;hb=HEAD;hpb=6eefdfc697067d184a589fc8a231b16316c09106 diff --git a/src/qtui/statusnotifieritem.cpp b/src/qtui/statusnotifieritem.cpp index 25b14bfb..244ceabe 100644 --- a/src/qtui/statusnotifieritem.cpp +++ b/src/qtui/statusnotifieritem.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2018 by the Quassel Project * + * Copyright (C) 2005-2022 by the Quassel Project * * devel@quassel-irc.org * * * * This contains code from KStatusNotifierItem, part of the KDE libs * @@ -23,32 +23,32 @@ #ifdef HAVE_DBUS -#include "statusnotifieritem.h" +# include "statusnotifieritem.h" -#include -#include -#include -#include -#include -#include -#include +# include +# include +# include +# include +# include +# include +# include -#include "icon.h" -#include "qtui.h" -#include "quassel.h" -#include "statusnotifieritemdbus.h" +# include "icon.h" +# include "qtui.h" +# include "quassel.h" +# include "statusnotifieritemdbus.h" -constexpr int kProtocolVersion {0}; +constexpr int kProtocolVersion{0}; -const QString kSniWatcherService {QLatin1String{"org.kde.StatusNotifierWatcher"}}; -const QString kSniWatcherPath {QLatin1String{"/StatusNotifierWatcher"}}; -const QString kSniPath {QLatin1String{"/StatusNotifierItem"}}; -const QString kXdgNotificationsService {QLatin1String{"org.freedesktop.Notifications"}}; -const QString kXdgNotificationsPath {QLatin1String{"/org/freedesktop/Notifications"}}; -const QString kMenuObjectPath {QLatin1String{"/MenuBar"}}; +const QString kSniWatcherService{QLatin1String{"org.kde.StatusNotifierWatcher"}}; +const QString kSniWatcherPath{QLatin1String{"/StatusNotifierWatcher"}}; +const QString kSniPath{QLatin1String{"/StatusNotifierItem"}}; +const QString kXdgNotificationsService{QLatin1String{"org.freedesktop.Notifications"}}; +const QString kXdgNotificationsPath{QLatin1String{"/org/freedesktop/Notifications"}}; +const QString kMenuObjectPath{QLatin1String{"/MenuBar"}}; -#ifdef HAVE_DBUSMENU -# include "dbusmenuexporter.h" +# ifdef HAVE_DBUSMENU +# include "dbusmenuexporter.h" /** * Specialization to provide access to icon names @@ -56,21 +56,21 @@ const QString kMenuObjectPath {QLatin1String{"/MenuBar"}}; class QuasselDBusMenuExporter : public DBusMenuExporter { public: - QuasselDBusMenuExporter(const QString &dbusObjectPath, QMenu *menu, const QDBusConnection &dbusConnection) + QuasselDBusMenuExporter(const QString& dbusObjectPath, QMenu* menu, const QDBusConnection& dbusConnection) : DBusMenuExporter(dbusObjectPath, menu, dbusConnection) {} protected: - QString iconNameForAction(QAction *action) override // TODO Qt 4.7: fixme when we have converted our iconloader + QString iconNameForAction(QAction* action) override // TODO Qt 4.7: fixme when we have converted our iconloader { QIcon icon(action->icon()); return icon.isNull() ? QString() : icon.name(); } }; -#endif /* HAVE_DBUSMENU */ +# endif /* HAVE_DBUSMENU */ -StatusNotifierItem::StatusNotifierItem(QWidget *parent) +StatusNotifierItem::StatusNotifierItem(QWidget* parent) : StatusNotifierItemParent(parent) , _iconThemeDir{QDir::tempPath() + QLatin1String{"/quassel-sni-XXXXXX"}} { @@ -108,19 +108,19 @@ StatusNotifierItem::StatusNotifierItem(QWidget *parent) connect(this, &StatusNotifierItem::toolTipChanged, _statusNotifierItemDBus, &StatusNotifierItemDBus::NewToolTip); // Service watcher to keep track of the StatusNotifierWatcher service - _serviceWatcher = new QDBusServiceWatcher(kSniWatcherService, - QDBusConnection::sessionBus(), - QDBusServiceWatcher::WatchForOwnerChange, - this); + _serviceWatcher = new QDBusServiceWatcher(kSniWatcherService, QDBusConnection::sessionBus(), QDBusServiceWatcher::WatchForOwnerChange, this); connect(_serviceWatcher, &QDBusServiceWatcher::serviceOwnerChanged, this, &StatusNotifierItem::serviceChange); // Client instance for StatusNotifierWatcher - _statusNotifierWatcher = new org::kde::StatusNotifierWatcher(kSniWatcherService, - kSniWatcherPath, - QDBusConnection::sessionBus(), - this); - connect(_statusNotifierWatcher, &OrgKdeStatusNotifierWatcherInterface::StatusNotifierHostRegistered, this, &StatusNotifierItem::checkForRegisteredHosts); - connect(_statusNotifierWatcher, &OrgKdeStatusNotifierWatcherInterface::StatusNotifierHostUnregistered, this, &StatusNotifierItem::checkForRegisteredHosts); + _statusNotifierWatcher = new org::kde::StatusNotifierWatcher(kSniWatcherService, kSniWatcherPath, QDBusConnection::sessionBus(), this); + connect(_statusNotifierWatcher, + &OrgKdeStatusNotifierWatcherInterface::StatusNotifierHostRegistered, + this, + &StatusNotifierItem::checkForRegisteredHosts); + connect(_statusNotifierWatcher, + &OrgKdeStatusNotifierWatcherInterface::StatusNotifierHostUnregistered, + this, + &StatusNotifierItem::checkForRegisteredHosts); // Client instance for notifications _notificationsClient = new org::freedesktop::Notifications(kXdgNotificationsService, @@ -136,40 +136,42 @@ StatusNotifierItem::StatusNotifierItem(QWidget *parent) _notificationsClientSupportsActions = desktopCapabilities.contains("actions"); } -#ifdef HAVE_DBUSMENU - new QuasselDBusMenuExporter(menuObjectPath(), trayMenu(), _statusNotifierItemDBus->dbusConnection()); // will be added as menu child -#endif +# ifdef HAVE_DBUSMENU + new QuasselDBusMenuExporter(menuObjectPath(), trayMenu(), _statusNotifierItemDBus->dbusConnection()); // will be added as menu child +# endif } - -void StatusNotifierItem::serviceChange(const QString &name, const QString &oldOwner, const QString &newOwner) +void StatusNotifierItem::serviceChange(const QString& name, const QString& oldOwner, const QString& newOwner) { Q_UNUSED(name); if (newOwner.isEmpty()) { - //unregistered + // unregistered setMode(Mode::Legacy); } else if (oldOwner.isEmpty()) { - //registered + // registered setMode(Mode::StatusNotifier); } } - void StatusNotifierItem::registerToWatcher() { if (_statusNotifierWatcher->isValid() && _statusNotifierWatcher->property("ProtocolVersion").toInt() == kProtocolVersion) { - auto registerMethod = QDBusMessage::createMethodCall(kSniWatcherService, kSniWatcherPath, kSniWatcherService, + auto registerMethod = QDBusMessage::createMethodCall(kSniWatcherService, + kSniWatcherPath, + kSniWatcherService, QLatin1String{"RegisterStatusNotifierItem"}); registerMethod.setArguments(QVariantList() << _statusNotifierItemDBus->service()); - _statusNotifierItemDBus->dbusConnection().callWithCallback(registerMethod, this, SLOT(checkForRegisteredHosts()), SLOT(onDBusError(QDBusError))); + _statusNotifierItemDBus->dbusConnection().callWithCallback(registerMethod, + this, + SLOT(checkForRegisteredHosts()), + SLOT(onDBusError(QDBusError))); } else { setMode(Mode::Legacy); } } - void StatusNotifierItem::checkForRegisteredHosts() { if (!_statusNotifierWatcher || !_statusNotifierWatcher->property("IsStatusNotifierHostRegistered").toBool()) { @@ -180,24 +182,22 @@ void StatusNotifierItem::checkForRegisteredHosts() } } - -void StatusNotifierItem::onDBusError(const QDBusError &error) +void StatusNotifierItem::onDBusError(const QDBusError& error) { qWarning() << "StatusNotifierItem encountered a D-Bus error:" << error; setMode(Mode::Legacy); } - void StatusNotifierItem::refreshIcons() { if (!_iconThemePath.isEmpty()) { QDir baseDir{_iconThemePath + "/hicolor"}; baseDir.removeRecursively(); - for (auto &&trayState : { State::Active, State::Passive, State::NeedsAttention }) { + for (auto&& trayState : {State::Active, State::Passive, State::NeedsAttention}) { auto iconName = SystemTray::iconName(trayState); QIcon icon = icon::get(iconName); if (!icon.isNull()) { - for (auto &&size : icon.availableSizes()) { + for (auto&& size : icon.availableSizes()) { auto pixDir = QString{"%1/%2x%3/status"}.arg(baseDir.absolutePath()).arg(size.width()).arg(size.height()); QDir{}.mkpath(pixDir); if (!icon.pixmap(size).save(pixDir + "/" + iconName + ".png")) { @@ -209,8 +209,7 @@ void StatusNotifierItem::refreshIcons() // No theme icon found; use fallback from resources auto iconDir = QString{"%1/24x24/status"}.arg(baseDir.absolutePath()); QDir{}.mkpath(iconDir); - if (!QFile::copy(QString{":/icons/hicolor/24x24/status/%1.svg"}.arg(iconName), - QString{"%1/%2.svg"}.arg(iconDir, iconName))) { + if (!QFile::copy(QString{":/icons/hicolor/24x24/status/%1.svg"}.arg(iconName), QString{"%1/%2.svg"}.arg(iconDir, iconName))) { qWarning() << "Could not access fallback tray icon" << iconName; continue; } @@ -224,7 +223,6 @@ void StatusNotifierItem::refreshIcons() } } - bool StatusNotifierItem::isSystemTrayAvailable() const { if (mode() == Mode::StatusNotifier) { @@ -234,7 +232,6 @@ bool StatusNotifierItem::isSystemTrayAvailable() const return StatusNotifierItemParent::isSystemTrayAvailable(); } - void StatusNotifierItem::onModeChanged(Mode mode) { if (mode == Mode::StatusNotifier) { @@ -246,7 +243,6 @@ void StatusNotifierItem::onModeChanged(Mode mode) } } - void StatusNotifierItem::onStateChanged(State state) { if (mode() == Mode::StatusNotifier) { @@ -254,7 +250,6 @@ void StatusNotifierItem::onStateChanged(State state) } } - void StatusNotifierItem::onVisibilityChanged(bool isVisible) { if (mode() == Mode::StatusNotifier) { @@ -268,51 +263,43 @@ void StatusNotifierItem::onVisibilityChanged(bool isVisible) } } - QString StatusNotifierItem::title() const { return QString("Quassel IRC"); } - QString StatusNotifierItem::iconName() const { return currentIconName(); } - QString StatusNotifierItem::attentionIconName() const { return currentAttentionIconName(); } - QString StatusNotifierItem::toolTipIconName() const { return "quassel"; } - QString StatusNotifierItem::iconThemePath() const { return _iconThemePath; } - QString StatusNotifierItem::menuObjectPath() const { return kMenuObjectPath; } - -void StatusNotifierItem::activated(const QPoint &pos) +void StatusNotifierItem::activated(const QPoint& pos) { Q_UNUSED(pos) activate(Trigger); } - -bool StatusNotifierItem::eventFilter(QObject *watched, QEvent *event) +bool StatusNotifierItem::eventFilter(QObject* watched, QEvent* event) { if (mode() == StatusNotifier) { if (watched == trayMenu() && event->type() == QEvent::HoverLeave) { @@ -322,8 +309,7 @@ bool StatusNotifierItem::eventFilter(QObject *watched, QEvent *event) return StatusNotifierItemParent::eventFilter(watched, event); } - -void StatusNotifierItem::showMessage(const QString &title, const QString &message_, SystemTray::MessageIcon icon, int timeout, uint notificationId) +void StatusNotifierItem::showMessage(const QString& title, const QString& message_, SystemTray::MessageIcon icon, int timeout, uint notificationId) { QString message = message_; if (_notificationsClient->isValid()) { @@ -333,7 +319,8 @@ void StatusNotifierItem::showMessage(const QString &title, const QString &messag QStringList actions; if (_notificationsClientSupportsActions) - actions << "activate" << "View"; + actions << "activate" + << "View"; // we always queue notifications right now QDBusReply reply = _notificationsClient->Notify(title, 0, "quassel", title, message, actions, QVariantMap(), timeout); @@ -347,10 +334,9 @@ void StatusNotifierItem::showMessage(const QString &title, const QString &messag StatusNotifierItemParent::showMessage(title, message, icon, timeout, notificationId); } - void StatusNotifierItem::closeMessage(uint notificationId) { - for (auto &&dbusid : _notificationsIdMap.keys()) { + for (auto&& dbusid : _notificationsIdMap.keys()) { if (_notificationsIdMap.value(dbusid) == notificationId) { _notificationsIdMap.remove(dbusid); _notificationsClient->CloseNotification(dbusid); @@ -361,7 +347,6 @@ void StatusNotifierItem::closeMessage(uint notificationId) StatusNotifierItemParent::closeMessage(notificationId); } - void StatusNotifierItem::notificationClosed(uint dbusid, uint reason) { Q_UNUSED(reason) @@ -369,12 +354,10 @@ void StatusNotifierItem::notificationClosed(uint dbusid, uint reason) emit messageClosed(_notificationsIdMap.take(dbusid)); } - -void StatusNotifierItem::notificationInvoked(uint dbusid, const QString &action) +void StatusNotifierItem::notificationInvoked(uint dbusid, const QString& action) { Q_UNUSED(action) emit messageClicked(_notificationsIdMap.value(dbusid, 0)); } - #endif