diff options
author | Christian Duerr <contact@christianduerr.com> | 2020-08-12 16:05:22 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-12 19:05:22 +0300 |
commit | b904207b1979bb86f86c2a7db1720ce04571508a (patch) | |
tree | e0961c9f8c087f11ceb81061ebd468972a3d4cda /alacritty_terminal/src | |
parent | 96ea5c445ecc25a5b2d400b11f0ff843e9cbdd7a (diff) | |
download | alacritty-b904207b1979bb86f86c2a7db1720ce04571508a.tar.gz alacritty-b904207b1979bb86f86c2a7db1720ce04571508a.zip |
Add support for double underlines
This adds support for double underlines using the colon separated escape
sequence `CSI 4 : 2 m`.
Alacritty will now also always fallback to the normal underline in case
any of the other underlines like the undercurl are specified. The escape
sequence `CSI 4 : 0 m` can now be used to clear all underlines.
Some terminals support `CSI 21 m` for double underline, but since
Alacritty already uses that as cancel bold which is a little more
consistent, that behavior has not changed. So the colon separated
variant must be used.
Diffstat (limited to 'alacritty_terminal/src')
-rw-r--r-- | alacritty_terminal/src/ansi.rs | 8 | ||||
-rw-r--r-- | alacritty_terminal/src/term/cell.rs | 28 | ||||
-rw-r--r-- | alacritty_terminal/src/term/mod.rs | 15 |
3 files changed, 33 insertions, 18 deletions
diff --git a/alacritty_terminal/src/ansi.rs b/alacritty_terminal/src/ansi.rs index dd2012de..8f1cf07f 100644 --- a/alacritty_terminal/src/ansi.rs +++ b/alacritty_terminal/src/ansi.rs @@ -618,6 +618,8 @@ pub enum Attr { Italic, /// Underline text. Underline, + /// Underlined twice. + DoubleUnderline, /// Blink cursor slowly. BlinkSlow, /// Blink cursor fast. @@ -634,7 +636,7 @@ pub enum Attr { CancelBoldDim, /// Cancel italic. CancelItalic, - /// Cancel underline. + /// Cancel all underlines. CancelUnderline, /// Cancel blink. CancelBlink, @@ -1151,7 +1153,9 @@ fn attrs_from_sgr_parameters(params: &mut ParamsIter) -> Vec<Option<Attr>> { [1] => Some(Attr::Bold), [2] => Some(Attr::Dim), [3] => Some(Attr::Italic), - [4] => Some(Attr::Underline), + [4, 0] => Some(Attr::CancelUnderline), + [4, 2] => Some(Attr::DoubleUnderline), + [4, ..] => Some(Attr::Underline), [5] => Some(Attr::BlinkSlow), [6] => Some(Attr::BlinkFast), [7] => Some(Attr::Reverse), diff --git a/alacritty_terminal/src/term/cell.rs b/alacritty_terminal/src/term/cell.rs index 3fdd8cea..ee95fcba 100644 --- a/alacritty_terminal/src/term/cell.rs +++ b/alacritty_terminal/src/term/cell.rs @@ -12,19 +12,20 @@ pub const MAX_ZEROWIDTH_CHARS: usize = 5; bitflags! { #[derive(Serialize, Deserialize)] pub struct Flags: u16 { - const INVERSE = 0b000_0000_0001; - const BOLD = 0b000_0000_0010; - const ITALIC = 0b000_0000_0100; - const BOLD_ITALIC = 0b000_0000_0110; - const UNDERLINE = 0b000_0000_1000; - const WRAPLINE = 0b000_0001_0000; - const WIDE_CHAR = 0b000_0010_0000; - const WIDE_CHAR_SPACER = 0b000_0100_0000; - const DIM = 0b000_1000_0000; - const DIM_BOLD = 0b000_1000_0010; - const HIDDEN = 0b001_0000_0000; - const STRIKEOUT = 0b010_0000_0000; - const LEADING_WIDE_CHAR_SPACER = 0b100_0000_0000; + const INVERSE = 0b0000_0000_0000_0001; + const BOLD = 0b0000_0000_0000_0010; + const ITALIC = 0b0000_0000_0000_0100; + const BOLD_ITALIC = 0b0000_0000_0000_0110; + const UNDERLINE = 0b0000_0000_0000_1000; + const WRAPLINE = 0b0000_0000_0001_0000; + const WIDE_CHAR = 0b0000_0000_0010_0000; + const WIDE_CHAR_SPACER = 0b0000_0000_0100_0000; + const DIM = 0b0000_0000_1000_0000; + const DIM_BOLD = 0b0000_0000_1000_0010; + const HIDDEN = 0b0000_0001_0000_0000; + const STRIKEOUT = 0b0000_0010_0000_0000; + const LEADING_WIDE_CHAR_SPACER = 0b0000_0100_0000_0000; + const DOUBLE_UNDERLINE = 0b0000_1000_0000_0000; } } @@ -58,6 +59,7 @@ impl GridCell for Cell { && !self.flags.intersects( Flags::INVERSE | Flags::UNDERLINE + | Flags::DOUBLE_UNDERLINE | 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 7a409e2e..993e6918 100644 --- a/alacritty_terminal/src/term/mod.rs +++ b/alacritty_terminal/src/term/mod.rs @@ -311,7 +311,7 @@ impl RenderableCell { fn is_empty(&self) -> bool { self.bg_alpha == 0. - && !self.flags.intersects(Flags::UNDERLINE | Flags::STRIKEOUT) + && !self.flags.intersects(Flags::UNDERLINE | Flags::STRIKEOUT | Flags::DOUBLE_UNDERLINE) && self.inner == RenderableCellContent::Chars([' '; cell::MAX_ZEROWIDTH_CHARS + 1]) } @@ -2017,8 +2017,17 @@ impl<T: EventListener> Handler for Term<T> { Attr::CancelBoldDim => cursor.template.flags.remove(Flags::BOLD | Flags::DIM), Attr::Italic => cursor.template.flags.insert(Flags::ITALIC), Attr::CancelItalic => cursor.template.flags.remove(Flags::ITALIC), - Attr::Underline => cursor.template.flags.insert(Flags::UNDERLINE), - Attr::CancelUnderline => cursor.template.flags.remove(Flags::UNDERLINE), + Attr::Underline => { + cursor.template.flags.remove(Flags::DOUBLE_UNDERLINE); + cursor.template.flags.insert(Flags::UNDERLINE); + }, + Attr::DoubleUnderline => { + cursor.template.flags.remove(Flags::UNDERLINE); + cursor.template.flags.insert(Flags::DOUBLE_UNDERLINE); + }, + Attr::CancelUnderline => { + cursor.template.flags.remove(Flags::UNDERLINE | Flags::DOUBLE_UNDERLINE); + }, Attr::Hidden => cursor.template.flags.insert(Flags::HIDDEN), Attr::CancelHidden => cursor.template.flags.remove(Flags::HIDDEN), Attr::Strike => cursor.template.flags.insert(Flags::STRIKEOUT), |