add TTYApplication

This commit is contained in:
Michael Sippel 2023-11-28 17:16:51 +01:00
parent 9b9ea77cb0
commit 57cb1ee3ff
Signed by: senvas
GPG key ID: F96CF119C34B64A6
4 changed files with 75 additions and 2 deletions

View file

@ -1,4 +1,4 @@
use {
use {
r3vi::{view::{OuterViewPort, singleton::*}, buffer::{singleton::*}},
laddertypes::{TypeDict, TypeTerm, TypeID},
crate::{

View file

@ -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::*;

View file

@ -24,7 +24,7 @@ use {
},
};
#[derive(PartialEq, Eq, Clone)]
#[derive(PartialEq, Eq, Clone, Debug)]
pub enum TerminalEvent {
Resize(Vector2<i16>),
Input(termion::event::Event),

View 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
}
}