From 6781078467d8233099620c69b4d1bb9ccc337a34 Mon Sep 17 00:00:00 2001 From: zach Date: Mon, 19 Oct 2026 19:21:57 +0200 Subject: [PATCH] fix: short nightlight fade duration if missed start or end time or if manually activated --- Helpers/Nightlight.qml | 2 +- Modules/Settings/Pages/WallpaperPage.qml | 2 +- Plugins/ZShell/Services/nightlightmanager.cpp | 25 ++++++++++--------- Plugins/ZShell/Services/nightlightmanager.hpp | 6 ++--- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/Helpers/Nightlight.qml b/Helpers/Nightlight.qml index 29857f3..e64958d 100644 --- a/Helpers/Nightlight.qml +++ b/Helpers/Nightlight.qml @@ -23,7 +23,7 @@ Singleton { function toggleNightLight(): void { service.manualToggle = true; - service.toggle(); + service.toggle(true); } NightlightManager { diff --git a/Modules/Settings/Pages/WallpaperPage.qml b/Modules/Settings/Pages/WallpaperPage.qml index 570019f..f3fcb6e 100644 --- a/Modules/Settings/Pages/WallpaperPage.qml +++ b/Modules/Settings/Pages/WallpaperPage.qml @@ -199,7 +199,7 @@ PageBase { stepSize: 1 subtext: qsTr("How long it takes for the gradual nightlight to finish (s)") text: qsTr("Fade duration") - to: 60 * 5 + to: 60 * 20 value: Config.display.nightlight.fadeDuration / 1000 onMoved: v => Config.display.nightlight.fadeDuration = v * 1000 diff --git a/Plugins/ZShell/Services/nightlightmanager.cpp b/Plugins/ZShell/Services/nightlightmanager.cpp index ea50b1d..a155c84 100644 --- a/Plugins/ZShell/Services/nightlightmanager.cpp +++ b/Plugins/ZShell/Services/nightlightmanager.cpp @@ -129,15 +129,15 @@ void NightlightManager::setFadeDuration(double duration) { emit fadeDurationChanged(); } -void NightlightManager::toggle() { +void NightlightManager::toggle(bool fast) { if (m_enabled) { - end(); + end(fast ? 2 : m_fadeDuration); } else { - start(); + start(fast ? 2 : m_fadeDuration); } } -void NightlightManager::start() { +void NightlightManager::start(double fade) { if (m_enabled && m_initialized) return; m_initialized = true; @@ -149,9 +149,7 @@ void NightlightManager::start() { m_process.setProgram("hyprctl"); m_process.setArguments( {"dispatch", - QString("hl.plugin.zshell.nlSet(%1, %2)") - .arg(m_temp) - .arg(m_fadeDuration)}); + QString("hl.plugin.zshell.nlSet(%1, %2)").arg(m_temp).arg(fade)}); m_process.startDetached(); } else { m_process.setProgram("hyprctl"); @@ -161,7 +159,7 @@ void NightlightManager::start() { } } -void NightlightManager::end() { +void NightlightManager::end(double fade) { if (!m_enabled && m_initialized) return; m_initialized = true; @@ -172,8 +170,7 @@ void NightlightManager::end() { if (m_useNativeNightlight) { m_process.setProgram("hyprctl"); m_process.setArguments( - {"dispatch", - QString("hl.plugin.zshell.nlDisable(%1)").arg(m_fadeDuration)}); + {"dispatch", QString("hl.plugin.zshell.nlDisable(%1)").arg(fade)}); m_process.startDetached(); } else { m_process.setProgram("hyprctl"); @@ -195,10 +192,14 @@ void NightlightManager::apply() { isDarkTime = (currentMin >= m_startTime || currentMin < m_endTime); } + const auto activationTime = isDarkTime ? m_startTime : m_endTime; + const auto elapsed = (currentMin - activationTime + 1440) % 1440; + const bool pastActivation = elapsed > 20; + if (isDarkTime) { - start(); + start(pastActivation ? 2 : m_fadeDuration); } else { - end(); + end(pastActivation ? 2 : m_fadeDuration); } } diff --git a/Plugins/ZShell/Services/nightlightmanager.hpp b/Plugins/ZShell/Services/nightlightmanager.hpp index 43b341d..c12f3ca 100644 --- a/Plugins/ZShell/Services/nightlightmanager.hpp +++ b/Plugins/ZShell/Services/nightlightmanager.hpp @@ -54,7 +54,7 @@ class NightlightManager : public QObject { [[nodiscard]] int lastTemp() const; [[nodiscard]] int currentTemp() const; - Q_INVOKABLE void toggle(); + Q_INVOKABLE void toggle(bool fast); Q_INVOKABLE void apply(); void setStartTime(const int& time); @@ -105,8 +105,8 @@ class NightlightManager : public QObject { QByteArray m_socketBuffer; QTimer m_reconnectTimer; - void start(); - void end(); + void start(double fade); + void end(double fade); [[nodiscard]] QString hyprlandDir() const; [[nodiscard]] QString eventSocketPath() const; [[nodiscard]] QString resolvePluginPath() const;