try to improve ansi parsing
This commit is contained in:
parent
ef1a477d4a
commit
f480b79031
4 changed files with 87 additions and 31 deletions
|
@ -166,7 +166,7 @@ where P: Send + Sync + 'static,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
eprintln!("proj update: upgrade fail");
|
//eprintln!("proj update: upgrade fail");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
self.cursor.get_mut().y -= n as i16;
|
if self.cursor.get().y <= 0 {
|
||||||
|
self.scroll_dn(1);
|
||||||
|
} else {
|
||||||
|
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) {
|
||||||
|
@ -405,11 +443,13 @@ impl Perform for PerfAtom {
|
||||||
"[hook] params={:?}, intermediates={:?}, ignore={:?}, char={:?}",
|
"[hook] params={:?}, intermediates={:?}, ignore={:?}, char={:?}",
|
||||||
params, intermediates, ignore, c
|
params, intermediates, ignore, c
|
||||||
);
|
);
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
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' => {
|
'X' => {
|
||||||
|
//eprintln!("delete chars");
|
||||||
|
let c = self.cursor.get();
|
||||||
for x in 0 .. piter.next().unwrap_or(&[1])[0] {
|
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);
|
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(); }
|
||||||
|
@ -667,7 +718,7 @@ impl Perform for PerfAtom {
|
||||||
"[csi_dispatch] params={:#?}, intermediates={:?}, ignore={:?}, char={:?}",
|
"[csi_dispatch] params={:#?}, intermediates={:?}, ignore={:?}, char={:?}",
|
||||||
params, intermediates, ignore, c
|
params, intermediates, ignore, c
|
||||||
);
|
);
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
Loading…
Reference in a new issue