1e332daaed
- Major refactor and cleanup. - Improved performance; - No locking when writing to stdout. - UNIX doesn't have any dynamic dispatch anymore. - Windows has improved the way to check if ANSI modes are enabled. - Removed lot's of complex API calls: `from_screen`, `from_output` - Removed `Arc<TerminalOutput>` from all internal Api's. - Removed termios dependency for UNIX systems. - Upgraded deps. - Removed about 1000 lines of code - `TerminalOutput` - `Screen` - unsafe code - Some duplicated code introduced by a previous refactor. - Raw modes UNIX systems improved - Added `NoItalic` attribute
92 lines
2.3 KiB
Rust
92 lines
2.3 KiB
Rust
extern crate crossterm;
|
|
|
|
use crossterm::{
|
|
input, cursor, terminal, ClearType, Crossterm, InputEvent, KeyEvent, AlternateScreen, RawScreen, Terminal, TerminalCursor
|
|
};
|
|
|
|
use std::sync::{Arc, Mutex};
|
|
use std::{thread, time};
|
|
|
|
fn main() {
|
|
let screen = RawScreen::into_raw_mode();
|
|
cursor().hide();
|
|
|
|
let input_buf = Arc::new(Mutex::new(String::new()));
|
|
|
|
let threads = log(input_buf.clone());
|
|
|
|
let mut count = 0;
|
|
|
|
thread::spawn(move || {
|
|
let input = input();
|
|
let mut stdin = input.read_async();
|
|
|
|
loop {
|
|
match stdin.next() {
|
|
Some(InputEvent::Keyboard(KeyEvent::Char('\n'))) => {
|
|
input_buf.lock().unwrap().clear();
|
|
}
|
|
Some(InputEvent::Keyboard(KeyEvent::Char(character))) => {
|
|
input_buf.lock().unwrap().push(character as char);
|
|
}
|
|
_ => {}
|
|
}
|
|
|
|
thread::sleep(time::Duration::from_millis(10));
|
|
count += 1;
|
|
}
|
|
})
|
|
.join();
|
|
|
|
for thread in threads {
|
|
thread.join();
|
|
}
|
|
|
|
cursor().show();
|
|
}
|
|
|
|
fn log(input_buf: Arc<Mutex<String>>) -> Vec<thread::JoinHandle<()>> {
|
|
let mut threads = Vec::with_capacity(10);
|
|
|
|
let (_, term_height) = terminal().terminal_size();
|
|
|
|
for i in 0..1 {
|
|
let input_buffer = input_buf.clone();
|
|
|
|
let crossterm = Crossterm::new();
|
|
|
|
let join = thread::spawn(move || {
|
|
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,
|
|
);
|
|
thread::sleep(time::Duration::from_millis(100));
|
|
}
|
|
});
|
|
|
|
threads.push(join);
|
|
}
|
|
|
|
return threads;
|
|
}
|
|
|
|
pub fn swap_write(
|
|
msg: &str,
|
|
input_buf: &String,
|
|
terminal: &Terminal,
|
|
cursor: &TerminalCursor,
|
|
term_height: u16,
|
|
) {
|
|
cursor.goto(0, term_height);
|
|
terminal.clear(ClearType::CurrentLine);
|
|
terminal.write(format!("{}\r\n", msg));
|
|
terminal.write(format!("> {}", input_buf));
|
|
}
|