diff options
Diffstat (limited to 'src/protocols/IdleNotify.cpp')
| -rw-r--r-- | src/protocols/IdleNotify.cpp | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/src/protocols/IdleNotify.cpp b/src/protocols/IdleNotify.cpp index 0ebe24e3..4122bf24 100644 --- a/src/protocols/IdleNotify.cpp +++ b/src/protocols/IdleNotify.cpp @@ -21,7 +21,7 @@ CExtIdleNotification::CExtIdleNotification(SP<CExtIdleNotificationV1> resource_, m_timer = makeShared<CEventLoopTimer>(std::nullopt, onTimer, this); g_pEventLoopManager->addTimer(m_timer); - updateTimer(); + update(); LOGM(LOG, "Registered idle-notification for {}ms", timeoutMs_); } @@ -35,24 +35,39 @@ bool CExtIdleNotification::good() { return m_resource->resource(); } -void CExtIdleNotification::updateTimer() { - if (PROTO::idle->isInhibited && m_obeyInhibitors) - m_timer->updateTimeout(std::nullopt); - else - m_timer->updateTimeout(std::chrono::milliseconds(m_timeoutMs)); +void CExtIdleNotification::update(uint32_t elapsedMs) { + m_timer->updateTimeout(std::nullopt); + + if (elapsedMs == 0 && PROTO::idle->isInhibited && m_obeyInhibitors) { + reset(); + return; + } + + if (m_timeoutMs > elapsedMs) { + reset(); + m_timer->updateTimeout(std::chrono::milliseconds(m_timeoutMs - elapsedMs)); + } else + onTimerFired(); +} + +void CExtIdleNotification::update() { + update(0); } void CExtIdleNotification::onTimerFired() { + if (m_idled) + return; + m_resource->sendIdled(); m_idled = true; } -void CExtIdleNotification::onActivity() { - if (m_idled) - m_resource->sendResumed(); +void CExtIdleNotification::reset() { + if (!m_idled) + return; + m_resource->sendResumed(); m_idled = false; - updateTimer(); } bool CExtIdleNotification::inhibitorsAreObeyed() const { @@ -96,7 +111,7 @@ void CIdleNotifyProtocol::onGetNotification(CExtIdleNotifierV1* pMgr, uint32_t i void CIdleNotifyProtocol::onActivity() { for (auto const& n : m_notifications) { - n->onActivity(); + n->update(); } } @@ -104,6 +119,12 @@ void CIdleNotifyProtocol::setInhibit(bool inhibited) { isInhibited = inhibited; for (auto const& n : m_notifications) { if (n->inhibitorsAreObeyed()) - n->onActivity(); + n->update(); + } +} + +void CIdleNotifyProtocol::setTimers(uint32_t elapsedMs) { + for (auto const& n : m_notifications) { + n->update(elapsedMs); } } |
