From cb6fe05cd69e99ca0c4b40a05afb24981a288ebf Mon Sep 17 00:00:00 2001 From: Stephan Dilly Date: Tue, 23 Jun 2020 00:18:59 +0200 Subject: [PATCH] indicate whether input polling state in process of changing --- src/input.rs | 20 +++++++++++++++----- src/main.rs | 5 ++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/input.rs b/src/input.rs index 79e65673..5556bf46 100644 --- a/src/input.rs +++ b/src/input.rs @@ -28,6 +28,7 @@ pub enum InputEvent { /// pub struct Input { desired_state: Arc, + current_state: Arc, receiver: Receiver, } @@ -37,21 +38,22 @@ impl Input { let (tx, rx) = unbounded(); let desired_state = Arc::new(AtomicBool::new(true)); + let current_state = Arc::new(AtomicBool::new(true)); let arc_desired = Arc::clone(&desired_state); + let arc_current = Arc::clone(&desired_state); thread::spawn(move || { - let mut current_state = true; loop { //TODO: use condvar to not busy wait if arc_desired.load(Ordering::Relaxed) { - if !current_state { + if !arc_current.load(Ordering::Relaxed) { tx.send(InputEvent::State( InputState::Polling, )) .expect("send failed"); } - current_state = true; + arc_current.store(true, Ordering::Relaxed); if let Some(e) = Self::poll(POLL_DURATION) .expect("failed to pull events.") @@ -60,13 +62,14 @@ impl Input { .expect("send input event failed"); } } else { - if current_state { + if arc_current.load(Ordering::Relaxed) { tx.send(InputEvent::State( InputState::Paused, )) .expect("send failed"); } - current_state = false; + + arc_current.store(false, Ordering::Relaxed); } } }); @@ -74,6 +77,7 @@ impl Input { Self { receiver: rx, desired_state, + current_state, } } @@ -87,6 +91,12 @@ impl Input { self.desired_state.store(enabled, Ordering::Relaxed); } + /// + pub fn is_state_changing(&self) -> bool { + self.desired_state.load(Ordering::Relaxed) + != self.current_state.load(Ordering::Relaxed) + } + fn poll(dur: Duration) -> anyhow::Result> { if event::poll(dur)? { Ok(Some(event::read()?)) diff --git a/src/main.rs b/src/main.rs index 6a9094fc..4ff6e18f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -134,7 +134,10 @@ fn main() -> Result<()> { draw(&mut terminal, &mut app)?; } - spinner.draw(&mut terminal, app.any_work_pending())?; + spinner.draw( + &mut terminal, + app.any_work_pending() || input.is_state_changing(), + )?; if app.is_quit() { break;