plugin: add sleep notifier

Lock before sleep
This commit is contained in:
Soramane 2025-09-26 14:35:54 +10:00
parent 39f52d73f9
commit dc986c00aa
7 changed files with 70 additions and 3 deletions

View file

@ -280,6 +280,7 @@ default, you must create it manually.
"criticalLevel": 3
},
"idle": {
"lockBeforeSleep": true,
"inhibitWhenAudio": true,
"timeouts": [
{

View file

@ -13,6 +13,7 @@ JsonObject {
}
component Idle: JsonObject {
property bool lockBeforeSleep: true
property bool inhibitWhenAudio: true
property list<var> timeouts: [
{

View file

@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import "lock"
import qs.config
import qs.services
import Caelestia.Internal
import Quickshell
import Quickshell.Wayland
@ -17,15 +18,22 @@ Scope {
return;
if (action === "lock")
root.lock.lock.locked = true;
lock.lock.locked = true;
else if (action === "unlock")
root.lock.lock.locked = false;
lock.lock.locked = false;
else if (typeof action === "string")
Hypr.dispatch(action);
else
Quickshell.execDetached(action);
}
SleepNotifier {
onAboutToSleep: {
if (Config.general.idle.lockBeforeSleep)
root.lock.lock.locked = true;
}
}
Variants {
model: Config.general.idle.timeouts

View file

@ -1,4 +1,4 @@
find_package(Qt6 REQUIRED COMPONENTS Core Qml Gui Quick Concurrent Sql Network)
find_package(Qt6 REQUIRED COMPONENTS Core Qml Gui Quick Concurrent Sql Network DBus)
find_package(PkgConfig REQUIRED)
pkg_check_modules(Qalculate IMPORTED_TARGET libqalculate REQUIRED)
pkg_check_modules(Pipewire IMPORTED_TARGET libpipewire-0.3 REQUIRED)

View file

@ -5,9 +5,11 @@ qml_module(caelestia-internal
circularindicatormanager.hpp circularindicatormanager.cpp
hyprdevices.hpp hyprdevices.cpp
hyprextras.hpp hyprextras.cpp
sleepnotifier.hpp sleepnotifier.cpp
LIBRARIES
Qt::Gui
Qt::Quick
Qt::Concurrent
Qt::Network
Qt::DBus
)

View file

@ -0,0 +1,32 @@
#include "sleepnotifier.hpp"
#include <QtDBus/qdbusconnection.h>
#include <QtDBus/qdbuserror.h>
namespace caelestia::internal {
SleepNotifier::SleepNotifier(QObject* parent)
: QObject(parent) {
auto bus = QDBusConnection::systemBus();
if (!bus.isConnected()) {
qWarning() << "SleepNotifier::SleepNotifier: failed to connect to system bus:" << bus.lastError().message();
return;
}
const bool ok = bus.connect("org.freedesktop.login1", "/org/freedesktop/login1", "org.freedesktop.login1.Manager",
"PrepareForSleep", this, SLOT(handlePrepareForSleep(bool)));
if (!ok) {
qWarning() << "SleepNotifier::SleepNotifier: failed to connect to dbus:" << bus.lastError().message();
}
}
void SleepNotifier::handlePrepareForSleep(bool sleep) {
if (sleep) {
emit aboutToSleep();
} else {
emit resumed();
}
}
} // namespace caelestia::internal

View file

@ -0,0 +1,23 @@
#pragma once
#include <qobject.h>
#include <qqmlintegration.h>
namespace caelestia::internal {
class SleepNotifier : public QObject {
Q_OBJECT
QML_ELEMENT
public:
explicit SleepNotifier(QObject* parent = nullptr);
signals:
void aboutToSleep();
void resumed();
private slots:
void handlePrepareForSleep(bool sleep);
};
} // namespace caelestia::internal