term: add combined tui_io

This commit is contained in:
facile pop culture reference 2026-06-29 20:38:08 +03:00
parent 53c9438f7d
commit 4e6c62a7f1

View file

@ -39,9 +39,8 @@ pub fn tui_run_main <T> (state: T) -> Usually<()> where
Exit::run(|exit|{ Exit::run(|exit|{
let state = Arc::new(RwLock::new(state)); let state = Arc::new(RwLock::new(state));
let scan = Duration::from_millis(100); let scan = Duration::from_millis(100);
let input = tui_input(exit.as_ref(), &state, scan)?;
let frame = Duration::from_millis(10); let frame = Duration::from_millis(10);
let output = tui_output(exit.as_ref(), &state, frame, std::io::stdout())?; let (input, output) = tui_io(exit.as_ref(), &state, scan, frame, std::io::stdout())?;
output.join(); output.join();
stdout().execute(LeaveAlternateScreen)?; stdout().execute(LeaveAlternateScreen)?;
CrosstermBackend::new(stdout()).show_cursor()?; CrosstermBackend::new(stdout()).show_cursor()?;
@ -73,6 +72,22 @@ pub fn tui_setup_panic () {
}; };
} }
/// Spawn the TUI input and output threadsl.
pub fn tui_io <
T: View<Tui> + Apply<TuiEvent, Usually<()>> + Send + Sync + 'static,
W: Write + Send + Sync + 'static,
> (
exited: &Arc<AtomicBool>,
state: &Arc<RwLock<T>>,
poll: Duration,
sleep: Duration,
output: W,
) -> Result<(Task, Task), Box<dyn Error>> {
let keyboard = tui_input(exited, state, poll)?;
let terminal = tui_output(exited, state, sleep, output)?;
Ok((keyboard, terminal))
}
/// Spawn the TUI input thread which reads keys from the terminal. /// Spawn the TUI input thread which reads keys from the terminal.
pub fn tui_input <T: Apply<TuiEvent, Usually<()>> + Send + Sync + 'static> ( pub fn tui_input <T: Apply<TuiEvent, Usually<()>> + Send + Sync + 'static> (
exited: &Arc<AtomicBool>, state: &Arc<RwLock<T>>, poll: Duration exited: &Arc<AtomicBool>, state: &Arc<RwLock<T>>, poll: Duration