aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--alacritty/src/display/content.rs2
-rw-r--r--alacritty/src/renderer/rects.rs98
-rw-r--r--alacritty_terminal/src/ansi.rs13
-rw-r--r--alacritty_terminal/src/config/mod.rs2
-rw-r--r--alacritty_terminal/src/term/cell.rs2
-rw-r--r--alacritty_terminal/src/term/mod.rs10
6 files changed, 112 insertions, 15 deletions
diff --git a/alacritty/src/display/content.rs b/alacritty/src/display/content.rs
index 2deb3d3e..09116508 100644
--- a/alacritty/src/display/content.rs
+++ b/alacritty/src/display/content.rs
@@ -271,7 +271,7 @@ impl RenderableCell {
self.bg_alpha == 0.
&& self.character == ' '
&& self.zerowidth.is_none()
- && !self.flags.intersects(Flags::UNDERLINE | Flags::STRIKEOUT | Flags::DOUBLE_UNDERLINE)
+ && !self.flags.intersects(Flags::UNDERLINE | Flags::STRIKEOUT | Flags::DOUBLE_UNDERLINE | Flags::UNDERCURL)
}
/// Apply [`CellRgb`] colors to the cell's colors.
diff --git a/alacritty/src/renderer/rects.rs b/alacritty/src/renderer/rects.rs
index 77c22011..91a67c22 100644
--- a/alacritty/src/renderer/rects.rs
+++ b/alacritty/src/renderer/rects.rs
@@ -62,7 +62,7 @@ impl RenderLine {
end: Point<usize>,
color: Rgb,
) {
- let (position, thickness) = match flag {
+ match flag {
Flags::DOUBLE_UNDERLINE => {
// Position underlines so each one has 50% of descent available.
let top_pos = 0.25 * metrics.descent;
@@ -78,22 +78,93 @@ impl RenderLine {
color,
));
- (bottom_pos, metrics.underline_thickness)
+ rects.push(Self::create_rect(
+ size,
+ metrics.descent,
+ start,
+ end,
+ bottom_pos,
+ metrics.underline_thickness,
+ color,
+ ));
+ },
+ Flags::UNDERLINE => {
+ rects.push(Self::create_rect(
+ size,
+ metrics.descent,
+ start,
+ end,
+ metrics.underline_position,
+ metrics.underline_thickness,
+ color,
+ ));
},
- Flags::UNDERLINE => (metrics.underline_position, metrics.underline_thickness),
- Flags::STRIKEOUT => (metrics.strikeout_position, metrics.strikeout_thickness),
+ Flags::STRIKEOUT => {
+ rects.push(Self::create_rect(
+ size,
+ metrics.descent,
+ start,
+ end,
+ metrics.strikeout_position,
+ metrics.strikeout_thickness,
+ color,
+ ));
+ },
+ Flags::UNDERCURL => {
+ Self::push_undercurl_rects(
+ rects,
+ size,
+ metrics.descent,
+ start,
+ end,
+ metrics.underline_position,
+ metrics.underline_thickness,
+ color)
+ }
_ => unimplemented!("Invalid flag for cell line drawing specified"),
};
+ }
- rects.push(Self::create_rect(
- size,
- metrics.descent,
- start,
- end,
- position,
- thickness,
- color,
- ));
+ fn push_undercurl_rects(
+ rects: &mut Vec<RenderRect>,
+ size: &SizeInfo,
+ descent: f32,
+ start: Point<usize>,
+ end: Point<usize>,
+ position: f32,
+ mut thickness: f32,
+ color: Rgb,
+ ) {
+ let start_x = start.column.0 as f32 * size.cell_width();
+ let end_x = (end.column.0 + 1) as f32 * size.cell_width();
+
+ // Make sure lines are always visible.
+ thickness = thickness.max(1.);
+
+ let line_bottom = (start.line as f32 + 1.) * size.cell_height();
+ let baseline = line_bottom + descent;
+
+ let mut y = (baseline - position - thickness / 2.).ceil();
+ let max_y = line_bottom - thickness;
+ if y > max_y {
+ y = max_y;
+ }
+
+ let mut x = start_x;
+ let mut idx = 0;
+ while x < end_x {
+ let rect = RenderRect::new(
+ x + size.padding_x(),
+ y + size.padding_y() + ((idx % 2) as f32) - 1.,
+ 1.,
+ thickness + 1.,
+ color,
+ 1.,
+ );
+ rects.push(rect);
+ x += 1.;
+ idx += 1;
+ }
}
/// Create a line's rect at a position relative to the baseline.
@@ -161,6 +232,7 @@ impl RenderLines {
self.update_flag(cell, Flags::UNDERLINE);
self.update_flag(cell, Flags::DOUBLE_UNDERLINE);
self.update_flag(cell, Flags::STRIKEOUT);
+ self.update_flag(cell, Flags::UNDERCURL);
}
/// Update the lines for a specific flag.
diff --git a/alacritty_terminal/src/ansi.rs b/alacritty_terminal/src/ansi.rs
index 55492d36..35a46549 100644
--- a/alacritty_terminal/src/ansi.rs
+++ b/alacritty_terminal/src/ansi.rs
@@ -768,6 +768,8 @@ pub enum Attr {
Underline,
/// Underlined twice.
DoubleUnderline,
+ /// Underlined twice.
+ Undercurl,
/// Blink cursor slowly.
BlinkSlow,
/// Blink cursor fast.
@@ -798,6 +800,8 @@ pub enum Attr {
Foreground(Color),
/// Set indexed background color.
Background(Color),
+ /// Set indexed special color (for underlines).
+ Special(Color),
}
/// Identifiers which can be assigned to a graphic character set.
@@ -1316,6 +1320,7 @@ fn attrs_from_sgr_parameters(params: &mut ParamsIter<'_>) -> Vec<Option<Attr>> {
[3] => Some(Attr::Italic),
[4, 0] => Some(Attr::CancelUnderline),
[4, 2] => Some(Attr::DoubleUnderline),
+ [4, 3] => Some(Attr::Undercurl),
[4, ..] => Some(Attr::Underline),
[5] => Some(Attr::BlinkSlow),
[6] => Some(Attr::BlinkFast),
@@ -1370,6 +1375,14 @@ fn attrs_from_sgr_parameters(params: &mut ParamsIter<'_>) -> Vec<Option<Attr>> {
parse_sgr_color(&mut iter).map(Attr::Background)
},
[49] => Some(Attr::Background(Color::Named(NamedColor::Background))),
+ [58, params @ ..] => {
+ let rgb_start = if params.len() > 4 { 2 } else { 1 };
+ let rgb_iter = params[rgb_start..].iter().copied();
+ let mut iter = iter::once(params[0]).chain(rgb_iter);
+
+ parse_sgr_color(&mut iter).map(Attr::Special)
+ },
+ [59] => Some(Attr::Special(Color::Named(NamedColor::Foreground))),
[90] => Some(Attr::Foreground(Color::Named(NamedColor::BrightBlack))),
[91] => Some(Attr::Foreground(Color::Named(NamedColor::BrightRed))),
[92] => Some(Attr::Foreground(Color::Named(NamedColor::BrightGreen))),
diff --git a/alacritty_terminal/src/config/mod.rs b/alacritty_terminal/src/config/mod.rs
index 0b313598..382314bd 100644
--- a/alacritty_terminal/src/config/mod.rs
+++ b/alacritty_terminal/src/config/mod.rs
@@ -66,6 +66,7 @@ pub struct Cursor {
pub style: ConfigCursorStyle,
pub vi_mode_style: Option<ConfigCursorStyle>,
pub unfocused_hollow: bool,
+ pub cursor_crosshairs: bool,
thickness: Percentage,
blink_interval: u64,
@@ -79,6 +80,7 @@ impl Default for Cursor {
blink_interval: 750,
style: Default::default(),
vi_mode_style: Default::default(),
+ cursor_crosshairs: false,
}
}
}
diff --git a/alacritty_terminal/src/term/cell.rs b/alacritty_terminal/src/term/cell.rs
index 64de5492..2191ced2 100644
--- a/alacritty_terminal/src/term/cell.rs
+++ b/alacritty_terminal/src/term/cell.rs
@@ -24,6 +24,7 @@ bitflags! {
const STRIKEOUT = 0b0000_0010_0000_0000;
const LEADING_WIDE_CHAR_SPACER = 0b0000_0100_0000_0000;
const DOUBLE_UNDERLINE = 0b0000_1000_0000_0000;
+ const UNDERCURL = 0b0001_0000_0000_0000;
}
}
@@ -119,6 +120,7 @@ impl GridCell for Cell {
Flags::INVERSE
| Flags::UNDERLINE
| Flags::DOUBLE_UNDERLINE
+ | Flags::UNDERCURL
| Flags::STRIKEOUT
| Flags::WRAPLINE
| Flags::WIDE_CHAR_SPACER
diff --git a/alacritty_terminal/src/term/mod.rs b/alacritty_terminal/src/term/mod.rs
index 1808f3aa..367f39f9 100644
--- a/alacritty_terminal/src/term/mod.rs
+++ b/alacritty_terminal/src/term/mod.rs
@@ -1509,14 +1509,22 @@ impl<T: EventListener> Handler for Term<T> {
Attr::CancelItalic => cursor.template.flags.remove(Flags::ITALIC),
Attr::Underline => {
cursor.template.flags.remove(Flags::DOUBLE_UNDERLINE);
+ cursor.template.flags.remove(Flags::UNDERCURL);
cursor.template.flags.insert(Flags::UNDERLINE);
},
Attr::DoubleUnderline => {
cursor.template.flags.remove(Flags::UNDERLINE);
+ cursor.template.flags.remove(Flags::UNDERCURL);
cursor.template.flags.insert(Flags::DOUBLE_UNDERLINE);
},
+ Attr::Undercurl => {
+ cursor.template.flags.remove(Flags::UNDERLINE);
+ cursor.template.flags.remove(Flags::DOUBLE_UNDERLINE);
+ cursor.template.flags.insert(Flags::UNDERCURL);
+ },
Attr::CancelUnderline => {
- cursor.template.flags.remove(Flags::UNDERLINE | Flags::DOUBLE_UNDERLINE);
+ cursor.template.flags.remove(
+ Flags::UNDERLINE | Flags::DOUBLE_UNDERLINE | Flags::UNDERCURL);
},
Attr::Hidden => cursor.template.flags.insert(Flags::HIDDEN),
Attr::CancelHidden => cursor.template.flags.remove(Flags::HIDDEN),