Throttle sync processing if the window is unfocused for a while
2 files changed, 26 insertions, 3 deletions
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index b756f486..a75b7ef5 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -844,7 +844,10 @@ ChatPage::handleSyncResponse(const mtx::responses::Sync &res, const std::string
nhlog::db()->error("saving sync response: {}", e.what());
}
- emit trySyncCb();
+ if (shouldThrottleSync())
+ QTimer::singleShot(1000, this, &ChatPage::trySyncCb);
+ else
+ emit trySyncCb();
}
void
@@ -1161,6 +1164,20 @@ ChatPage::setStatus(const QString &status)
});
}
+bool
+ChatPage::shouldBeUnavailable() const
+{
+ return lastWindowActive.isValid() &&
+ lastWindowActive.addSecs(60 * 5) < QDateTime::currentDateTime();
+}
+
+bool
+ChatPage::shouldThrottleSync() const
+{
+ return lastWindowActive.isValid() &&
+ lastWindowActive.addSecs(6 * 5) < QDateTime::currentDateTime();
+}
+
mtx::presence::PresenceState
ChatPage::currentPresence() const
{
@@ -1172,8 +1189,7 @@ ChatPage::currentPresence() const
case UserSettings::Presence::Offline:
return mtx::presence::offline;
case UserSettings::Presence::AutomaticPresence:
- if (lastWindowActive.isValid() &&
- lastWindowActive.addSecs(60 * 5) < QDateTime::currentDateTime())
+ if (shouldBeUnavailable())
return mtx::presence::unavailable;
else
return mtx::presence::online;
diff --git a/src/ChatPage.h b/src/ChatPage.h
index 13621b23..910ccd1e 100644
--- a/src/ChatPage.h
+++ b/src/ChatPage.h
@@ -203,6 +203,13 @@ private:
void loadStateFromCache();
void resetUI();
+ // returns if the user had no interaction with Nheko for quite a while, which means we set our
+ // presence to unavailable if automatic presence is enabled
+ bool shouldBeUnavailable() const;
+ // If we should throttle sync processing to reduce CPU load, if people are spamming messages and
+ // we aren't looking
+ bool shouldThrottleSync() const;
+
template<class Collection>
Memberships getMemberships(const std::vector<Collection> &events) const;
|