try to improve ansi parsing

This commit is contained in:
Michael Sippel 2021-11-18 22:55:32 +01:00
parent ef1a477d4a
commit f480b79031
Signed by: senvas
GPG key ID: F96CF119C34B64A6
4 changed files with 87 additions and 31 deletions

View file

@ -166,7 +166,7 @@ where P: Send + Sync + 'static,
} }
} }
} else { } else {
eprintln!("proj update: upgrade fail"); //eprintln!("proj update: upgrade fail");
} }
} }
} }

View file

@ -31,7 +31,7 @@ use {
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>> //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>
pub fn read_ansi_from<R: Read + Unpin>(ansi_reader: &mut R, port: InnerViewPort<dyn TerminalView>) { pub fn read_ansi_from<R: Read + Unpin>(ansi_reader: &mut R, max_size: Vector2<i16>, port: InnerViewPort<dyn TerminalView>) {
let mut statemachine = Parser::new(); let mut statemachine = Parser::new();
let buf_port = ViewPort::new(); let buf_port = ViewPort::new();
@ -41,7 +41,7 @@ pub fn read_ansi_from<R: Read + Unpin>(ansi_reader: &mut R, port: InnerViewPort<
let mut performer = PerfAtom { let mut performer = PerfAtom {
buf: IndexBuffer::new(buf_port.inner()), buf: IndexBuffer::new(buf_port.inner()),
size: SingletonBuffer::new(Vector2::new(120, 40), size_port.inner()), size: SingletonBuffer::new(max_size, size_port.inner()),
offset: SingletonBuffer::new(Vector2::new(0, 0), offset_port.inner()), offset: SingletonBuffer::new(Vector2::new(0, 0), offset_port.inner()),
cursor: SingletonBuffer::new(Point2::new(0, 0), cursor_port.inner()), cursor: SingletonBuffer::new(Point2::new(0, 0), cursor_port.inner()),
cursty: TerminalStyle::default(), cursty: TerminalStyle::default(),
@ -340,7 +340,7 @@ impl PerfAtom {
} }
fn backspace(&mut self) { fn backspace(&mut self) {
//self.write_atom(self.cursor.get(), None); self.write_atom(self.cursor.get(), None);
let mut c = self.cursor.get_mut(); let mut c = self.cursor.get_mut();
c.x -= 1; c.x -= 1;
if c.x < 0 { if c.x < 0 {
@ -350,13 +350,50 @@ impl PerfAtom {
} }
fn cursor_up(&mut self, n: usize) { fn cursor_up(&mut self, n: usize) {
if self.cursor.get().y <= 0 {
self.scroll_dn(1);
} else {
self.cursor.get_mut().y -= n as i16; self.cursor.get_mut().y -= n as i16;
} }
}
fn cursor_dn(&mut self, n: usize) { fn cursor_dn(&mut self, n: usize) {
self.cursor.get_mut().y += n as i16; let mut c = self.cursor.get_mut();
let s = self.size.get();
// todo: scroll ? if c.y + (n as i16) < s.y {
c.y += n as i16;
} else {
let r = (n as i16) - (s.y - 1 - c.y);
c.y = s.y-1;
self.scroll_up(r as usize);
}
}
fn cursor_pxev(&mut self, n: usize) {
let mut c = self.cursor.get_mut();
let s = self.size.get();
if c.y - (n as i16) >= 0 {
c.y -= n as i16;
} else {
let r = (n as i16) - c.y;
c.y = 0;
self.scroll_dn(r as usize);
}
}
fn cursor_nexd(&mut self, n: usize) {
let mut c = self.cursor.get_mut();
c.x += n as i16;
if c.x >= self.size.get().x {
c.y += c.x / self.size.get().x;
c.x %= self.size.get().x;
}
}
fn insert_blank_lines(&mut self, n: usize) {
//eprintln!("insert blank lines");
} }
fn scroll_up(&mut self, n: usize) { fn scroll_up(&mut self, n: usize) {
@ -365,6 +402,7 @@ impl PerfAtom {
fn scroll_dn(&mut self, n: usize) { fn scroll_dn(&mut self, n: usize) {
self.offset.get_mut().y -= n as i16; self.offset.get_mut().y -= n as i16;
//self.cursor_up(n);
} }
fn save_cursor_position(&mut self) { fn save_cursor_position(&mut self) {
@ -409,7 +447,9 @@ impl Perform for PerfAtom {
} }
fn put(&mut self, byte: u8) { fn put(&mut self, byte: u8) {
//eprintln!("[put] {:02x}", byte); /*
eprintln!("[put] {:02x}", byte);
*/
} }
fn unhook(&mut self) { fn unhook(&mut self) {
@ -418,6 +458,17 @@ impl Perform for PerfAtom {
fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) { fn osc_dispatch(&mut self, params: &[&[u8]], bell_terminated: bool) {
//eprintln!("[osc_dispatch] params={:?} bell_terminated={}", params, bell_terminated); //eprintln!("[osc_dispatch] params={:?} bell_terminated={}", params, bell_terminated);
match params[0] {
// Reset foreground color
b"110" => self.set_fg_color(&TTYColor::White),
// Reset background color
b"111" => self.set_bg_color(&TTYColor::Black),
// Reset text cursor color
b"112" => {},
_ => {}
}
} }
fn csi_dispatch(&mut self, params: &Params, intermediates: &[u8], ignore: bool, c: char) { fn csi_dispatch(&mut self, params: &Params, intermediates: &[u8], ignore: bool, c: char) {
@ -508,28 +559,18 @@ impl Perform for PerfAtom {
} }
} }
'@' => { '@' => {
let c = self.cursor.get(); let n = piter.next().unwrap_or(&[1])[0] as usize;
for x in c.x .. self.size.get().x { for _ in 0..n {
self.write_atom(Point2::new(x, c.y), Some(TerminalAtom::new(' ', self.cursty))); self.print(' ');
} }
} }
'A' => { self.cursor_up(piter.next().unwrap_or(&[1])[0] as usize); } 'A' => { self.cursor_up(piter.next().unwrap_or(&[1])[0] as usize); }
'B' => { self.cursor_dn(piter.next().unwrap_or(&[1])[0] as usize); } 'B' => { self.cursor_dn(piter.next().unwrap_or(&[1])[0] as usize); }
'C' | 'a' => { 'C' | 'a' => {
let mut c = self.cursor.get_mut(); self.cursor_nexd(piter.next().unwrap_or(&[1])[0] as usize);
c.x += piter.next().unwrap_or(&[1])[0] as i16;
if c.x >= self.size.get().x {
c.y += c.x / self.size.get().x;
c.x %= self.size.get().x;
}
} }
'D' => { 'D' => {
let mut c = self.cursor.get_mut(); self.cursor_pxev(piter.next().unwrap_or(&[1])[0] as usize);
c.x -= piter.next().unwrap_or(&[1])[0] as i16;
if c.x < 0 {
c.x = self.size.get().x - 1;
c.y -= 1;
}
} }
'd' => { 'd' => {
self.cursor.get_mut().y = piter.next().unwrap_or(&[1])[0] as i16 - 1; self.cursor.get_mut().y = piter.next().unwrap_or(&[1])[0] as i16 - 1;
@ -546,6 +587,7 @@ impl Perform for PerfAtom {
let mut c = self.cursor.get_mut(); let mut c = self.cursor.get_mut();
c.x = 0; c.x = 0;
c.y -= piter.next().unwrap_or(&[1])[0] as i16; c.y -= piter.next().unwrap_or(&[1])[0] as i16;
} }
'G' | '`' => { 'G' | '`' => {
self.cursor.get_mut().x = piter.next().unwrap_or(&[1])[0] as i16 - 1; self.cursor.get_mut().x = piter.next().unwrap_or(&[1])[0] as i16 - 1;
@ -562,7 +604,6 @@ impl Perform for PerfAtom {
// clear from cursor until end of screen // clear from cursor until end of screen
0 => { 0 => {
let mut pos = self.cursor.get(); let mut pos = self.cursor.get();
while pos.y < 100 { while pos.y < 100 {
self.write_atom(pos, None); self.write_atom(pos, None);
pos.x += 1; pos.x += 1;
@ -637,26 +678,36 @@ impl Perform for PerfAtom {
_ => {} _ => {}
} }
} }
/* 'L' => {
self.insert_blank_lines(piter.next().unwrap_or(&[1])[0] as usize);
}
'M' => { 'M' => {
//eprintln!("delete lines");
/*
let n = piter.next().unwrap_or(&[1])[0] as i16; let n = piter.next().unwrap_or(&[1])[0] as i16;
for y in 0 .. n { for y in 0 .. n {
for x in 0 .. self.size.get().x { for x in 0 .. self.size.get().x {
self.write_atom(Point2::new(x, self.cursor.y+y), None); self.write_atom(Point2::new(x, self.cursor.y+y), None);
} }
} }
*/
} }
/*
'P' => { 'P' => {
for x in 0 .. piter.next().unwrap_or(&[1])[0] { for x in 0 .. piter.next().unwrap_or(&[1])[0] {
self.backspace(); self.backspace();
} }
}
'X' => {
for x in 0 .. piter.next().unwrap_or(&[1])[0] {
self.write_atom(Point2::new(self.cursor.x + x as i16, self.cursor.y), None);
}
} }
*/ */
'X' => {
//eprintln!("delete chars");
let c = self.cursor.get();
for x in 0 .. piter.next().unwrap_or(&[1])[0] {
self.write_atom(Point2::new(c.x + x as i16, c.y), Some(TerminalAtom::new(' ', self.get_style())));
}
}
'S' => { self.scroll_up(piter.next().unwrap_or(&[1])[0] as usize); } 'S' => { self.scroll_up(piter.next().unwrap_or(&[1])[0] as usize); }
'T' => { self.scroll_dn(piter.next().unwrap_or(&[1])[0] as usize); } 'T' => { self.scroll_dn(piter.next().unwrap_or(&[1])[0] as usize); }
's' => { self.save_cursor_position(); } 's' => { self.save_cursor_position(); }

View file

@ -109,6 +109,8 @@ impl ProcessLauncher {
ListEditorStyle::Plain ListEditorStyle::Plain
); );
compositor.write().unwrap().push( compositor.write().unwrap().push(
box_port.outer() box_port.outer()
.map_item(|_idx, x| x.add_style_back(TerminalStyle::fg_color((90, 120, 100)))) .map_item(|_idx, x| x.add_style_back(TerminalStyle::fg_color((90, 120, 100))))
@ -125,7 +127,7 @@ impl ProcessLauncher {
cmd_editor, cmd_editor,
pty: None, pty: None,
ptybox: crate::ascii_box::AsciiBox::new( ptybox: crate::ascii_box::AsciiBox::new(
cgmath::Vector2::new(80, 25), cgmath::Vector2::new(0, 0),
pty_port.outer() pty_port.outer()
.map_item(|_,a:&TerminalAtom| a.add_style_back(TerminalStyle::fg_color((230, 230, 230)))), .map_item(|_,a:&TerminalAtom| a.add_style_back(TerminalStyle::fg_color((230, 230, 230)))),
box_port.inner() box_port.inner()
@ -151,6 +153,7 @@ impl ProcessLauncher {
// Spawn a shell into the pty // Spawn a shell into the pty
let mut cmd = crate::pty::CommandBuilder::new(strings[0].as_str()); let mut cmd = crate::pty::CommandBuilder::new(strings[0].as_str());
cmd.args(&strings[1..]); cmd.args(&strings[1..]);
cmd.cwd(".");
self.cmd_editor.goto(TreeCursor { self.cmd_editor.goto(TreeCursor {
leaf_mode: ListCursorMode::Insert, leaf_mode: ListCursorMode::Insert,

View file

@ -65,7 +65,7 @@ impl PTY {
async_std::task::spawn_blocking( async_std::task::spawn_blocking(
move || { move || {
nested::terminal::ansi_parser::read_ansi_from(&mut reader, term_port); nested::terminal::ansi_parser::read_ansi_from(&mut reader, max_size, term_port);
}); });
async_std::task::spawn_blocking({ async_std::task::spawn_blocking({
@ -76,6 +76,8 @@ impl PTY {
status_buf.set(PTYStatus::Done{ status }); status_buf.set(PTYStatus::Done{ status });
break; break;
} }
std::thread::sleep(std::time::Duration::from_millis(10));
} }
} }
}); });