diff --git a/local/recipes/system/redbear-power/source/src/app.rs b/local/recipes/system/redbear-power/source/src/app.rs index 4515fd749d..e8bd3afbd6 100644 --- a/local/recipes/system/redbear-power/source/src/app.rs +++ b/local/recipes/system/redbear-power/source/src/app.rs @@ -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] diff --git a/local/recipes/system/redbear-power/source/src/main.rs b/local/recipes/system/redbear-power/source/src/main.rs index 6723602578..4bc6e5308c 100644 --- a/local/recipes/system/redbear-power/source/src/main.rs +++ b/local/recipes/system/redbear-power/source/src/main.rs @@ -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 diff --git a/local/recipes/system/redbear-power/source/src/session.rs b/local/recipes/system/redbear-power/source/src/session.rs index 5f941eda47..7b2049424f 100644 --- a/local/recipes/system/redbear-power/source/src/session.rs +++ b/local/recipes/system/redbear-power/source/src/session.rs @@ -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