From 7c5632ef5fb73c6c02c841de675f6f1f8469a23b Mon Sep 17 00:00:00 2001 From: outfoxxed Date: Fri, 12 Jul 2024 13:44:09 -0700 Subject: [PATCH] service/upower: start upower dbus service if inactive --- src/dbus/CMakeLists.txt | 1 + src/dbus/bus.cpp | 57 ++++++++++++++++++++++++++++++++++++ src/dbus/bus.hpp | 18 ++++++++++++ src/services/upower/core.cpp | 21 ++++++++++--- src/services/upower/core.hpp | 1 + 5 files changed, 94 insertions(+), 4 deletions(-) create mode 100644 src/dbus/bus.cpp create mode 100644 src/dbus/bus.hpp diff --git a/src/dbus/CMakeLists.txt b/src/dbus/CMakeLists.txt index ee6df30a..49a4a06b 100644 --- a/src/dbus/CMakeLists.txt +++ b/src/dbus/CMakeLists.txt @@ -9,6 +9,7 @@ qt_add_dbus_interface(DBUS_INTERFACES qt_add_library(quickshell-dbus STATIC properties.cpp + bus.cpp ${DBUS_INTERFACES} ) diff --git a/src/dbus/bus.cpp b/src/dbus/bus.cpp new file mode 100644 index 00000000..6f560e9e --- /dev/null +++ b/src/dbus/bus.cpp @@ -0,0 +1,57 @@ +#include "bus.hpp" // NOLINT +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace qs::dbus { + +Q_LOGGING_CATEGORY(logDbus, "quickshell.dbus", QtWarningMsg); + +void tryLaunchService( + QObject* parent, + QDBusConnection& connection, + const QString& serviceName, + const std::function& callback +) { + qCDebug(logDbus) << "Attempting to launch service" << serviceName; + + auto message = QDBusMessage::createMethodCall( + "org.freedesktop.DBus", + "/org/freedesktop/DBus", + "org.freedesktop.DBus", + "StartServiceByName" + ); + + message << serviceName << 0u; + auto pendingCall = connection.asyncCall(message); + + auto* call = new QDBusPendingCallWatcher(pendingCall, parent); + + auto responseCallback = [callback, serviceName](QDBusPendingCallWatcher* call) { + const QDBusPendingReply reply = *call; + + if (reply.isError()) { + qCWarning(logDbus).noquote().nospace() + << "Could not launch service " << serviceName << ": " << reply.error(); + callback(false); + } else { + qCDebug(logDbus) << "Service launch successful for" << serviceName; + callback(true); + } + + delete call; + }; + + QObject::connect(call, &QDBusPendingCallWatcher::finished, parent, responseCallback); +} + +} // namespace qs::dbus diff --git a/src/dbus/bus.hpp b/src/dbus/bus.hpp new file mode 100644 index 00000000..1c4c71e4 --- /dev/null +++ b/src/dbus/bus.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include + +#include +#include +#include + +namespace qs::dbus { + +void tryLaunchService( + QObject* parent, + QDBusConnection& connection, + const QString& serviceName, + const std::function& callback +); + +} diff --git a/src/services/upower/core.cpp b/src/services/upower/core.cpp index de952e00..b8ba9abe 100644 --- a/src/services/upower/core.cpp +++ b/src/services/upower/core.cpp @@ -14,6 +14,7 @@ #include #include "../../core/model.hpp" +#include "../../dbus/bus.hpp" #include "../../dbus/properties.hpp" #include "dbus_service.h" #include "device.hpp" @@ -23,7 +24,7 @@ namespace qs::service::upower { Q_LOGGING_CATEGORY(logUPower, "quickshell.service.upower", QtWarningMsg); UPower::UPower() { - qCDebug(logUPower) << "Starting UPower"; + qCDebug(logUPower) << "Starting UPower Service"; auto bus = QDBusConnection::systemBus(); @@ -36,10 +37,22 @@ UPower::UPower() { new DBusUPowerService("org.freedesktop.UPower", "/org/freedesktop/UPower", bus, this); if (!this->service->isValid()) { - qCWarning(logUPower) << "Cannot connect to the UPower service."; - return; - } + qCDebug(logUPower) << "UPower service is not currently running, attempting to start it."; + dbus::tryLaunchService(this, bus, "org.freedesktop.UPower", [this](bool success) { + if (success) { + qCDebug(logUPower) << "Successfully launched UPower service."; + this->init(); + } else { + qCWarning(logUPower) << "Could not start UPower. The UPower service will not work."; + } + }); + } else { + this->init(); + } +} + +void UPower::init() { QObject::connect( &this->pOnBattery, &dbus::AbstractDBusProperty::changed, diff --git a/src/services/upower/core.hpp b/src/services/upower/core.hpp index 3b2f8602..aaeed5ac 100644 --- a/src/services/upower/core.hpp +++ b/src/services/upower/core.hpp @@ -35,6 +35,7 @@ private slots: private: explicit UPower(); + void init(); void registerExisting(); void registerDevice(const QString& path);