service/tray: report misbehaving tray hosts

I've debugged broken tray items that just end up being a bad host far
too many times.
This commit is contained in:
outfoxxed 2024-11-17 01:30:54 -08:00
parent 0445eee33a
commit 36d1dbeb69
Signed by: outfoxxed
GPG key ID: 4C88A185FB89301E
6 changed files with 25 additions and 2 deletions

View file

@ -268,14 +268,15 @@ void DBusPropertyGroup::updateAllViaGetAll() {
qCWarning(logDbusProperties).noquote() qCWarning(logDbusProperties).noquote()
<< "Error updating properties of" << this->toString() << "via GetAll"; << "Error updating properties of" << this->toString() << "via GetAll";
qCWarning(logDbusProperties) << reply.error(); qCWarning(logDbusProperties) << reply.error();
emit this->getAllFailed(reply.error());
} else { } else {
qCDebug(logDbusProperties).noquote() qCDebug(logDbusProperties).noquote()
<< "Received GetAll property set for" << this->toString(); << "Received GetAll property set for" << this->toString();
this->updatePropertySet(reply.value(), true); this->updatePropertySet(reply.value(), true);
emit this->getAllFinished();
} }
delete call; delete call;
emit this->getAllFinished();
}; };
QObject::connect(call, &QDBusPendingCallWatcher::finished, this, responseCallback); QObject::connect(call, &QDBusPendingCallWatcher::finished, this, responseCallback);

View file

@ -135,6 +135,7 @@ public:
signals: signals:
void getAllFinished(); void getAllFinished();
void getAllFailed(QDBusError error);
private slots: private slots:
void onPropertiesChanged( void onPropertiesChanged(

View file

@ -26,6 +26,7 @@
#include "dbus_item.h" #include "dbus_item.h"
#include "dbus_item_types.hpp" #include "dbus_item_types.hpp"
#include "host.hpp" #include "host.hpp"
#include "watcher.hpp"
using namespace qs::dbus; using namespace qs::dbus;
using namespace qs::dbus::dbusmenu; using namespace qs::dbus::dbusmenu;
@ -76,6 +77,7 @@ StatusNotifierItem::StatusNotifierItem(const QString& address, QObject* parent)
QObject::connect(&this->overlayIconPixmaps, &AbstractDBusProperty::changed, this, &StatusNotifierItem::updateIcon); QObject::connect(&this->overlayIconPixmaps, &AbstractDBusProperty::changed, this, &StatusNotifierItem::updateIcon);
QObject::connect(&this->properties, &DBusPropertyGroup::getAllFinished, this, &StatusNotifierItem::onGetAllFinished); QObject::connect(&this->properties, &DBusPropertyGroup::getAllFinished, this, &StatusNotifierItem::onGetAllFinished);
QObject::connect(&this->properties, &DBusPropertyGroup::getAllFailed, this, &StatusNotifierItem::onGetAllFailed);
QObject::connect(&this->menuPath, &AbstractDBusProperty::changed, this, &StatusNotifierItem::onMenuPathChanged); QObject::connect(&this->menuPath, &AbstractDBusProperty::changed, this, &StatusNotifierItem::onMenuPathChanged);
// clang-format on // clang-format on
@ -246,6 +248,19 @@ void StatusNotifierItem::onGetAllFinished() {
emit this->ready(); emit this->ready();
} }
void StatusNotifierItem::onGetAllFailed() {
// Not changing the item to ready, as it is almost definitely broken.
if (!this->mReady) {
qWarning(logStatusNotifierItem) << "Failed to load tray item" << this->properties.toString();
if (!StatusNotifierWatcher::instance()->isRegistered()) {
qWarning(logStatusNotifierItem)
<< "Another StatusNotifier host seems to be running. Please disable it and check that "
"the problem persists before reporting an issue.";
}
}
}
TrayImageHandle::TrayImageHandle(StatusNotifierItem* item) TrayImageHandle::TrayImageHandle(StatusNotifierItem* item)
: QsImageHandle(QQmlImageProviderBase::Pixmap, item) : QsImageHandle(QQmlImageProviderBase::Pixmap, item)
, item(item) {} , item(item) {}
@ -257,6 +272,7 @@ TrayImageHandle::requestPixmap(const QString& /*unused*/, QSize* size, const QSi
auto pixmap = this->item->createPixmap(targetSize); auto pixmap = this->item->createPixmap(targetSize);
if (pixmap.isNull()) { if (pixmap.isNull()) {
qCWarning(logStatusNotifierItem) << "Unable to create pixmap for tray icon" << this->item;
pixmap = IconImageProvider::missingPixmap(targetSize); pixmap = IconImageProvider::missingPixmap(targetSize);
} }

View file

@ -75,6 +75,7 @@ signals:
private slots: private slots:
void updateIcon(); void updateIcon();
void onGetAllFinished(); void onGetAllFinished();
void onGetAllFailed();
void onMenuPathChanged(); void onMenuPathChanged();
private: private:

View file

@ -47,12 +47,15 @@ StatusNotifierWatcher::StatusNotifierWatcher(QObject* parent): QObject(parent) {
this->tryRegister(); this->tryRegister();
} }
bool StatusNotifierWatcher::isRegistered() const { return this->registered; }
void StatusNotifierWatcher::tryRegister() { // NOLINT void StatusNotifierWatcher::tryRegister() { // NOLINT
auto bus = QDBusConnection::sessionBus(); auto bus = QDBusConnection::sessionBus();
auto success = bus.registerService("org.kde.StatusNotifierWatcher"); auto success = bus.registerService("org.kde.StatusNotifierWatcher");
if (success) { if (success) {
qCDebug(logStatusNotifierWatcher) << "Registered watcher at org.kde.StatusNotifierWatcher"; qCDebug(logStatusNotifierWatcher) << "Registered watcher at org.kde.StatusNotifierWatcher";
this->registered = true;
} else { } else {
qCDebug(logStatusNotifierWatcher) qCDebug(logStatusNotifierWatcher)
<< "Could not register watcher at org.kde.StatusNotifierWatcher, presumably because one is " << "Could not register watcher at org.kde.StatusNotifierWatcher, presumably because one is "
@ -68,7 +71,6 @@ void StatusNotifierWatcher::onServiceUnregistered(const QString& service) {
<< "Active StatusNotifierWatcher unregistered, attempting registration"; << "Active StatusNotifierWatcher unregistered, attempting registration";
this->tryRegister(); this->tryRegister();
return; return;
;
} else { } else {
QString qualifiedItem; QString qualifiedItem;
this->items.removeIf([&](const QString& item) { this->items.removeIf([&](const QString& item) {

View file

@ -29,6 +29,7 @@ public:
[[nodiscard]] qint32 protocolVersion() const { return 0; } // NOLINT [[nodiscard]] qint32 protocolVersion() const { return 0; } // NOLINT
[[nodiscard]] bool isHostRegistered() const; [[nodiscard]] bool isHostRegistered() const;
[[nodiscard]] QList<QString> registeredItems() const; [[nodiscard]] QList<QString> registeredItems() const;
[[nodiscard]] bool isRegistered() const;
// NOLINTBEGIN // NOLINTBEGIN
void RegisterStatusNotifierHost(const QString& host); void RegisterStatusNotifierHost(const QString& host);
@ -54,6 +55,7 @@ private:
QDBusServiceWatcher serviceWatcher; QDBusServiceWatcher serviceWatcher;
QList<QString> hosts; QList<QString> hosts;
QList<QString> items; QList<QString> items;
bool registered = false;
}; };
} // namespace qs::service::sni } // namespace qs::service::sni