indicate whether input polling state in process of changing

This commit is contained in:
Stephan Dilly 2020-06-23 00:18:59 +02:00
parent b01f716677
commit cb6fe05cd6
2 changed files with 19 additions and 6 deletions

View file

@ -28,6 +28,7 @@ pub enum InputEvent {
///
pub struct Input {
desired_state: Arc<AtomicBool>,
current_state: Arc<AtomicBool>,
receiver: Receiver<InputEvent>,
}
@ -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<Option<Event>> {
if event::poll(dur)? {
Ok(Some(event::read()?))

View file

@ -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;