diff options
author | Josh Rahm <rahm@google.com> | 2021-09-15 00:12:07 -0600 |
---|---|---|
committer | Josh Rahm <rahm@google.com> | 2021-09-15 00:12:07 -0600 |
commit | d2b578e011d62311125033d895060986a96d3c88 (patch) | |
tree | 00df698df2700c2a752f37a23858d1ce2a8c0a88 | |
parent | 990f3f81f064f572aa0e6a528cfb3eb5215b88a4 (diff) | |
download | r-alacritty-d2b578e011d62311125033d895060986a96d3c88.tar.gz r-alacritty-d2b578e011d62311125033d895060986a96d3c88.tar.bz2 r-alacritty-d2b578e011d62311125033d895060986a96d3c88.zip |
Added a rudimentary undercurl to Alacritty. Currently does not support setting the color. That is the next task
-rw-r--r-- | alacritty/src/display/content.rs | 2 | ||||
-rw-r--r-- | alacritty/src/renderer/rects.rs | 98 | ||||
-rw-r--r-- | alacritty_terminal/src/ansi.rs | 13 | ||||
-rw-r--r-- | alacritty_terminal/src/config/mod.rs | 2 | ||||
-rw-r--r-- | alacritty_terminal/src/term/cell.rs | 2 | ||||
-rw-r--r-- | alacritty_terminal/src/term/mod.rs | 10 |
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), |