From 14b0d9067e2ccb47fb84459d0d4ec0fb6bcc493a Mon Sep 17 00:00:00 2001 From: Ayose Date: Fri, 2 Apr 2021 00:54:28 +0100 Subject: Implementation of the XTSMGRAPHICS sequence. --- alacritty_terminal/src/ansi.rs | 3 +++ alacritty_terminal/src/graphics/sixel.rs | 2 +- alacritty_terminal/src/term/mod.rs | 31 +++++++++++++++++++++++++++++++ docs/escape_support.md | 1 + 4 files changed, 36 insertions(+), 1 deletion(-) 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(&mut self, _: &mut W, _: u16, _: u16) {} + /// Create a parser for Sixel data. fn start_sixel_graphic(&mut self, _params: &Params) -> Option> { 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 Handler for Term { self.event_proxy.send_event(Event::PtyWrite(text)); } + #[inline] + fn graphics_attribute(&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> { let palette = self.graphics.sixel_shared_palette.take(); Some(Box::new(sixel::Parser::new(params, palette))) diff --git a/docs/escape_support.md b/docs/escape_support.md index 5008d6a6..bc951753 100644 --- a/docs/escape_support.md +++ b/docs/escape_support.md @@ -71,6 +71,7 @@ brevity. | `CSI SP q` | IMPLEMENTED | | | `CSI r` | IMPLEMENTED | | | `CSI S` | IMPLEMENTED | | +| `CSI ? S` | PARTIAL | Only for reading attributes. | | `CSI s` | IMPLEMENTED | | | `CSI T` | IMPLEMENTED | | | `CSI t` | PARTIAL | Only parameters `22` and `23` are supported | -- cgit