1
1
mirror of https://github.com/wez/wezterm.git synced 2024-09-21 03:39:16 +03:00

termwiz: fix dec private mode parsing

When processing `\033[?1002;1003;1005;1006h`, when we encountered
`1005` we would skip 1006.  This was because we hit the unspecified
enum case for 1005 (we have no enum variant for that mode) and that
code path didn't properly advance only by a single position.

This commit fixes that.

refs: https://github.com/wez/wezterm/issues/211#issuecomment-641302077
This commit is contained in:
Wez Furlong 2020-06-09 19:00:12 -07:00
parent 65f94bd57b
commit 18a234a162

View File

@ -1539,14 +1539,22 @@ impl<'a> CSIParser<'a> {
fn dec(&mut self, params: &'a [i64]) -> Result<DecPrivateMode, ()> {
match num::FromPrimitive::from_i64(params[0]) {
None => Ok(DecPrivateMode::Unspecified(params[0].to_u16().ok_or(())?)),
None => Ok(self.advance_by(
1,
params,
DecPrivateMode::Unspecified(params[0].to_u16().ok_or(())?),
)),
Some(mode) => Ok(self.advance_by(1, params, DecPrivateMode::Code(mode))),
}
}
fn terminal_mode(&mut self, params: &'a [i64]) -> Result<TerminalMode, ()> {
match num::FromPrimitive::from_i64(params[0]) {
None => Ok(TerminalMode::Unspecified(params[0].to_u16().ok_or(())?)),
None => Ok(self.advance_by(
1,
params,
TerminalMode::Unspecified(params[0].to_u16().ok_or(())?),
)),
Some(mode) => Ok(self.advance_by(1, params, TerminalMode::Code(mode))),
}
}
@ -2048,6 +2056,27 @@ mod test {
))),
]
);
assert_eq!(
parse_int(
'h',
&[1002, 1003, 1005, 1006],
b'?',
"\x1b[?1002h\x1b[?1003h\x1b[?1005h\x1b[?1006h"
),
vec![
CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code(
DecPrivateModeCode::ButtonEventMouse,
))),
CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code(
DecPrivateModeCode::AnyEventMouse,
))),
CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Unspecified(1005))),
CSI::Mode(Mode::SetDecPrivateMode(DecPrivateMode::Code(
DecPrivateModeCode::SGRMouse,
))),
]
);
}
#[test]