1
1
mirror of https://github.com/wez/wezterm.git synced 2024-12-24 05:42:03 +03:00

parse cursorstyle escape sequence

This commit is contained in:
Wez Furlong 2018-08-04 12:42:44 -07:00
parent 95b4f57a5b
commit 7291084a31
2 changed files with 36 additions and 2 deletions

View File

@ -76,6 +76,23 @@ impl Display for CSI {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive, ToPrimitive)]
pub enum CursorStyle {
Default = 0,
BlinkingBlock = 1,
SteadyBlock = 2,
BlinkingUnderline = 3,
SteadyUnderline = 4,
BlinkingBar = 5,
SteadyBar = 6,
}
impl Default for CursorStyle {
fn default() -> CursorStyle {
CursorStyle::Default
}
}
#[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive)] #[derive(Debug, Clone, PartialEq, Eq, FromPrimitive, ToPrimitive)]
pub enum DeviceAttributeCodes { pub enum DeviceAttributeCodes {
Columns132 = 1, Columns132 = 1,
@ -445,6 +462,8 @@ pub enum Cursor {
top: u32, top: u32,
bottom: u32, bottom: u32,
}, },
CursorStyle(CursorStyle),
} }
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
@ -623,6 +642,7 @@ impl Display for Cursor {
Cursor::RequestActivePositionReport => write!(f, "6n")?, Cursor::RequestActivePositionReport => write!(f, "6n")?,
Cursor::SaveCursor => write!(f, "s")?, Cursor::SaveCursor => write!(f, "s")?,
Cursor::RestoreCursor => write!(f, "u")?, Cursor::RestoreCursor => write!(f, "u")?,
Cursor::CursorStyle(style) => write!(f, "{} q", *style as u8)?,
} }
Ok(()) Ok(())
} }
@ -1029,6 +1049,7 @@ impl<'a> CSIParser<'a> {
('m', &[]) => self.sgr(params).map(|sgr| CSI::Sgr(sgr)), ('m', &[]) => self.sgr(params).map(|sgr| CSI::Sgr(sgr)),
('n', &[]) => self.dsr(params), ('n', &[]) => self.dsr(params),
('q', &[b' ']) => self.cursor_style(params),
('r', &[]) => self.decstbm(params), ('r', &[]) => self.decstbm(params),
('s', &[]) => noparams!(Cursor, SaveCursor, params), ('s', &[]) => noparams!(Cursor, SaveCursor, params),
('u', &[]) => noparams!(Cursor, RestoreCursor, params), ('u', &[]) => noparams!(Cursor, RestoreCursor, params),
@ -1078,6 +1099,19 @@ impl<'a> CSIParser<'a> {
result result
} }
fn cursor_style(&mut self, params: &'a [i64]) -> Result<CSI, ()> {
if params.len() != 1 {
Err(())
} else {
match num::FromPrimitive::from_i64(params[0]) {
None => Err(()),
Some(style) => {
Ok(self.advance_by(1, params, CSI::Cursor(Cursor::CursorStyle(style))))
}
}
}
}
fn dsr(&mut self, params: &'a [i64]) -> Result<CSI, ()> { fn dsr(&mut self, params: &'a [i64]) -> Result<CSI, ()> {
if params == [5] { if params == [5] {
Ok(self.advance_by(1, params, CSI::Device(Box::new(Device::StatusReport)))) Ok(self.advance_by(1, params, CSI::Device(Box::new(Device::StatusReport))))

View File

@ -504,8 +504,8 @@ impl TerminfoRenderer {
CursorShape::SteadyBlock => 2, CursorShape::SteadyBlock => 2,
CursorShape::BlinkingUnderline => 3, CursorShape::BlinkingUnderline => 3,
CursorShape::SteadyUnderline => 4, CursorShape::SteadyUnderline => 4,
CursorShape::BlinkingBar => 6, CursorShape::BlinkingBar => 5,
CursorShape::SteadyBar => 7, CursorShape::SteadyBar => 6,
}; };
if let Some(set) = self.get_capability::<cap::SetCursorStyle>() { if let Some(set) = self.get_capability::<cap::SetCursorStyle>() {
set.expand().kind(param).to(out.by_ref())?; set.expand().kind(param).to(out.by_ref())?;