diff --git a/kded/daemon.h b/kded/daemon.h --- a/kded/daemon.h +++ b/kded/daemon.h @@ -27,6 +27,7 @@ #include "generator.h" +class QElapsedTimer; class QTimer; namespace KScreen @@ -79,6 +80,7 @@ QTimer* m_buttonTimer; QTimer* m_saveTimer; QTimer* m_lidClosedTimer; + QElapsedTimer* m_changeBlockTimer; }; #endif /*KSCREN_DAEMON_H*/ diff --git a/kded/daemon.cpp b/kded/daemon.cpp --- a/kded/daemon.cpp +++ b/kded/daemon.cpp @@ -23,6 +23,7 @@ #include "kscreenadaptor.h" #include "debug.h" +#include #include #include #include @@ -52,6 +53,7 @@ , m_buttonTimer(new QTimer()) , m_saveTimer(new QTimer()) , m_lidClosedTimer(new QTimer()) + , m_changeBlockTimer(new QElapsedTimer()) { QMetaObject::invokeMethod(this, "requestConfig", Qt::QueuedConnection); @@ -82,6 +84,7 @@ delete m_saveTimer; delete m_buttonTimer; delete m_lidClosedTimer; + delete m_changeBlockTimer; Generator::destroy(); Device::destroy(); @@ -113,7 +116,6 @@ m_lidClosedTimer->setSingleShot(true); connect(m_lidClosedTimer, &QTimer::timeout, this, &KScreenDaemon::lidClosedTimeout); - connect(Device::self(), &Device::lidClosedChanged, this, &KScreenDaemon::lidClosedChanged); connect(Device::self(), &Device::resumingFromSuspend, [&]() { @@ -145,6 +147,9 @@ connect(new KScreen::SetConfigOperation(config), &KScreen::SetConfigOperation::finished, [&]() { qCDebug(KSCREEN_KDED) << "Config applied"; + // We enable monitoring already, but we will ignore the first signals that come + // in the next 100ms, since these are likely our own changes still flushing out + m_changeBlockTimer->start(); setMonitorForChanges(true); }); } @@ -182,6 +187,12 @@ void KScreenDaemon::configChanged() { + if (m_changeBlockTimer->isValid() && !m_changeBlockTimer->hasExpired(100)) { + m_changeBlockTimer->start(); + qCDebug(KSCREEN_KDED) << "Change detected, but ignoring since it's our own noise"; + return; + } + m_changeBlockTimer->invalidate(); qCDebug(KSCREEN_KDED) << "Change detected"; // Reset timer, delay the writeback m_saveTimer->start();