diff --git a/src/lib.rs b/src/lib.rs index 20cb81b..fd39be3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -252,10 +252,11 @@ macro_rules! eval_xy ( #[cfg(feature = "exit")] pub use self::exit::*; #[cfg(feature = "exit")] mod exit { use crate::*; - use std::sync::{Arc, atomic::AtomicBool}; + use std::sync::{Arc, atomic::{AtomicBool, Ordering::Relaxed}}; use crossterm::event::*; - #[derive(Clone)] pub struct Exit(Arc); + #[derive(Clone, Default, Debug)] + pub struct Exit(Arc); impl Exit { pub fn run (run: impl FnOnce(Self)->Usually) -> Usually { @@ -269,6 +270,9 @@ macro_rules! eval_xy ( state: KeyEventState::NONE })) } + pub fn exit (&self) { + self.0.store(true, Relaxed) + } } impl AsRef> for Exit { diff --git a/src/term.rs b/src/term.rs index 452c65f..298dacb 100644 --- a/src/term.rs +++ b/src/term.rs @@ -145,16 +145,14 @@ impl Tui { panic(info); })); } - pub fn run_main (state: Arc>) -> Usually<()> where + pub fn run_main (exit: Exit, state: Arc>) -> Usually<()> where T: View + Apply> + Send + Sync + 'static { - Exit::run(|exit|{ - let scan = Duration::from_millis(100); - let frame = Duration::from_millis(10); - let (_input, output) = Tui::io(exit.as_ref(), &state, scan, frame, std::io::stdout())?; - let _ = output.join(); - Tui::teardown(&mut stdout()) - }) + let scan = Duration::from_millis(100); + let frame = Duration::from_millis(10); + let (_input, output) = Tui::io(exit.as_ref(), &state, scan, frame, std::io::stdout())?; + let _ = output.join(); + Tui::teardown(&mut stdout()) } /// Spawn the TUI input and output threadsl. pub fn io <