Skip to content

Commit 1441009

Browse files
committed
Fix non-idle timing
1 parent d1926eb commit 1441009

File tree

1 file changed

+14
-11
lines changed

1 file changed

+14
-11
lines changed

watchers/src/watchers/idle.rs

+14-11
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use crate::report_client::ReportClient;
22
use chrono::{DateTime, Duration, Utc};
3-
use std::sync::Arc;
3+
use std::{cmp::max, sync::Arc};
44

55
pub struct State {
66
last_input_time: DateTime<Utc>,
7+
changed_time: DateTime<Utc>,
78
is_idle: bool,
89
is_changed: bool,
910
idle_timeout: Duration,
@@ -13,22 +14,26 @@ impl State {
1314
pub fn new(idle_timeout: Duration) -> Self {
1415
Self {
1516
last_input_time: Utc::now(),
17+
changed_time: Utc::now(),
1618
is_idle: false,
1719
is_changed: false,
1820
idle_timeout,
1921
}
2022
}
2123

22-
pub fn mark_not_idle(&mut self) {
23-
self.is_idle = false;
24+
fn set_idle(&mut self, is_idle: bool, now: DateTime<Utc>) {
25+
self.is_idle = is_idle;
2426
self.is_changed = true;
27+
self.changed_time = now;
28+
}
29+
30+
pub fn mark_not_idle(&mut self) {
2531
self.last_input_time = Utc::now();
32+
self.set_idle(false, self.last_input_time);
2633
}
2734

2835
pub fn mark_idle(&mut self) {
29-
self.is_idle = true;
30-
self.is_changed = true;
31-
self.last_input_time -= self.idle_timeout;
36+
self.set_idle(true, Utc::now());
3237
}
3338

3439
// The logic is rewritten from the original Python code:
@@ -47,14 +52,12 @@ impl State {
4752
&& u64::from(seconds_since_input) < self.idle_timeout.num_seconds().try_into().unwrap()
4853
{
4954
debug!("No longer idle");
50-
self.is_idle = false;
51-
self.is_changed = true;
55+
self.set_idle(false, now);
5256
} else if !self.is_idle
5357
&& u64::from(seconds_since_input) >= self.idle_timeout.num_seconds().try_into().unwrap()
5458
{
5559
debug!("Idle again");
56-
self.is_idle = true;
57-
self.is_changed = true;
60+
self.set_idle(true, now);
5861
}
5962

6063
self.send_ping(now, client).await
@@ -63,7 +66,7 @@ impl State {
6366
pub async fn send_reactive(&mut self, client: &Arc<ReportClient>) -> anyhow::Result<()> {
6467
let now = Utc::now();
6568
if !self.is_idle {
66-
self.last_input_time = now;
69+
self.last_input_time = max(now - self.idle_timeout, self.changed_time);
6770
}
6871

6972
self.send_ping(now, client).await

0 commit comments

Comments
 (0)