From d246ba1800b3a81a4f7723965fbad7a666ac593f Mon Sep 17 00:00:00 2001 From: zach Date: Tue, 2 Jun 2026 16:09:48 +0200 Subject: [PATCH 1/3] rewrite the manager responsible for handling automatic hyprsunset temperature activation as a qml plugin --- Helpers/Hyprsunset.qml | 70 ++------- Plugins/ZShell/Services/CMakeLists.txt | 1 + Plugins/ZShell/Services/hyprsunsetmanager.cpp | 145 ++++++++++++++++++ Plugins/ZShell/Services/hyprsunsetmanager.hpp | 64 ++++++++ 4 files changed, 221 insertions(+), 59 deletions(-) create mode 100644 Plugins/ZShell/Services/hyprsunsetmanager.cpp create mode 100644 Plugins/ZShell/Services/hyprsunsetmanager.hpp diff --git a/Helpers/Hyprsunset.qml b/Helpers/Hyprsunset.qml index 6c6d963..1df7d9d 100644 --- a/Helpers/Hyprsunset.qml +++ b/Helpers/Hyprsunset.qml @@ -2,12 +2,13 @@ pragma Singleton import Quickshell import QtQuick +import ZShell.Services import qs.Config Singleton { id: root - property bool enabled + readonly property bool enabled: service.enabled readonly property int end: Config.general.color.scheduleHyprsunsetEnd property bool manualToggle: false readonly property int start: Config.general.color.scheduleHyprsunsetStart @@ -17,69 +18,20 @@ Singleton { if (!Config.general.color.scheduleHyprsunset) return; - var now = new Date(); - if (now.getHours() >= root.start || now.getHours() < root.end) { - root.startNightLight(root.temp); - } else { - root.stopNightLight(); - } - } - - function startNightLight(temp: int): void { - Quickshell.execDetached(["hyprctl", "hyprsunset", "temperature", `${temp}`]); - root.enabled = true; - } - - function stopNightLight(): void { - Quickshell.execDetached(["hyprctl", "hyprsunset", "identity"]); - root.enabled = false; + service.apply(); } function toggleNightLight(): void { - if (enabled) - stopNightLight(); - else - startNightLight(temp); + service.manualToggle = true; + service.toggle(); } - onManualToggleChanged: { - if (root.manualToggle) - manualTimer.start(); - } + HyprsunsetManager { + id: service - Timer { - id: manualTimer - - interval: 60000 * 60 - repeat: false - running: false - - onTriggered: { - root.manualToggle = false; - } - } - - Timer { - interval: 5000 - repeat: true - running: true - triggeredOnStart: true - - onTriggered: { - if (!Config.general.color.scheduleHyprsunset) - return; - - if (root.manualToggle) - return; - - var now = new Date(); - if (now.getHours() >= root.start || now.getHours() < root.end) { - if (!root.enabled) - root.startNightLight(root.temp); - } else { - if (root.enabled) - root.stopNightLight(); - } - } + activeAuto: Config.general.color.scheduleHyprsunset + endTime: root.end + startTime: root.start + temp: root.temp } } diff --git a/Plugins/ZShell/Services/CMakeLists.txt b/Plugins/ZShell/Services/CMakeLists.txt index bc4274f..f45ecdf 100644 --- a/Plugins/ZShell/Services/CMakeLists.txt +++ b/Plugins/ZShell/Services/CMakeLists.txt @@ -9,6 +9,7 @@ qml_module(ZShell-services cavaprovider.hpp cavaprovider.cpp desktopmodel.hpp desktopmodel.cpp desktopstatemanager.hpp desktopstatemanager.cpp + hyprsunsetmanager.hpp hyprsunsetmanager.cpp LIBRARIES Qt6::Core Qt6::Qml diff --git a/Plugins/ZShell/Services/hyprsunsetmanager.cpp b/Plugins/ZShell/Services/hyprsunsetmanager.cpp new file mode 100644 index 0000000..4614606 --- /dev/null +++ b/Plugins/ZShell/Services/hyprsunsetmanager.cpp @@ -0,0 +1,145 @@ +#include "hyprsunsetmanager.hpp" +#include +#include +#include +#include + +namespace ZShell::services { + +HyprsunsetManager::HyprsunsetManager(QObject* parent) : QObject(parent) { + connect(&m_timer, &QTimer::timeout, this, &HyprsunsetManager::apply); + connect(&m_manualTimer, &QTimer::timeout, this, [this] { + m_manualToggle = false; + emit manualToggleChanged(); + apply(); + }); + connect(&m_startCooldown, &QTimer::timeout, this, [this] { + m_startAllowed = true; + apply(); + }); + + m_startCooldown.start(2000); + m_manualTimer.setSingleShot(true); + m_timer.start(60000); + + m_process.setStandardInputFile(QProcess::nullDevice()); + m_process.setStandardOutputFile(QProcess::nullDevice()); + + apply(); +} + +int HyprsunsetManager::startTime() const { + return m_startTime; +} + +int HyprsunsetManager::endTime() const { + return m_endTime; +} + +bool HyprsunsetManager::manualToggle() const { + return m_manualToggle; +} + +bool HyprsunsetManager::enabled() const { + return m_enabled; +} + +bool HyprsunsetManager::activeAuto() const { + return m_activeAuto; +} + +int HyprsunsetManager::temp() const { + return m_temp; +} + +void HyprsunsetManager::setActiveAuto(bool activeAuto) { + if (activeAuto == m_activeAuto) + return; + + m_activeAuto = activeAuto; + emit activeAutoChanged(); +} + +void HyprsunsetManager::setManualToggle(bool toggle) { + if (toggle == m_manualToggle) + return; + + m_manualToggle = toggle; + emit manualToggleChanged(); + + m_manualTimer.start(60 * 60 * 1000); +} + +void HyprsunsetManager::setEndTime(const int& time) { + if (time == m_endTime) + return; + + m_endTime = time; + emit endTimeChanged(); + apply(); +} + +void HyprsunsetManager::setStartTime(const int& time) { + if (time == m_startTime) + return; + + m_startTime = time; + emit startTimeChanged(); + apply(); +} + +void HyprsunsetManager::setTemp(const int& temp) { + if (temp == m_temp) + return; + + m_temp = temp; + emit tempChanged(); + apply(); +} + +void HyprsunsetManager::toggle() { + if (m_enabled) { + end(); + } else { + start(); + } +} + +void HyprsunsetManager::start() { + if (m_enabled) + return; + + m_enabled = true; + emit enabledChanged(); + + m_process.setProgram("hyprctl"); + m_process.setArguments({"hyprsunset", "temperature", QString::number(m_temp)}); + m_process.startDetached(); +} + +void HyprsunsetManager::end() { + if (!m_enabled) + return; + + m_enabled = false; + emit enabledChanged(); + + m_process.setProgram("hyprctl"); + m_process.setArguments({"hyprsunset", "identity"}); + m_process.startDetached(); +} + +void HyprsunsetManager::apply() { + if (m_manualToggle || !m_activeAuto || !m_startAllowed) + return; + + const auto current = QTime::currentTime().hour(); + + if (current >= m_startTime || current < m_endTime) { + start(); + } else { + end(); + } +} + +}; diff --git a/Plugins/ZShell/Services/hyprsunsetmanager.hpp b/Plugins/ZShell/Services/hyprsunsetmanager.hpp new file mode 100644 index 0000000..7ee5139 --- /dev/null +++ b/Plugins/ZShell/Services/hyprsunsetmanager.hpp @@ -0,0 +1,64 @@ +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace ZShell::services { + +class HyprsunsetManager : public QObject { +Q_OBJECT +QML_ELEMENT +Q_PROPERTY(bool enabled READ enabled NOTIFY enabledChanged) +Q_PROPERTY(int startTime READ startTime WRITE setStartTime NOTIFY startTimeChanged) +Q_PROPERTY(int endTime READ endTime WRITE setEndTime NOTIFY endTimeChanged) +Q_PROPERTY(int temp READ temp WRITE setTemp NOTIFY tempChanged) +Q_PROPERTY(bool activeAuto READ activeAuto WRITE setActiveAuto NOTIFY activeAutoChanged) +Q_PROPERTY(bool manualToggle READ manualToggle WRITE setManualToggle NOTIFY manualToggleChanged) + +public: +explicit HyprsunsetManager(QObject* parent = nullptr); + +int startTime() const; +int endTime() const; +bool enabled() const; +int temp() const; +bool activeAuto() const; +bool manualToggle() const; +Q_INVOKABLE void toggle(); +Q_INVOKABLE void apply(); + +void setStartTime(const int& time); +void setEndTime(const int& time); +void setTemp(const int& temp); +void setActiveAuto(bool activeAuto); +void setManualToggle(bool toggle); + +signals: +void enabledChanged(); +void startTimeChanged(); +void activeAutoChanged(); +void endTimeChanged(); +void tempChanged(); +void manualToggleChanged(); + +private: +int m_startTime; +int m_endTime; +bool m_enabled; +bool m_manualToggle = false; +bool m_activeAuto; +bool m_startAllowed; +QTimer m_startCooldown; +int m_temp; +QProcess m_process; +QTimer m_timer; +QTimer m_manualTimer; +void start(); +void end(); +}; + +}; -- 2.47.3 From 6586cc27886ee8fde1fe5556a77170e1ff5773d5 Mon Sep 17 00:00:00 2001 From: zach Date: Wed, 3 Jun 2026 23:19:34 +0200 Subject: [PATCH 2/3] do not use apply() in initializer --- Plugins/ZShell/Services/hyprsunsetmanager.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/Plugins/ZShell/Services/hyprsunsetmanager.cpp b/Plugins/ZShell/Services/hyprsunsetmanager.cpp index 4614606..e02be96 100644 --- a/Plugins/ZShell/Services/hyprsunsetmanager.cpp +++ b/Plugins/ZShell/Services/hyprsunsetmanager.cpp @@ -24,8 +24,6 @@ HyprsunsetManager::HyprsunsetManager(QObject* parent) : QObject(parent) { m_process.setStandardInputFile(QProcess::nullDevice()); m_process.setStandardOutputFile(QProcess::nullDevice()); - - apply(); } int HyprsunsetManager::startTime() const { -- 2.47.3 From 94f2cf076c01aafeeea2dd7e1d765c077ed74b3b Mon Sep 17 00:00:00 2001 From: zach Date: Thu, 4 Jun 2026 15:05:18 +0200 Subject: [PATCH 3/3] fix applying end() on init --- Plugins/ZShell/Services/hyprsunsetmanager.cpp | 8 ++++++-- Plugins/ZShell/Services/hyprsunsetmanager.hpp | 5 +++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Plugins/ZShell/Services/hyprsunsetmanager.cpp b/Plugins/ZShell/Services/hyprsunsetmanager.cpp index e02be96..c413efa 100644 --- a/Plugins/ZShell/Services/hyprsunsetmanager.cpp +++ b/Plugins/ZShell/Services/hyprsunsetmanager.cpp @@ -104,10 +104,12 @@ void HyprsunsetManager::toggle() { } void HyprsunsetManager::start() { - if (m_enabled) + if (m_enabled && m_initialized) return; + m_initialized = true; m_enabled = true; + emit enabledChanged(); m_process.setProgram("hyprctl"); @@ -116,10 +118,12 @@ void HyprsunsetManager::start() { } void HyprsunsetManager::end() { - if (!m_enabled) + if (!m_enabled && m_initialized) return; + m_initialized = true; m_enabled = false; + emit enabledChanged(); m_process.setProgram("hyprctl"); diff --git a/Plugins/ZShell/Services/hyprsunsetmanager.hpp b/Plugins/ZShell/Services/hyprsunsetmanager.hpp index 7ee5139..2f9b381 100644 --- a/Plugins/ZShell/Services/hyprsunsetmanager.hpp +++ b/Plugins/ZShell/Services/hyprsunsetmanager.hpp @@ -48,10 +48,11 @@ void manualToggleChanged(); private: int m_startTime; int m_endTime; -bool m_enabled; +bool m_enabled = false; bool m_manualToggle = false; bool m_activeAuto; -bool m_startAllowed; +bool m_startAllowed = false; +bool m_initialized = false; QTimer m_startCooldown; int m_temp; QProcess m_process; -- 2.47.3