diff --git a/Plugins/ZShell/CMakeLists.txt b/Plugins/ZShell/CMakeLists.txt index c5f041e..1e04ea7 100644 --- a/Plugins/ZShell/CMakeLists.txt +++ b/Plugins/ZShell/CMakeLists.txt @@ -45,11 +45,13 @@ qml_module(ZShell requests.hpp requests.cpp toaster.hpp toaster.cpp qalculator.hpp qalculator.cpp + lidwatcher.hpp lidwatcher.cpp LIBRARIES Qt::Gui Qt::Quick Qt::Concurrent Qt::Sql + Qt::DBus PkgConfig::Qalculate ) diff --git a/Plugins/ZShell/lidwatcher.cpp b/Plugins/ZShell/lidwatcher.cpp new file mode 100644 index 0000000..49386a2 --- /dev/null +++ b/Plugins/ZShell/lidwatcher.cpp @@ -0,0 +1,49 @@ +#include "lidwatcher.hpp" + +#include +#include + +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 diff --git a/Plugins/ZShell/lidwatcher.hpp b/Plugins/ZShell/lidwatcher.hpp new file mode 100644 index 0000000..c2e1d08 --- /dev/null +++ b/Plugins/ZShell/lidwatcher.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include +#include + +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 diff --git a/shell.qml b/shell.qml index c5c5b7f..bde4d41 100644 --- a/shell.qml +++ b/shell.qml @@ -7,6 +7,7 @@ //@ pragma DropExpensiveFonts import Quickshell import Quickshell.Services.UPower +import ZShell import qs.Modules import qs.Modules.Wallpaper import qs.Modules.Lock @@ -35,6 +36,14 @@ ShellRoot { id: lock } + Connections { + function onLidClosing(): void { + lock.locked = true; + } + + target: LidWatcher + } + Shortcuts { }