summaryrefslogtreecommitdiff
path: root/src/protocols
diff options
context:
space:
mode:
Diffstat (limited to 'src/protocols')
-rw-r--r--src/protocols/IdleNotify.cpp26
-rw-r--r--src/protocols/IdleNotify.hpp9
2 files changed, 24 insertions, 11 deletions
diff --git a/src/protocols/IdleNotify.cpp b/src/protocols/IdleNotify.cpp
index bc5aabb1..14a5f3e1 100644
--- a/src/protocols/IdleNotify.cpp
+++ b/src/protocols/IdleNotify.cpp
@@ -10,7 +10,8 @@ static int onTimer(SP<CEventLoopTimer> self, void* data) {
return 0;
}
-CExtIdleNotification::CExtIdleNotification(SP<CExtIdleNotificationV1> resource_, uint32_t timeoutMs_) : resource(resource_), timeoutMs(timeoutMs_) {
+CExtIdleNotification::CExtIdleNotification(SP<CExtIdleNotificationV1> resource_, uint32_t timeoutMs_, bool obeyInhibitors_) :
+ resource(resource_), timeoutMs(timeoutMs_), obeyInhibitors(obeyInhibitors_) {
if UNLIKELY (!resource_->resource())
return;
@@ -35,7 +36,7 @@ bool CExtIdleNotification::good() {
}
void CExtIdleNotification::updateTimer() {
- if (PROTO::idle->isInhibited)
+ if (PROTO::idle->isInhibited && obeyInhibitors)
timer->updateTimeout(std::nullopt);
else
timer->updateTimeout(std::chrono::milliseconds(timeoutMs));
@@ -54,6 +55,10 @@ void CExtIdleNotification::onActivity() {
updateTimer();
}
+bool CExtIdleNotification::inhibitorsAreObeyed() const {
+ return obeyInhibitors;
+}
+
CIdleNotifyProtocol::CIdleNotifyProtocol(const wl_interface* iface, const int& ver, const std::string& name) : IWaylandProtocol(iface, ver, name) {
;
}
@@ -63,7 +68,10 @@ void CIdleNotifyProtocol::bindManager(wl_client* client, void* data, uint32_t ve
RESOURCE->setOnDestroy([this](CExtIdleNotifierV1* p) { this->onManagerResourceDestroy(p->resource()); });
RESOURCE->setDestroy([this](CExtIdleNotifierV1* pMgr) { this->onManagerResourceDestroy(pMgr->resource()); });
- RESOURCE->setGetIdleNotification([this](CExtIdleNotifierV1* pMgr, uint32_t id, uint32_t timeout, wl_resource* seat) { this->onGetNotification(pMgr, id, timeout, seat); });
+ RESOURCE->setGetIdleNotification(
+ [this](CExtIdleNotifierV1* pMgr, uint32_t id, uint32_t timeout, wl_resource* seat) { this->onGetNotification(pMgr, id, timeout, seat, true); });
+ RESOURCE->setGetInputIdleNotification(
+ [this](CExtIdleNotifierV1* pMgr, uint32_t id, uint32_t timeout, wl_resource* seat) { this->onGetNotification(pMgr, id, timeout, seat, false); });
}
void CIdleNotifyProtocol::onManagerResourceDestroy(wl_resource* res) {
@@ -74,9 +82,10 @@ void CIdleNotifyProtocol::destroyNotification(CExtIdleNotification* notif) {
std::erase_if(m_vNotifications, [&](const auto& other) { return other.get() == notif; });
}
-void CIdleNotifyProtocol::onGetNotification(CExtIdleNotifierV1* pMgr, uint32_t id, uint32_t timeout, wl_resource* seat) {
- const auto CLIENT = pMgr->client();
- const auto RESOURCE = m_vNotifications.emplace_back(makeShared<CExtIdleNotification>(makeShared<CExtIdleNotificationV1>(CLIENT, pMgr->version(), id), timeout)).get();
+void CIdleNotifyProtocol::onGetNotification(CExtIdleNotifierV1* pMgr, uint32_t id, uint32_t timeout, wl_resource* seat, bool obeyInhibitors) {
+ const auto CLIENT = pMgr->client();
+ const auto RESOURCE =
+ m_vNotifications.emplace_back(makeShared<CExtIdleNotification>(makeShared<CExtIdleNotificationV1>(CLIENT, pMgr->version(), id), timeout, obeyInhibitors)).get();
if UNLIKELY (!RESOURCE->good()) {
pMgr->noMemory();
@@ -94,6 +103,7 @@ void CIdleNotifyProtocol::onActivity() {
void CIdleNotifyProtocol::setInhibit(bool inhibited) {
isInhibited = inhibited;
for (auto const& n : m_vNotifications) {
- n->onActivity();
+ if (n->inhibitorsAreObeyed())
+ n->onActivity();
}
-} \ No newline at end of file
+}
diff --git a/src/protocols/IdleNotify.hpp b/src/protocols/IdleNotify.hpp
index e3dcdc98..efc3accc 100644
--- a/src/protocols/IdleNotify.hpp
+++ b/src/protocols/IdleNotify.hpp
@@ -9,19 +9,22 @@ class CEventLoopTimer;
class CExtIdleNotification {
public:
- CExtIdleNotification(SP<CExtIdleNotificationV1> resource_, uint32_t timeoutMs);
+ CExtIdleNotification(SP<CExtIdleNotificationV1> resource_, uint32_t timeoutMs, bool obeyInhibitors);
~CExtIdleNotification();
bool good();
void onTimerFired();
void onActivity();
+ bool inhibitorsAreObeyed() const;
+
private:
SP<CExtIdleNotificationV1> resource;
uint32_t timeoutMs = 0;
SP<CEventLoopTimer> timer;
- bool idled = false;
+ bool idled = false;
+ bool obeyInhibitors = false;
void updateTimer();
};
@@ -38,7 +41,7 @@ class CIdleNotifyProtocol : public IWaylandProtocol {
private:
void onManagerResourceDestroy(wl_resource* res);
void destroyNotification(CExtIdleNotification* notif);
- void onGetNotification(CExtIdleNotifierV1* pMgr, uint32_t id, uint32_t timeout, wl_resource* seat);
+ void onGetNotification(CExtIdleNotifierV1* pMgr, uint32_t id, uint32_t timeout, wl_resource* seat, bool obeyInhibitors);
bool isInhibited = false;