aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2019-11-01 13:49:11 -0400
committerJesse Luehrs <doy@tozt.net>2019-11-01 13:53:32 -0400
commit41b1b57793f4e8b751b6843d29dd33fe2cd7c07c (patch)
tree90bf18c7b8899e36899320def8ec248ac4369ccd
parent96f9c0e249d6434606fa1613619b89dba03979ba (diff)
downloadvt100-rust-41b1b57793f4e8b751b6843d29dd33fe2cd7c07c.tar.gz
vt100-rust-41b1b57793f4e8b751b6843d29dd33fe2cd7c07c.zip
better intermediates handling
don't treat CSI J and CSI ? J the same by default
-rw-r--r--src/screen.rs139
1 files changed, 75 insertions, 64 deletions
diff --git a/src/screen.rs b/src/screen.rs
index 667a056..79248f3 100644
--- a/src/screen.rs
+++ b/src/screen.rs
@@ -343,46 +343,46 @@ impl State {
}
// CSI h
- fn sm(&mut self, intermediate: Option<u8>, params: &[i64]) {
- match intermediate {
- Some(b'?') => {
- for param in params {
- match param {
- 1 => self.application_cursor = true,
- 9 => self.mouse_reporting_press = true,
- 25 => self.hide_cursor = false,
- 1000 => self.mouse_reporting_press_release = true,
- 1002 => self.mouse_reporting_button_motion = true,
- 1006 => self.mouse_reporting_sgr_mode = true,
- 1049 => self.enter_alternate_grid(),
- 2004 => self.bracketed_paste = true,
- _ => {}
- }
- }
+ fn sm(&mut self, _params: &[i64]) {
+ // nothing, i think?
+ }
+
+ // CSI ? h
+ fn decset(&mut self, params: &[i64]) {
+ for param in params {
+ match param {
+ 1 => self.application_cursor = true,
+ 9 => self.mouse_reporting_press = true,
+ 25 => self.hide_cursor = false,
+ 1000 => self.mouse_reporting_press_release = true,
+ 1002 => self.mouse_reporting_button_motion = true,
+ 1006 => self.mouse_reporting_sgr_mode = true,
+ 1049 => self.enter_alternate_grid(),
+ 2004 => self.bracketed_paste = true,
+ _ => {}
}
- _ => {}
}
}
// CSI l
- fn rm(&mut self, intermediate: Option<u8>, params: &[i64]) {
- match intermediate {
- Some(b'?') => {
- for param in params {
- match param {
- 1 => self.application_cursor = false,
- 9 => self.mouse_reporting_press = false,
- 25 => self.hide_cursor = true,
- 1000 => self.mouse_reporting_press_release = false,
- 1002 => self.mouse_reporting_button_motion = false,
- 1006 => self.mouse_reporting_sgr_mode = false,
- 1049 => self.exit_alternate_grid(),
- 2004 => self.bracketed_paste = false,
- _ => {}
- }
- }
+ fn rm(&mut self, _params: &[i64]) {
+ // nothing, i think?
+ }
+
+ // CSI ? l
+ fn decrst(&mut self, params: &[i64]) {
+ for param in params {
+ match param {
+ 1 => self.application_cursor = false,
+ 9 => self.mouse_reporting_press = false,
+ 25 => self.hide_cursor = true,
+ 1000 => self.mouse_reporting_press_release = false,
+ 1002 => self.mouse_reporting_button_motion = false,
+ 1006 => self.mouse_reporting_sgr_mode = false,
+ 1049 => self.exit_alternate_grid(),
+ 2004 => self.bracketed_paste = false,
+ _ => {}
}
- _ => {}
}
}
@@ -540,18 +540,21 @@ impl vte::Perform for State {
fn esc_dispatch(
&mut self,
_params: &[i64],
- _intermediates: &[u8],
+ intermediates: &[u8],
_ignore: bool,
b: u8,
) {
- match b {
- b'7' => self.decsc(),
- b'8' => self.decrc(),
- b'=' => self.deckpam(),
- b'>' => self.deckpnm(),
- b'M' => self.ri(),
- b'c' => self.ris(),
- b'g' => self.vb(),
+ match intermediates.get(0) {
+ None => match b {
+ b'7' => self.decsc(),
+ b'8' => self.decrc(),
+ b'=' => self.deckpam(),
+ b'>' => self.deckpnm(),
+ b'M' => self.ri(),
+ b'c' => self.ris(),
+ b'g' => self.vb(),
+ _ => {}
+ },
_ => {}
}
}
@@ -563,27 +566,35 @@ impl vte::Perform for State {
_ignore: bool,
c: char,
) {
- match c {
- '@' => self.ich(params),
- 'A' => self.cuu(params),
- 'B' => self.cud(params),
- 'C' => self.cuf(params),
- 'D' => self.cub(params),
- 'G' => self.cha(params),
- 'H' => self.cup(params),
- 'J' => self.ed(params),
- 'K' => self.el(params),
- 'L' => self.il(params),
- 'M' => self.dl(params),
- 'P' => self.dch(params),
- 'S' => self.su(params),
- 'T' => self.sd(params),
- 'X' => self.ech(params),
- 'd' => self.vpa(params),
- 'h' => self.sm(intermediates.get(0).copied(), params),
- 'l' => self.rm(intermediates.get(0).copied(), params),
- 'm' => self.sgr(params),
- 'r' => self.csr(params),
+ match intermediates.get(0) {
+ None => match c {
+ '@' => self.ich(params),
+ 'A' => self.cuu(params),
+ 'B' => self.cud(params),
+ 'C' => self.cuf(params),
+ 'D' => self.cub(params),
+ 'G' => self.cha(params),
+ 'H' => self.cup(params),
+ 'J' => self.ed(params),
+ 'K' => self.el(params),
+ 'L' => self.il(params),
+ 'M' => self.dl(params),
+ 'P' => self.dch(params),
+ 'S' => self.su(params),
+ 'T' => self.sd(params),
+ 'X' => self.ech(params),
+ 'd' => self.vpa(params),
+ 'h' => self.sm(params),
+ 'l' => self.rm(params),
+ 'm' => self.sgr(params),
+ 'r' => self.csr(params),
+ _ => {}
+ },
+ Some(b'?') => match c {
+ 'h' => self.decset(params),
+ 'l' => self.decrst(params),
+ _ => {}
+ },
_ => {}
}
}