add TTYApplication
This commit is contained in:
parent
9b9ea77cb0
commit
57cb1ee3ff
4 changed files with 75 additions and 2 deletions
|
@ -10,6 +10,7 @@ pub mod compositor;
|
|||
pub mod ansi_parser;
|
||||
|
||||
pub mod terminal;
|
||||
pub mod tty_application;
|
||||
|
||||
//pub mod list_editor;
|
||||
//pub mod widgets;
|
||||
|
@ -21,6 +22,7 @@ pub use {
|
|||
compositor::TerminalCompositor,
|
||||
style::TerminalStyle,
|
||||
terminal::{Terminal, TerminalEvent},
|
||||
tty_application::TTYApplication
|
||||
};
|
||||
|
||||
use r3vi::view::grid::*;
|
||||
|
|
|
@ -24,7 +24,7 @@ use {
|
|||
},
|
||||
};
|
||||
|
||||
#[derive(PartialEq, Eq, Clone)]
|
||||
#[derive(PartialEq, Eq, Clone, Debug)]
|
||||
pub enum TerminalEvent {
|
||||
Resize(Vector2<i16>),
|
||||
Input(termion::event::Event),
|
||||
|
|
71
lib-nested-tty/src/tty_application.rs
Normal file
71
lib-nested-tty/src/tty_application.rs
Normal file
|
@ -0,0 +1,71 @@
|
|||
use {
|
||||
cgmath::Vector2,
|
||||
nested::{
|
||||
editTree::NestedNode,
|
||||
reprTree::{Context, ReprTree},
|
||||
},
|
||||
crate::{
|
||||
terminal::TermOutWriter, DisplaySegment, Terminal, TerminalAtom, TerminalCompositor,
|
||||
TerminalEvent, TerminalStyle, TerminalView,
|
||||
},
|
||||
r3vi::{
|
||||
buffer::singleton::*,
|
||||
view::{port::UpdateTask, singleton::*, ViewPort},
|
||||
},
|
||||
std::sync::{Arc, Mutex, RwLock},
|
||||
termion::event::{Event, Key},
|
||||
};
|
||||
|
||||
pub struct TTYApplication {
|
||||
pub port: ViewPort<dyn TerminalView>,
|
||||
term_writer: Arc<TermOutWriter>,
|
||||
}
|
||||
|
||||
impl TTYApplication {
|
||||
pub fn new(event_handler: impl Fn(TerminalEvent) + Send + Sync + 'static) -> Self {
|
||||
let port = ViewPort::new();
|
||||
let portmutex = Mutex::new(());
|
||||
let term = Terminal::new(port.outer());
|
||||
let term_writer = term.get_writer();
|
||||
|
||||
async_std::task::spawn(TTYApplication::event_loop(term, port.clone(), Arc::new(event_handler)));
|
||||
async_std::task::spawn(TTYApplication::update_loop(port.clone()));
|
||||
|
||||
TTYApplication {
|
||||
port,
|
||||
term_writer,
|
||||
}
|
||||
}
|
||||
|
||||
/* this task handles all terminal events (e.g. key press, resize)
|
||||
*/
|
||||
async fn event_loop(mut term: Terminal, port: ViewPort<dyn TerminalView>, event_handler: Arc<dyn Fn(TerminalEvent) + Send + Sync>) {
|
||||
loop {
|
||||
let ev = term.next_event().await;
|
||||
if ev == TerminalEvent::Input(Event::Key(Key::Ctrl('d'))) {
|
||||
break;
|
||||
}
|
||||
|
||||
event_handler( ev );
|
||||
port.update();
|
||||
}
|
||||
}
|
||||
|
||||
/* this task will continuously pull forward
|
||||
* all notifications which are influencing
|
||||
* the view in `term_port`
|
||||
*/
|
||||
async fn update_loop(port: ViewPort<dyn TerminalView>) {
|
||||
loop {
|
||||
port.update();
|
||||
async_std::task::sleep(std::time::Duration::from_millis(500)).await;
|
||||
}
|
||||
}
|
||||
|
||||
/* write the changes in the view of `term_port` to the terminal
|
||||
*/
|
||||
pub async fn show(&self) -> Result<(), std::io::Error> {
|
||||
self.term_writer.show().await
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in a new issue