mirror of
https://github.com/hyprwm/hyprlock.git
synced 2024-11-16 23:05:58 +01:00
renderer: add fade out animation and property to disable (#188)
* renderer, Nix/HM module: add fade out animation and prop * fix: fade duration and disable on non hyprland session * fix: revert needsFrame condition, update duration to 500ms * fix: make shadows obey widget opacity
This commit is contained in:
parent
ae889b47a0
commit
1c92c6109c
6 changed files with 31 additions and 7 deletions
|
@ -85,6 +85,11 @@ in {
|
||||||
type = bool;
|
type = bool;
|
||||||
default = false;
|
default = false;
|
||||||
};
|
};
|
||||||
|
no_fade_out = mkOption {
|
||||||
|
description = "Do not fade out";
|
||||||
|
type = bool;
|
||||||
|
default = false;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
backgrounds = mkOption {
|
backgrounds = mkOption {
|
||||||
|
@ -417,6 +422,7 @@ in {
|
||||||
grace = ${toString cfg.general.grace}
|
grace = ${toString cfg.general.grace}
|
||||||
hide_cursor = ${boolToString cfg.general.hide_cursor}
|
hide_cursor = ${boolToString cfg.general.hide_cursor}
|
||||||
no_fade_in = ${boolToString cfg.general.no_fade_in}
|
no_fade_in = ${boolToString cfg.general.no_fade_in}
|
||||||
|
no_fade_out = ${boolToString cfg.general.no_fade_out}
|
||||||
}
|
}
|
||||||
|
|
||||||
${builtins.concatStringsSep "\n" (map (background: ''
|
${builtins.concatStringsSep "\n" (map (background: ''
|
||||||
|
|
|
@ -46,6 +46,8 @@ void CConfigManager::init() {
|
||||||
m_config.addConfigValue("general:hide_cursor", Hyprlang::INT{0});
|
m_config.addConfigValue("general:hide_cursor", Hyprlang::INT{0});
|
||||||
m_config.addConfigValue("general:grace", Hyprlang::INT{0});
|
m_config.addConfigValue("general:grace", Hyprlang::INT{0});
|
||||||
m_config.addConfigValue("general:no_fade_in", Hyprlang::INT{0});
|
m_config.addConfigValue("general:no_fade_in", Hyprlang::INT{0});
|
||||||
|
m_config.addConfigValue("general:no_fade_out", Hyprlang::INT{0});
|
||||||
|
|
||||||
|
|
||||||
m_config.addSpecialCategory("background", Hyprlang::SSpecialCategoryOptions{.key = nullptr, .anonymousKeyBased = true});
|
m_config.addSpecialCategory("background", Hyprlang::SSpecialCategoryOptions{.key = nullptr, .anonymousKeyBased = true});
|
||||||
m_config.addSpecialConfigValue("background", "monitor", Hyprlang::STRING{""});
|
m_config.addSpecialConfigValue("background", "monitor", Hyprlang::STRING{""});
|
||||||
|
|
|
@ -456,9 +456,10 @@ void CHyprlock::run() {
|
||||||
if (m_sLoopState.event == false)
|
if (m_sLoopState.event == false)
|
||||||
m_sLoopState.loopCV.wait_for(lk, std::chrono::milliseconds(5000), [this] { return m_sLoopState.event; });
|
m_sLoopState.loopCV.wait_for(lk, std::chrono::milliseconds(5000), [this] { return m_sLoopState.event; });
|
||||||
|
|
||||||
if (m_bTerminate)
|
if (m_bTerminate || (std::chrono::system_clock::now() > m_tFadeEnds && m_bFadeStarted)) {
|
||||||
|
unlockSession();
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
std::lock_guard<std::mutex> lg(m_sLoopState.eventLoopMutex);
|
std::lock_guard<std::mutex> lg(m_sLoopState.eventLoopMutex);
|
||||||
|
|
||||||
m_sLoopState.event = false;
|
m_sLoopState.event = false;
|
||||||
|
@ -504,9 +505,11 @@ void CHyprlock::run() {
|
||||||
|
|
||||||
passed.clear();
|
passed.clear();
|
||||||
|
|
||||||
if (m_bTerminate)
|
if (m_bTerminate || (std::chrono::system_clock::now() > m_tFadeEnds && m_bFadeStarted)) {
|
||||||
|
unlockSession();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
m_sLoopState.timerEvent = true;
|
m_sLoopState.timerEvent = true;
|
||||||
m_sLoopState.timerCV.notify_all();
|
m_sLoopState.timerCV.notify_all();
|
||||||
|
@ -702,9 +705,16 @@ static const ext_session_lock_v1_listener sessionLockListener = {
|
||||||
// end session_lock
|
// end session_lock
|
||||||
|
|
||||||
void CHyprlock::onPasswordCheckTimer() {
|
void CHyprlock::onPasswordCheckTimer() {
|
||||||
|
static auto* const PNOFADEOUT = (Hyprlang::INT* const*)g_pConfigManager->getValuePtr("general:no_fade_out");
|
||||||
|
const auto CURRENTDESKTOP = getenv("XDG_CURRENT_DESKTOP");
|
||||||
|
const auto SZCURRENTD = std::string{CURRENTDESKTOP ? CURRENTDESKTOP : ""};
|
||||||
|
|
||||||
// check result
|
// check result
|
||||||
if (m_sPasswordState.result->success) {
|
if (m_sPasswordState.result->success) {
|
||||||
|
if (**PNOFADEOUT || SZCURRENTD != "Hyprland")
|
||||||
unlockSession();
|
unlockSession();
|
||||||
|
m_tFadeEnds = std::chrono::system_clock::now() + std::chrono::milliseconds(500);
|
||||||
|
m_bFadeStarted = true;
|
||||||
} else {
|
} else {
|
||||||
Debug::log(LOG, "Authentication failed: {}", m_sPasswordState.result->failReason);
|
Debug::log(LOG, "Authentication failed: {}", m_sPasswordState.result->failReason);
|
||||||
m_sPasswordState.lastFailReason = m_sPasswordState.result->failReason;
|
m_sPasswordState.lastFailReason = m_sPasswordState.result->failReason;
|
||||||
|
@ -768,7 +778,6 @@ void CHyprlock::onKey(uint32_t key, bool down) {
|
||||||
m_sPasswordState.passBuffer = m_sPasswordState.passBuffer.substr(0, m_sPasswordState.passBuffer.length() - 1);
|
m_sPasswordState.passBuffer = m_sPasswordState.passBuffer.substr(0, m_sPasswordState.passBuffer.length() - 1);
|
||||||
} else if (SYM == XKB_KEY_Return || SYM == XKB_KEY_KP_Enter) {
|
} else if (SYM == XKB_KEY_Return || SYM == XKB_KEY_KP_Enter) {
|
||||||
Debug::log(LOG, "Authenticating");
|
Debug::log(LOG, "Authenticating");
|
||||||
|
|
||||||
m_sPasswordState.result = g_pPassword->verify(m_sPasswordState.passBuffer);
|
m_sPasswordState.result = g_pPassword->verify(m_sPasswordState.passBuffer);
|
||||||
} else if (SYM == XKB_KEY_Escape) {
|
} else if (SYM == XKB_KEY_Escape) {
|
||||||
Debug::log(LOG, "Clearing password buffer");
|
Debug::log(LOG, "Clearing password buffer");
|
||||||
|
|
|
@ -81,9 +81,10 @@ class CHyprlock {
|
||||||
|
|
||||||
bool m_bCapsLock = false;
|
bool m_bCapsLock = false;
|
||||||
bool m_bNumLock = false;
|
bool m_bNumLock = false;
|
||||||
|
bool m_bFadeStarted = false;
|
||||||
//
|
//
|
||||||
std::chrono::system_clock::time_point m_tGraceEnds;
|
std::chrono::system_clock::time_point m_tGraceEnds;
|
||||||
|
std::chrono::system_clock::time_point m_tFadeEnds;
|
||||||
Vector2D m_vLastEnterCoords = {};
|
Vector2D m_vLastEnterCoords = {};
|
||||||
|
|
||||||
std::vector<std::unique_ptr<COutput>> m_vOutputs;
|
std::vector<std::unique_ptr<COutput>> m_vOutputs;
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "../config/ConfigManager.hpp"
|
#include "../config/ConfigManager.hpp"
|
||||||
#include "../helpers/Color.hpp"
|
#include "../helpers/Color.hpp"
|
||||||
#include "../core/Output.hpp"
|
#include "../core/Output.hpp"
|
||||||
|
#include "../core/hyprlock.hpp"
|
||||||
#include "mtx.hpp"
|
#include "mtx.hpp"
|
||||||
|
|
||||||
#include <GLES3/gl32.h>
|
#include <GLES3/gl32.h>
|
||||||
|
@ -161,6 +162,7 @@ static int frames = 0;
|
||||||
CRenderer::SRenderFeedback CRenderer::renderLock(const CSessionLockSurface& surf) {
|
CRenderer::SRenderFeedback CRenderer::renderLock(const CSessionLockSurface& surf) {
|
||||||
static auto* const PDISABLEBAR = (Hyprlang::INT* const*)g_pConfigManager->getValuePtr("general:disable_loading_bar");
|
static auto* const PDISABLEBAR = (Hyprlang::INT* const*)g_pConfigManager->getValuePtr("general:disable_loading_bar");
|
||||||
static auto* const PNOFADEIN = (Hyprlang::INT* const*)g_pConfigManager->getValuePtr("general:no_fade_in");
|
static auto* const PNOFADEIN = (Hyprlang::INT* const*)g_pConfigManager->getValuePtr("general:no_fade_in");
|
||||||
|
static auto* const PNOFADEOUT = (Hyprlang::INT* const*)g_pConfigManager->getValuePtr("general:no_fade_out");
|
||||||
|
|
||||||
matrixProjection(projection.data(), surf.size.x, surf.size.y, WL_OUTPUT_TRANSFORM_NORMAL);
|
matrixProjection(projection.data(), surf.size.x, surf.size.y, WL_OUTPUT_TRANSFORM_NORMAL);
|
||||||
|
|
||||||
|
@ -199,6 +201,10 @@ CRenderer::SRenderFeedback CRenderer::renderLock(const CSessionLockSurface& surf
|
||||||
if (**PNOFADEIN)
|
if (**PNOFADEIN)
|
||||||
bga = 1.0;
|
bga = 1.0;
|
||||||
|
|
||||||
|
if (g_pHyprlock->m_bFadeStarted && !**PNOFADEOUT) {
|
||||||
|
bga = std::clamp(std::chrono::duration_cast<std::chrono::microseconds>(g_pHyprlock->m_tFadeEnds - std::chrono::system_clock::now()).count() / 500000.0 - 0.02, 0.0, 1.0);
|
||||||
|
// - 0.02 so that the fade ends a little earlier than the final second
|
||||||
|
}
|
||||||
// render widgets
|
// render widgets
|
||||||
const auto WIDGETS = getOrCreateWidgetsFor(&surf);
|
const auto WIDGETS = getOrCreateWidgetsFor(&surf);
|
||||||
for (auto& w : *WIDGETS) {
|
for (auto& w : *WIDGETS) {
|
||||||
|
|
|
@ -37,6 +37,6 @@ bool CShadowable::draw(const IWidget::SRenderData& data) {
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
CBox box = {0, 0, viewport.x, viewport.y};
|
CBox box = {0, 0, viewport.x, viewport.y};
|
||||||
g_pRenderer->renderTexture(box, shadowFB.m_cTex, 1.0, 0, WL_OUTPUT_TRANSFORM_NORMAL);
|
g_pRenderer->renderTexture(box, shadowFB.m_cTex, data.opacity, 0, WL_OUTPUT_TRANSFORM_NORMAL);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
Loading…
Reference in a new issue