aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAyose <ayosec@gmail.com>2021-04-02 00:54:28 +0100
committerbetaboon <betaboon@0x80.ninja>2021-08-17 15:46:40 +0200
commit14b0d9067e2ccb47fb84459d0d4ec0fb6bcc493a (patch)
treeef740253e039967c723f40061a04c4f31d4ac9e4
parent0fd3793a963015e8f91021e35dbb2169d15c3211 (diff)
downloadr-alacritty-14b0d9067e2ccb47fb84459d0d4ec0fb6bcc493a.tar.gz
r-alacritty-14b0d9067e2ccb47fb84459d0d4ec0fb6bcc493a.tar.bz2
r-alacritty-14b0d9067e2ccb47fb84459d0d4ec0fb6bcc493a.zip
Implementation of the XTSMGRAPHICS sequence.
-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
-rw-r--r--docs/escape_support.md1
4 files changed, 36 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)))
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 |