mirror of
https://github.com/gitui-org/gitui
synced 2026-05-24 09:28:21 +00:00
indicate whether input polling state in process of changing
This commit is contained in:
parent
b01f716677
commit
cb6fe05cd6
2 changed files with 19 additions and 6 deletions
20
src/input.rs
20
src/input.rs
|
|
@ -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()?))
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue