redbear-power: persist refresh interval in session

Add refresh_ms to SessionState (0 = not set, use config/default). Load it into App::poll_ms, give it priority over config when initializing the event-loop poll interval, and save it back in save_session(). Update all SessionState test initializers and assertions. Build, 224 tests, clippy, and fmt clean.
This commit is contained in:
Sisyphus Agent
2026-07-07 15:21:25 +03:00
parent 13799b8af9
commit 022d4ce28b
3 changed files with 18 additions and 6 deletions
@@ -462,7 +462,7 @@ impl App {
None
}
}),
poll_ms: crate::app::POLL_MS,
poll_ms: 0,
theme_idx: 0,
process_tree: false,
show_full_cmdline: false,
@@ -524,11 +524,11 @@ impl App {
app.process_sort = session.process_sort;
app.sort_ascending = session.sort_ascending;
app.process_tree = session.process_tree;
app.show_full_cmdline = session.show_full_cmdline;
app.process_narrow = session.process_narrow;
app.folded = session.folded.into_iter().collect();
app.process_filter = session.process_filter;
app.show_full_cmdline = session.show_full_cmdline;
app.process_narrow = session.process_narrow;
app.poll_ms = session.refresh_ms;
app
}
@@ -551,6 +551,7 @@ impl App {
process_filter: self.process_filter.clone(),
show_full_cmdline: self.show_full_cmdline,
process_narrow: self.process_narrow,
refresh_ms: self.poll_ms,
};
session.save();
}
@@ -1880,6 +1881,7 @@ mod tests {
process_filter: app.process_filter.clone(),
show_full_cmdline: app.show_full_cmdline,
process_narrow: app.process_narrow,
refresh_ms: app.poll_ms,
};
let serialized = toml::to_string(&session).unwrap();
let parsed: crate::session::SessionState = toml::from_str(&serialized).unwrap();
@@ -1891,6 +1893,7 @@ mod tests {
assert_eq!(parsed.folded.len(), 2);
assert!(parsed.folded.contains(&100));
assert!(parsed.folded.contains(&101));
assert_eq!(parsed.refresh_ms, app.poll_ms);
}
#[test]
@@ -325,8 +325,10 @@ fn main() -> io::Result<()> {
let async_stdin = termion::async_stdin();
let mut events = async_stdin.events();
let mut last_refresh = Instant::now();
// Honor config.refresh_ms when set, otherwise default to POLL_MS.
let mut poll = Duration::from_millis(if cfg.display.refresh_ms >= 50 {
// Honor the persisted session refresh interval first, then config, then default.
let mut poll = Duration::from_millis(if app.poll_ms >= 50 {
app.poll_ms
} else if cfg.display.refresh_ms >= 50 {
cfg.display.refresh_ms
} else {
POLL_MS
@@ -48,6 +48,9 @@ pub struct SessionState {
/// Narrow process view (hide IO columns for small terminals).
#[serde(default)]
pub process_narrow: bool,
/// Last refresh interval in milliseconds (0 = not set, use config/default).
#[serde(default)]
pub refresh_ms: u64,
}
impl Default for SessionState {
@@ -61,6 +64,7 @@ impl Default for SessionState {
process_filter: String::new(),
show_full_cmdline: false,
process_narrow: false,
refresh_ms: 0,
}
}
}
@@ -156,6 +160,7 @@ mod tests {
assert!(s.process_filter.is_empty());
assert!(!s.show_full_cmdline);
assert!(!s.process_narrow);
assert_eq!(s.refresh_ms, 0);
}
#[test]
@@ -172,6 +177,7 @@ mod tests {
process_filter: "kworker".to_string(),
show_full_cmdline: true,
process_narrow: true,
refresh_ms: 1_500,
};
let serialized = toml::to_string(&s).unwrap();
let parsed: SessionState = toml::from_str(&serialized).unwrap();
@@ -231,7 +237,8 @@ mod tests {
folded: vec![42],
process_filter: "bash".to_string(),
show_full_cmdline: false,
process_narrow: true,
process_narrow: false,
refresh_ms: 2_000,
};
let serialized = toml::to_string(&s).unwrap();
// Mimic the temp+rename flow with a different name