forked from quickshell/quickshell
service/upower: start upower dbus service if inactive
This commit is contained in:
parent
d630cc7f76
commit
7c5632ef5f
5 changed files with 94 additions and 4 deletions
|
@ -9,6 +9,7 @@ qt_add_dbus_interface(DBUS_INTERFACES
|
||||||
|
|
||||||
qt_add_library(quickshell-dbus STATIC
|
qt_add_library(quickshell-dbus STATIC
|
||||||
properties.cpp
|
properties.cpp
|
||||||
|
bus.cpp
|
||||||
${DBUS_INTERFACES}
|
${DBUS_INTERFACES}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
57
src/dbus/bus.cpp
Normal file
57
src/dbus/bus.cpp
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
#include "bus.hpp" // NOLINT
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
#include <qcontainerfwd.h>
|
||||||
|
#include <qdbusconnection.h>
|
||||||
|
#include <qdbusmessage.h>
|
||||||
|
#include <qdbuspendingcall.h>
|
||||||
|
#include <qdbuspendingreply.h>
|
||||||
|
#include <qlogging.h>
|
||||||
|
#include <qloggingcategory.h>
|
||||||
|
#include <qobject.h>
|
||||||
|
#include <qtypes.h>
|
||||||
|
#include <qvariant.h>
|
||||||
|
|
||||||
|
namespace qs::dbus {
|
||||||
|
|
||||||
|
Q_LOGGING_CATEGORY(logDbus, "quickshell.dbus", QtWarningMsg);
|
||||||
|
|
||||||
|
void tryLaunchService(
|
||||||
|
QObject* parent,
|
||||||
|
QDBusConnection& connection,
|
||||||
|
const QString& serviceName,
|
||||||
|
const std::function<void(bool)>& 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<quint32> 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
|
18
src/dbus/bus.hpp
Normal file
18
src/dbus/bus.hpp
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
#include <qcontainerfwd.h>
|
||||||
|
#include <qdbusconnection.h>
|
||||||
|
#include <qobject.h>
|
||||||
|
|
||||||
|
namespace qs::dbus {
|
||||||
|
|
||||||
|
void tryLaunchService(
|
||||||
|
QObject* parent,
|
||||||
|
QDBusConnection& connection,
|
||||||
|
const QString& serviceName,
|
||||||
|
const std::function<void(bool)>& callback
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
|
@ -14,6 +14,7 @@
|
||||||
#include <qtmetamacros.h>
|
#include <qtmetamacros.h>
|
||||||
|
|
||||||
#include "../../core/model.hpp"
|
#include "../../core/model.hpp"
|
||||||
|
#include "../../dbus/bus.hpp"
|
||||||
#include "../../dbus/properties.hpp"
|
#include "../../dbus/properties.hpp"
|
||||||
#include "dbus_service.h"
|
#include "dbus_service.h"
|
||||||
#include "device.hpp"
|
#include "device.hpp"
|
||||||
|
@ -23,7 +24,7 @@ namespace qs::service::upower {
|
||||||
Q_LOGGING_CATEGORY(logUPower, "quickshell.service.upower", QtWarningMsg);
|
Q_LOGGING_CATEGORY(logUPower, "quickshell.service.upower", QtWarningMsg);
|
||||||
|
|
||||||
UPower::UPower() {
|
UPower::UPower() {
|
||||||
qCDebug(logUPower) << "Starting UPower";
|
qCDebug(logUPower) << "Starting UPower Service";
|
||||||
|
|
||||||
auto bus = QDBusConnection::systemBus();
|
auto bus = QDBusConnection::systemBus();
|
||||||
|
|
||||||
|
@ -36,10 +37,22 @@ UPower::UPower() {
|
||||||
new DBusUPowerService("org.freedesktop.UPower", "/org/freedesktop/UPower", bus, this);
|
new DBusUPowerService("org.freedesktop.UPower", "/org/freedesktop/UPower", bus, this);
|
||||||
|
|
||||||
if (!this->service->isValid()) {
|
if (!this->service->isValid()) {
|
||||||
qCWarning(logUPower) << "Cannot connect to the UPower service.";
|
qCDebug(logUPower) << "UPower service is not currently running, attempting to start it.";
|
||||||
return;
|
|
||||||
|
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(
|
QObject::connect(
|
||||||
&this->pOnBattery,
|
&this->pOnBattery,
|
||||||
&dbus::AbstractDBusProperty::changed,
|
&dbus::AbstractDBusProperty::changed,
|
||||||
|
|
|
@ -35,6 +35,7 @@ private slots:
|
||||||
private:
|
private:
|
||||||
explicit UPower();
|
explicit UPower();
|
||||||
|
|
||||||
|
void init();
|
||||||
void registerExisting();
|
void registerExisting();
|
||||||
void registerDevice(const QString& path);
|
void registerDevice(const QString& path);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue