@@ -28,8 +28,10 @@ CHyprlock::CHyprlock(const std::string& wlDisplay) {
28
28
if (!m_pXKBContext)
29
29
Debug::log (ERR, " Failed to create xkb context" );
30
30
31
- const auto GRACE = (Hyprlang::INT* const *)g_pConfigManager->getValuePtr (" general:grace" );
32
- m_tGraceEnds = **GRACE ? std::chrono::system_clock::now () + std::chrono::seconds (**GRACE) : std::chrono::system_clock::from_time_t (0 );
31
+ const auto GRACE = (Hyprlang::INT* const *)g_pConfigManager->getValuePtr (" general:grace" );
32
+ m_tGraceEnds = **GRACE ? std::chrono::system_clock::now () + std::chrono::seconds (**GRACE) : std::chrono::system_clock::from_time_t (0 );
33
+ const auto FADETIMEOUT = (Hyprlang::INT* const *)g_pConfigManager->getValuePtr (" general:input_empty_fade_timeout" );
34
+ m_iEmptyPasswordTimeoutMs = **FADETIMEOUT;
33
35
}
34
36
35
37
// wl_seat
@@ -643,6 +645,14 @@ static const ext_session_lock_v1_listener sessionLockListener = {
643
645
644
646
// end session_lock
645
647
648
+ static void passwordEmptyTimerCallback (std::shared_ptr<CTimer> self, void * data) {
649
+ g_pRenderer->onEmptyPasswordFade ();
650
+
651
+ for (auto & o : g_pHyprlock->m_vOutputs ) {
652
+ o->sessionLockSurface ->render ();
653
+ }
654
+ }
655
+
646
656
void CHyprlock::onPasswordCheckTimer () {
647
657
// check result
648
658
if (m_sPasswordState.result ->success ) {
@@ -658,6 +668,12 @@ void CHyprlock::onPasswordCheckTimer() {
658
668
}
659
669
660
670
m_sPasswordState.result .reset ();
671
+
672
+ if (m_sPasswordState.emptyBufferTimer .get ()) {
673
+ m_sPasswordState.emptyBufferTimer ->cancel ();
674
+ m_sPasswordState.emptyBufferTimer .reset ();
675
+ }
676
+ m_sPasswordState.emptyBufferTimer = addTimer (std::chrono::milliseconds (m_iEmptyPasswordTimeoutMs), passwordEmptyTimerCallback, nullptr );
661
677
}
662
678
663
679
bool CHyprlock::passwordCheckWaiting () {
@@ -717,6 +733,13 @@ void CHyprlock::onKey(uint32_t key, bool down) {
717
733
m_sPasswordState.passBuffer += std::string{buf, len - 1 };
718
734
}
719
735
736
+ if (m_sPasswordState.passBuffer .empty () && !m_sPasswordState.emptyBufferTimer .get ())
737
+ m_sPasswordState.emptyBufferTimer = addTimer (std::chrono::milliseconds (m_iEmptyPasswordTimeoutMs), passwordEmptyTimerCallback, nullptr );
738
+ else if (!m_sPasswordState.passBuffer .empty () && m_sPasswordState.emptyBufferTimer .get ()) {
739
+ m_sPasswordState.emptyBufferTimer ->cancel ();
740
+ m_sPasswordState.emptyBufferTimer .reset ();
741
+ }
742
+
720
743
for (auto & o : m_vOutputs) {
721
744
o->sessionLockSurface ->render ();
722
745
}
@@ -870,4 +893,4 @@ std::string CHyprlock::spawnSync(const std::string& cmd) {
870
893
871
894
zwlr_screencopy_manager_v1* CHyprlock::getScreencopy () {
872
895
return m_sWaylandState.screencopy ;
873
- }
896
+ }
0 commit comments