aboutsummaryrefslogtreecommitdiff
path: root/alacritty_terminal/src
diff options
context:
space:
mode:
authorChristian Duerr <contact@christianduerr.com>2020-08-12 16:05:22 +0000
committerGitHub <noreply@github.com>2020-08-12 19:05:22 +0300
commitb904207b1979bb86f86c2a7db1720ce04571508a (patch)
treee0961c9f8c087f11ceb81061ebd468972a3d4cda /alacritty_terminal/src
parent96ea5c445ecc25a5b2d400b11f0ff843e9cbdd7a (diff)
downloadalacritty-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.rs8
-rw-r--r--alacritty_terminal/src/term/cell.rs28
-rw-r--r--alacritty_terminal/src/term/mod.rs15
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),