lidwatcher plugin initial setup

This commit is contained in:
2026-06-01 20:02:37 +02:00
parent 82aa7c415f
commit 7de8cc3104
4 changed files with 92 additions and 0 deletions
+2
View File
@@ -45,11 +45,13 @@ qml_module(ZShell
requests.hpp requests.cpp requests.hpp requests.cpp
toaster.hpp toaster.cpp toaster.hpp toaster.cpp
qalculator.hpp qalculator.cpp qalculator.hpp qalculator.cpp
lidwatcher.hpp lidwatcher.cpp
LIBRARIES LIBRARIES
Qt::Gui Qt::Gui
Qt::Quick Qt::Quick
Qt::Concurrent Qt::Concurrent
Qt::Sql Qt::Sql
Qt::DBus
PkgConfig::Qalculate PkgConfig::Qalculate
) )
+49
View File
@@ -0,0 +1,49 @@
#include "lidwatcher.hpp"
#include <QtDBus/QDBusConnection>
#include <QLoggingCategory>
Q_LOGGING_CATEGORY(lcLidWatcher, "ZShell.lidwatcher", QtInfoMsg)
namespace ZShell {
static constexpr auto kLogin1Service = "org.freedesktop.login1";
static constexpr auto kLogin1Path = "/org/freedesktop/login1";
static constexpr auto kLogin1Interface = "org.freedesktop.login1.Manager";
static constexpr auto kPrepareForSleep = "PrepareForSleep";
LidWatcher::LidWatcher(QObject* parent)
: QObject(parent)
, m_available(false) {
QDBusConnection bus = QDBusConnection::systemBus();
m_available = bus.isConnected();
if (!m_available) {
qCWarning(lcLidWatcher) << "system bus unavailable";
emit availableChanged();
return;
}
const auto ok = bus.connect(kLogin1Service, kLogin1Path, kLogin1Interface, kPrepareForSleep, this,
SLOT(onPrepareForSleep(bool)));
m_available = ok;
emit availableChanged();
if (!m_available) {
qCWarning(lcLidWatcher) << "login1 lid signal unavailable";
}
}
bool LidWatcher::available() const {
return m_available;
}
void LidWatcher::onPrepareForSleep(bool goingDown) {
if (goingDown) {
emit lidClosing();
} else {
emit lidOpened();
}
}
} // namespace ZShell
+32
View File
@@ -0,0 +1,32 @@
#pragma once
#include <QObject>
#include <qqmlintegration.h>
namespace ZShell {
class LidWatcher : public QObject {
Q_OBJECT
QML_ELEMENT
QML_SINGLETON
Q_PROPERTY(bool available READ available NOTIFY availableChanged)
public:
explicit LidWatcher(QObject* parent = nullptr);
[[nodiscard]] bool available() const;
private Q_SLOTS:
void onPrepareForSleep(bool goingDown);
Q_SIGNALS:
void availableChanged();
void lidClosing();
void lidOpened();
private:
bool m_available;
};
} // namespace ZShell
+9
View File
@@ -7,6 +7,7 @@
//@ pragma DropExpensiveFonts //@ pragma DropExpensiveFonts
import Quickshell import Quickshell
import Quickshell.Services.UPower import Quickshell.Services.UPower
import ZShell
import qs.Modules import qs.Modules
import qs.Modules.Wallpaper import qs.Modules.Wallpaper
import qs.Modules.Lock import qs.Modules.Lock
@@ -35,6 +36,14 @@ ShellRoot {
id: lock id: lock
} }
Connections {
function onLidClosing(): void {
lock.locked = true;
}
target: LidWatcher
}
Shortcuts { Shortcuts {
} }