diff --git a/src/term.rs b/src/term.rs index 57caf15..cd31156 100644 --- a/src/term.rs +++ b/src/term.rs @@ -32,23 +32,25 @@ use ::{ ($state:expr) => { pub fn main () -> Usually<()> { tui_run_main($state) } } } -pub fn tui_run_main (state: T) -> Usually<()> where +pub fn tui_run_main (state: Arc>) -> Usually<()> where T: View + Apply> + Send + Sync + 'static { - tui_setup_panic(); Exit::run(|exit|{ - let state = Arc::new(RwLock::new(state)); 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())?; output.join(); - stdout().execute(LeaveAlternateScreen)?; - CrosstermBackend::new(stdout()).show_cursor()?; - disable_raw_mode()?; - Ok(()) + tui_teardown(&mut stdout()) }) } +pub fn tui_teardown (backend: &mut W) -> Usually<()> { + use ::ratatui::backend::Backend; + stdout().execute(LeaveAlternateScreen)?; + CrosstermBackend::new(backend).show_cursor()?; + disable_raw_mode().map_err(Into::into) +} + pub fn tui_setup_panic () { use ::std::panic::{set_hook, PanicHookInfo}; use ::better_panic::{Settings, Verbosity}; @@ -56,9 +58,7 @@ pub fn tui_setup_panic () { .verbosity(Verbosity::Full) .create_panic_handler(); set_hook(Box::new(move |info: &PanicHookInfo|{ - stdout().execute(LeaveAlternateScreen).unwrap(); - CrosstermBackend::new(stdout()).show_cursor().unwrap(); - disable_raw_mode().unwrap(); + let _ = tui_teardown(&mut stdout()); panic(info); })); } @@ -493,13 +493,6 @@ fn y_scroll () -> impl Draw { }) } -pub fn tui_teardown (backend: &mut CrosstermBackend) -> Usually<()> { - use ::ratatui::backend::Backend; - stdout().execute(LeaveAlternateScreen)?; - backend.show_cursor()?; - disable_raw_mode().map_err(Into::into) -} - pub fn tui_update ( Tui(buf, ..): &mut Tui, area: XYWH,