aboutsummaryrefslogtreecommitdiff
path: root/alacritty_terminal
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty_terminal')
-rw-r--r--alacritty_terminal/src/ansi.rs3
-rw-r--r--alacritty_terminal/src/graphics/sixel.rs2
-rw-r--r--alacritty_terminal/src/term/mod.rs31
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)))