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 {
|
pub struct Input {
|
||||||
desired_state: Arc<AtomicBool>,
|
desired_state: Arc<AtomicBool>,
|
||||||
|
current_state: Arc<AtomicBool>,
|
||||||
receiver: Receiver<InputEvent>,
|
receiver: Receiver<InputEvent>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -37,21 +38,22 @@ impl Input {
|
||||||
let (tx, rx) = unbounded();
|
let (tx, rx) = unbounded();
|
||||||
|
|
||||||
let desired_state = Arc::new(AtomicBool::new(true));
|
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_desired = Arc::clone(&desired_state);
|
||||||
|
let arc_current = Arc::clone(&desired_state);
|
||||||
|
|
||||||
thread::spawn(move || {
|
thread::spawn(move || {
|
||||||
let mut current_state = true;
|
|
||||||
loop {
|
loop {
|
||||||
//TODO: use condvar to not busy wait
|
//TODO: use condvar to not busy wait
|
||||||
if arc_desired.load(Ordering::Relaxed) {
|
if arc_desired.load(Ordering::Relaxed) {
|
||||||
if !current_state {
|
if !arc_current.load(Ordering::Relaxed) {
|
||||||
tx.send(InputEvent::State(
|
tx.send(InputEvent::State(
|
||||||
InputState::Polling,
|
InputState::Polling,
|
||||||
))
|
))
|
||||||
.expect("send failed");
|
.expect("send failed");
|
||||||
}
|
}
|
||||||
current_state = true;
|
arc_current.store(true, Ordering::Relaxed);
|
||||||
|
|
||||||
if let Some(e) = Self::poll(POLL_DURATION)
|
if let Some(e) = Self::poll(POLL_DURATION)
|
||||||
.expect("failed to pull events.")
|
.expect("failed to pull events.")
|
||||||
|
|
@ -60,13 +62,14 @@ impl Input {
|
||||||
.expect("send input event failed");
|
.expect("send input event failed");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if current_state {
|
if arc_current.load(Ordering::Relaxed) {
|
||||||
tx.send(InputEvent::State(
|
tx.send(InputEvent::State(
|
||||||
InputState::Paused,
|
InputState::Paused,
|
||||||
))
|
))
|
||||||
.expect("send failed");
|
.expect("send failed");
|
||||||
}
|
}
|
||||||
current_state = false;
|
|
||||||
|
arc_current.store(false, Ordering::Relaxed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
@ -74,6 +77,7 @@ impl Input {
|
||||||
Self {
|
Self {
|
||||||
receiver: rx,
|
receiver: rx,
|
||||||
desired_state,
|
desired_state,
|
||||||
|
current_state,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -87,6 +91,12 @@ impl Input {
|
||||||
self.desired_state.store(enabled, Ordering::Relaxed);
|
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>> {
|
fn poll(dur: Duration) -> anyhow::Result<Option<Event>> {
|
||||||
if event::poll(dur)? {
|
if event::poll(dur)? {
|
||||||
Ok(Some(event::read()?))
|
Ok(Some(event::read()?))
|
||||||
|
|
|
||||||
|
|
@ -134,7 +134,10 @@ fn main() -> Result<()> {
|
||||||
draw(&mut terminal, &mut app)?;
|
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() {
|
if app.is_quit() {
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue