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 ansi_parser;
|
||||||
|
|
||||||
pub mod terminal;
|
pub mod terminal;
|
||||||
|
pub mod tty_application;
|
||||||
|
|
||||||
//pub mod list_editor;
|
//pub mod list_editor;
|
||||||
//pub mod widgets;
|
//pub mod widgets;
|
||||||
|
@ -21,6 +22,7 @@ pub use {
|
||||||
compositor::TerminalCompositor,
|
compositor::TerminalCompositor,
|
||||||
style::TerminalStyle,
|
style::TerminalStyle,
|
||||||
terminal::{Terminal, TerminalEvent},
|
terminal::{Terminal, TerminalEvent},
|
||||||
|
tty_application::TTYApplication
|
||||||
};
|
};
|
||||||
|
|
||||||
use r3vi::view::grid::*;
|
use r3vi::view::grid::*;
|
||||||
|
|
|
@ -24,7 +24,7 @@ use {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(PartialEq, Eq, Clone)]
|
#[derive(PartialEq, Eq, Clone, Debug)]
|
||||||
pub enum TerminalEvent {
|
pub enum TerminalEvent {
|
||||||
Resize(Vector2<i16>),
|
Resize(Vector2<i16>),
|
||||||
Input(termion::event::Event),
|
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