diff options
Diffstat (limited to 'alacritty_terminal')
-rw-r--r-- | alacritty_terminal/src/ansi.rs | 3 | ||||
-rw-r--r-- | alacritty_terminal/src/graphics/sixel.rs | 2 | ||||
-rw-r--r-- | alacritty_terminal/src/term/mod.rs | 31 |
3 files changed, 35 insertions, 1 deletions
diff --git a/alacritty_terminal/src/ansi.rs b/alacritty_terminal/src/ansi.rs index 7eb87910..7a89ad23 100644 --- a/alacritty_terminal/src/ansi.rs +++ b/alacritty_terminal/src/ansi.rs @@ -462,6 +462,9 @@ pub trait Handler { /// Report text area size in characters. fn text_area_size_chars(&mut self) {} + /// Report a graphics attribute. + fn graphics_attribute<W: io::Write>(&mut self, _: &mut W, _: u16, _: u16) {} + /// Create a parser for Sixel data. fn start_sixel_graphic(&mut self, _params: &Params) -> Option<Box<sixel::Parser>> { None diff --git a/alacritty_terminal/src/graphics/sixel.rs b/alacritty_terminal/src/graphics/sixel.rs index 476089cc..221fe7cd 100644 --- a/alacritty_terminal/src/graphics/sixel.rs +++ b/alacritty_terminal/src/graphics/sixel.rs @@ -33,7 +33,7 @@ use vte::Params; struct ColorRegister(u16); /// Number of color registers. -const MAX_COLOR_REGISTERS: usize = 1024; +pub const MAX_COLOR_REGISTERS: usize = 1024; /// Color register for transparent pixels. const REG_TRANSPARENT: ColorRegister = ColorRegister(u16::MAX); diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs index 1e87ec8a..63a2e282 100644 --- a/alacritty_terminal/src/term/mod.rs +++ b/alacritty_terminal/src/term/mod.rs @@ -1771,6 +1771,37 @@ impl<T: EventListener> Handler for Term<T> { self.event_proxy.send_event(Event::PtyWrite(text)); } + #[inline] + fn graphics_attribute<W: io::Write>(&mut self, writer: &mut W, pi: u16, pa: u16) { + // From Xterm documentation: + // + // Pi = 1 -> item is number of color registers. + // Pi = 2 -> item is Sixel graphics geometry (in pixels). + // + // Pa = 1 -> read attribute. + // Pa = 4 -> read the maximum allowed value. + // + // Any other request reports an error. + + let (ps, pv) = if pa == 1 || pa == 4 { + match pi { + 1 => (0, &[sixel::MAX_COLOR_REGISTERS][..]), + 2 => (0, &[MAX_GRAPHIC_DIMENSIONS.0, MAX_GRAPHIC_DIMENSIONS.1][..]), + _ => (1, &[][..]), // Report error in Pi + } + } else { + (2, &[][..]) // Report error in Pa + }; + + let _ = write!(writer, "\x1b[?{};{}", pi, ps); + + for item in pv { + let _ = write!(writer, ";{}", item); + } + + let _ = write!(writer, "S"); + } + fn start_sixel_graphic(&mut self, params: &Params) -> Option<Box<sixel::Parser>> { let palette = self.graphics.sixel_shared_palette.take(); Some(Box::new(sixel::Parser::new(params, palette))) |