From ecc4a1249da85a736042a6ff084809dbd5ab63c4 Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Fri, 18 Jul 2025 04:14:58 -0700 Subject: [PATCH] all: mask various useless dbus errors --- src/dbus/dbusmenu/dbusmenu.cpp | 4 +- src/dbus/properties.cpp | 9 ++- src/services/mpris/player.cpp | 87 +++++++++++++++------------ src/services/mpris/player.hpp | 40 +++++++++--- src/services/notifications/server.cpp | 2 +- src/services/status_notifier/item.cpp | 25 +++++--- 6 files changed, 106 insertions(+), 61 deletions(-) diff --git a/src/dbus/dbusmenu/dbusmenu.cpp b/src/dbus/dbusmenu/dbusmenu.cpp index c0b4386f..186b1330 100644 --- a/src/dbus/dbusmenu/dbusmenu.cpp +++ b/src/dbus/dbusmenu/dbusmenu.cpp @@ -312,8 +312,8 @@ void DBusMenu::prepareToShow(qint32 item, qint32 depth) { auto responseCallback = [this, item, depth](QDBusPendingCallWatcher* call) { const QDBusPendingReply reply = *call; if (reply.isError()) { - qCWarning(logDbusMenu) << "Error in AboutToShow, but showing anyway for menu" << item << "of" - << this << reply.error(); + qCDebug(logDbusMenu) << "Error in AboutToShow, but showing anyway for menu" << item << "of" + << this << reply.error(); } this->updateLayout(item, depth); diff --git a/src/dbus/properties.cpp b/src/dbus/properties.cpp index 81f26d28..d0f65d99 100644 --- a/src/dbus/properties.cpp +++ b/src/dbus/properties.cpp @@ -246,8 +246,13 @@ void DBusPropertyGroup::requestPropertyUpdate(DBusPropertyCore* property) { const QDBusPendingReply reply = *call; if (reply.isError()) { - qCWarning(logDbusProperties).noquote() << "Error updating property" << propStr; - qCWarning(logDbusProperties) << reply.error(); + if (!property->isRequired() && reply.error().type() == QDBusError::InvalidArgs) { + qCDebug(logDbusProperties) << "Error updating non-required property" << propStr; + qCDebug(logDbusProperties) << reply.error(); + } else { + qCWarning(logDbusProperties).noquote() << "Error updating property" << propStr; + qCWarning(logDbusProperties) << reply.error(); + } } else { this->tryUpdateProperty(property, reply.value().variant()); } diff --git a/src/services/mpris/player.cpp b/src/services/mpris/player.cpp index 45d5cd4a..116a6e9e 100644 --- a/src/services/mpris/player.cpp +++ b/src/services/mpris/player.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -101,41 +102,10 @@ MprisPlayer::MprisPlayer(const QString& address, QObject* parent): QObject(paren this->bLengthSupported.setBinding([this]() { return this->bInternalLength != -1; }); - this->bPlaybackState.setBinding([this]() { - const auto& status = this->bpPlaybackStatus.value(); - - if (status == "Playing") { - return MprisPlaybackState::Playing; - } else if (status == "Paused") { - this->pausedTime = QDateTime::currentDateTimeUtc(); - return MprisPlaybackState::Paused; - } else if (status == "Stopped") { - return MprisPlaybackState::Stopped; - } else { - qWarning() << "Received unexpected PlaybackStatus for" << this << status; - return MprisPlaybackState::Stopped; - } - }); - this->bIsPlaying.setBinding([this]() { return this->bPlaybackState == MprisPlaybackState::Playing; }); - this->bLoopState.setBinding([this]() { - const auto& status = this->bpLoopStatus.value(); - - if (status == "None") { - return MprisLoopState::None; - } else if (status == "Track") { - return MprisLoopState::Track; - } else if (status == "Playlist") { - return MprisLoopState::Playlist; - } else { - qWarning() << "Received unexpected LoopStatus for" << this << status; - return MprisLoopState::None; - } - }); - // clang-format off QObject::connect(this->player, &DBusMprisPlayer::Seeked, this, &MprisPlayer::onSeek); QObject::connect(&this->playerProperties, &DBusPropertyGroup::getAllFinished, this, &MprisPlayer::onGetAllFinished); @@ -432,18 +402,11 @@ void MprisPlayer::setLoopState(MprisLoopState::Enum loopState) { } if (loopState == this->bLoopState) return; - - QString loopStatusStr; - switch (loopState) { - case MprisLoopState::None: loopStatusStr = "None"; break; - case MprisLoopState::Track: loopStatusStr = "Track"; break; - case MprisLoopState::Playlist: loopStatusStr = "Playlist"; break; - default: + if (loopState < MprisLoopState::None || loopState > MprisLoopState::Playlist) { qWarning() << "Cannot set loopState of" << this << "to unknown value" << loopState; - return; } - this->bpLoopStatus = loopStatusStr; + this->bLoopState = loopState; this->pLoopStatus.write(); } @@ -496,3 +459,47 @@ void MprisPlayer::onGetAllFinished() { } } // namespace qs::service::mpris + +namespace qs::dbus { + +using namespace qs::service::mpris; + +DBusResult +DBusDataTransform::fromWire(const QString& wire) { + if (wire == "Playing") return MprisPlaybackState::Playing; + if (wire == "Paused") return MprisPlaybackState::Paused; + if (wire == "Stopped") return MprisPlaybackState::Stopped; + return QDBusError(QDBusError::InvalidArgs, QString("Invalid MprisPlaybackState: %1").arg(wire)); +} + +QString DBusDataTransform::toWire(MprisPlaybackState::Enum data) { + switch (data) { + case MprisPlaybackState::Playing: return "Playing"; + case MprisPlaybackState::Paused: return "Paused"; + case MprisPlaybackState::Stopped: return "Stopped"; + default: + qFatal() << "Tried to convert an invalid MprisPlaybackState to String"; + return QString(); + } +} + +DBusResult +DBusDataTransform::fromWire(const QString& wire) { + if (wire == "None") return MprisLoopState::None; + if (wire == "Track") return MprisLoopState::Track; + if (wire == "Playlist") return MprisLoopState::Playlist; + return QDBusError(QDBusError::InvalidArgs, QString("Invalid MprisLoopState: %1").arg(wire)); +} + +QString DBusDataTransform::toWire(MprisLoopState::Enum data) { + switch (data) { + case MprisLoopState::None: return "None"; + case MprisLoopState::Track: return "Track"; + case MprisLoopState::Playlist: return "Playlist"; + default: + qFatal() << "Tried to convert an invalid MprisLoopState to String"; + return QString(); + } +} + +} // namespace qs::dbus diff --git a/src/services/mpris/player.hpp b/src/services/mpris/player.hpp index 89bc27a2..93837c6d 100644 --- a/src/services/mpris/player.hpp +++ b/src/services/mpris/player.hpp @@ -51,6 +51,30 @@ public: Q_INVOKABLE static QString toString(qs::service::mpris::MprisLoopState::Enum status); }; +}; // namespace qs::service::mpris + +namespace qs::dbus { + +template <> +struct DBusDataTransform { + using Wire = QString; + using Data = qs::service::mpris::MprisPlaybackState::Enum; + static DBusResult fromWire(const QString& wire); + static QString toWire(Data data); +}; + +template <> +struct DBusDataTransform { + using Wire = QString; + using Data = qs::service::mpris::MprisLoopState::Enum; + static DBusResult fromWire(const QString& wire); + static QString toWire(Data data); +}; + +}; // namespace qs::dbus + +namespace qs::service::mpris { + ///! A media player exposed over MPRIS. /// A media player exposed over MPRIS. /// @@ -404,13 +428,13 @@ private: QS_DBUS_BINDABLE_PROPERTY_GROUP(MprisPlayer, appProperties); QS_DBUS_PROPERTY_BINDING(MprisPlayer, pIdentity, bIdentity, appProperties, "Identity"); - QS_DBUS_PROPERTY_BINDING(MprisPlayer, pDesktopEntry, bDesktopEntry, appProperties, "DesktopEntry"); - QS_DBUS_PROPERTY_BINDING(MprisPlayer, pCanQuit, bCanQuit, appProperties, "CanQuit"); - QS_DBUS_PROPERTY_BINDING(MprisPlayer, pCanRaise, bCanRaise, appProperties, "CanRaise"); + QS_DBUS_PROPERTY_BINDING(MprisPlayer, pDesktopEntry, bDesktopEntry, appProperties, "DesktopEntry", false); + QS_DBUS_PROPERTY_BINDING(MprisPlayer, pCanQuit, bCanQuit, appProperties, "CanQuit", false); + QS_DBUS_PROPERTY_BINDING(MprisPlayer, pCanRaise, bCanRaise, appProperties, "CanRaise", false); QS_DBUS_PROPERTY_BINDING(MprisPlayer, pFullscreen, bFullscreen, appProperties, "Fullscreen", false); QS_DBUS_PROPERTY_BINDING(MprisPlayer, pCanSetFullscreen, bCanSetFullscreen, appProperties, "CanSetFullscreen", false); - QS_DBUS_PROPERTY_BINDING(MprisPlayer, pSupportedUriSchemes, bSupportedUriSchemes, appProperties, "SupportedUriSchemes"); - QS_DBUS_PROPERTY_BINDING(MprisPlayer, pSupportedMimeTypes, bSupportedMimeTypes, appProperties, "SupportedMimeTypes"); + QS_DBUS_PROPERTY_BINDING(MprisPlayer, pSupportedUriSchemes, bSupportedUriSchemes, appProperties, "SupportedUriSchemes", false); + QS_DBUS_PROPERTY_BINDING(MprisPlayer, pSupportedMimeTypes, bSupportedMimeTypes, appProperties, "SupportedMimeTypes", false); Q_OBJECT_BINDABLE_PROPERTY(MprisPlayer, bool, bpCanPlay); Q_OBJECT_BINDABLE_PROPERTY(MprisPlayer, bool, bpCanPause); @@ -420,8 +444,6 @@ private: Q_OBJECT_BINDABLE_PROPERTY(MprisPlayer, QVariantMap, bpMetadata); QS_BINDING_SUBSCRIBE_METHOD(MprisPlayer, bpMetadata, onMetadataChanged, onValueChanged); Q_OBJECT_BINDABLE_PROPERTY_WITH_ARGS(MprisPlayer, qlonglong, bpPosition, -1, &MprisPlayer::positionChanged); - Q_OBJECT_BINDABLE_PROPERTY(MprisPlayer, QString, bpPlaybackStatus); - Q_OBJECT_BINDABLE_PROPERTY(MprisPlayer, QString, bpLoopStatus); Q_OBJECT_BINDABLE_PROPERTY(MprisPlayer, bool, bCanControl, &MprisPlayer::canControlChanged); Q_OBJECT_BINDABLE_PROPERTY(MprisPlayer, bool, bCanPlay, &MprisPlayer::canPlayChanged); @@ -460,8 +482,8 @@ private: QS_DBUS_PROPERTY_BINDING(MprisPlayer, qlonglong, pPosition, bpPosition, onPositionUpdated, playerProperties, "Position", false); QS_DBUS_PROPERTY_BINDING(MprisPlayer, pVolume, bVolume, playerProperties, "Volume", false); QS_DBUS_PROPERTY_BINDING(MprisPlayer, pMetadata, bpMetadata, playerProperties, "Metadata"); - QS_DBUS_PROPERTY_BINDING(MprisPlayer, void, pPlaybackStatus, bpPlaybackStatus, onPlaybackStatusUpdated, playerProperties, "PlaybackStatus", true); - QS_DBUS_PROPERTY_BINDING(MprisPlayer, pLoopStatus, bpLoopStatus, playerProperties, "LoopStatus", false); + QS_DBUS_PROPERTY_BINDING(MprisPlayer, void, pPlaybackStatus, bPlaybackState, onPlaybackStatusUpdated, playerProperties, "PlaybackStatus", true); + QS_DBUS_PROPERTY_BINDING(MprisPlayer, pLoopStatus, bLoopState, playerProperties, "LoopStatus", false); QS_DBUS_PROPERTY_BINDING(MprisPlayer, pRate, bRate, playerProperties, "Rate", false); QS_DBUS_PROPERTY_BINDING(MprisPlayer, pMinRate, bMinRate, playerProperties, "MinimumRate", false); QS_DBUS_PROPERTY_BINDING(MprisPlayer, pMaxRate, bMaxRate, playerProperties, "MaximumRate", false); diff --git a/src/services/notifications/server.cpp b/src/services/notifications/server.cpp index ac1e9052..3f2469d2 100644 --- a/src/services/notifications/server.cpp +++ b/src/services/notifications/server.cpp @@ -21,7 +21,7 @@ namespace qs::service::notifications { // NOLINTNEXTLINE(misc-use-internal-linkage) -QS_LOGGING_CATEGORY(logNotifications, "quickshell.service.notifications"); +QS_LOGGING_CATEGORY(logNotifications, "quickshell.service.notifications", QtWarningMsg); NotificationServer::NotificationServer() { qDBusRegisterMetaType(); diff --git a/src/services/status_notifier/item.cpp b/src/services/status_notifier/item.cpp index 0b9700f8..650c812e 100644 --- a/src/services/status_notifier/item.cpp +++ b/src/services/status_notifier/item.cpp @@ -222,9 +222,14 @@ void StatusNotifierItem::activate() { const QDBusPendingReply<> reply = *call; if (reply.isError()) { - qCWarning(logStatusNotifierItem).noquote() - << "Error calling Activate method of StatusNotifierItem" << this->properties.toString(); - qCWarning(logStatusNotifierItem) << reply.error(); + if (reply.error().type() == QDBusError::UnknownMethod) { + qCDebug(logStatusNotifierItem) << "Tried to call Activate method of StatusNotifierItem" + << this->properties.toString() << "but it does not exist."; + } else { + qCWarning(logStatusNotifierItem).noquote() + << "Error calling Activate method of StatusNotifierItem" << this->properties.toString(); + qCWarning(logStatusNotifierItem) << reply.error(); + } } delete call; @@ -241,10 +246,16 @@ void StatusNotifierItem::secondaryActivate() { const QDBusPendingReply<> reply = *call; if (reply.isError()) { - qCWarning(logStatusNotifierItem).noquote() - << "Error calling SecondaryActivate method of StatusNotifierItem" - << this->properties.toString(); - qCWarning(logStatusNotifierItem) << reply.error(); + if (reply.error().type() == QDBusError::UnknownMethod) { + qCDebug(logStatusNotifierItem) + << "Tried to call SecondaryActivate method of StatusNotifierItem" + << this->properties.toString() << "but it does not exist."; + } else { + qCWarning(logStatusNotifierItem).noquote() + << "Error calling SecondaryActivate method of StatusNotifierItem" + << this->properties.toString(); + qCWarning(logStatusNotifierItem) << reply.error(); + } } delete call;