minicrossterm/examples/program_examples/command_bar.rs

100 lines
2.5 KiB
Rust
Raw Normal View History

2018-08-22 02:05:53 +10:00
extern crate crossterm;
use crossterm::cursor::{cursor, TerminalCursor};
2018-08-24 06:16:31 +10:00
use crossterm::input::input;
use crossterm::terminal::{from_screen, ClearType, Terminal};
use crossterm::{Crossterm, Screen};
2018-08-22 02:05:53 +10:00
use std::io::Read;
use std::sync::{Arc, Mutex};
use std::{thread, time};
2018-08-22 02:05:53 +10:00
fn main() {
use crossterm::color;
let screen = Screen::new(true);
let crossterm = Crossterm::from_screen(&screen);
2018-08-22 02:05:53 +10:00
let cursor = crossterm.cursor();
2018-08-22 02:05:53 +10:00
cursor.hide();
let input_buf = Arc::new(Mutex::new(String::new()));
2018-08-22 02:05:53 +10:00
let threads = log(input_buf.clone(), &screen);
2018-08-22 02:05:53 +10:00
2018-08-24 06:16:31 +10:00
let mut count = 0;
2018-08-24 02:15:18 +10:00
thread::spawn(move || {
let input = input();
2018-08-24 02:15:18 +10:00
let mut stdin = input.read_async().bytes();
2018-08-22 02:05:53 +10:00
loop {
let a = stdin.next();
match a {
Some(Ok(13)) => {
input_buf.lock().unwrap().clear();
}
Some(Ok(val)) => {
input_buf.lock().unwrap().push(val as char);
}
_ => {}
2018-08-22 02:05:53 +10:00
}
thread::sleep(time::Duration::from_millis(100));
count += 1;
}
})
.join();
2018-08-22 02:05:53 +10:00
for thread in threads {
2018-08-22 02:05:53 +10:00
thread.join();
}
cursor.show();
}
fn log(input_buf: Arc<Mutex<String>>, screen: &Screen) -> Vec<thread::JoinHandle<()>> {
2018-08-22 02:05:53 +10:00
let mut threads = Vec::with_capacity(10);
let (_, term_height) = from_screen(screen).terminal_size();
2018-08-24 02:15:18 +10:00
for i in 0..1 {
2018-08-22 02:05:53 +10:00
let input_buffer = input_buf.clone();
let _clone_stdout = screen.stdout.clone();
2018-08-22 02:05:53 +10:00
2018-08-25 02:49:25 +10:00
let crossterm = Crossterm::from(screen.stdout.clone());
let join = thread::spawn(move || {
2018-08-22 02:05:53 +10:00
let cursor = crossterm.cursor();
let terminal = crossterm.terminal();
for j in 0..1000 {
swap_write(
format!("Some output: {} from thread: {}", j, i).as_ref(),
&input_buffer.lock().unwrap(),
&terminal,
&cursor,
term_height,
);
2018-08-22 02:05:53 +10:00
thread::sleep(time::Duration::from_millis(300));
}
});
threads.push(join);
}
return threads;
}
pub fn swap_write(
msg: &str,
input_buf: &String,
terminal: &Terminal,
cursor: &TerminalCursor,
term_height: u16,
) {
2018-08-22 02:05:53 +10:00
cursor.goto(0, term_height);
terminal.clear(ClearType::CurrentLine);
terminal.write(format!("{}\r\n", msg));
terminal.write(format!(">{}", input_buf));
}