Skip to content

Commit

Permalink
Fix cursor inversion logic
Browse files Browse the repository at this point in the history
The existing cursor inversion logic was causing more problems than it
solved, without solving the problem of invisible cursor when inverting a
cell with matching foreground and background colors.

This patch reworks this logic and only inverts the cursor when the
foreground and background colors of the cursor are similar and the
cursor colors aren't set to fixed RGB values.

Fixes alacritty#4564.
Fixes alacritty#5550.
  • Loading branch information
chrisduerr committed Oct 22, 2021
1 parent f90dd12 commit 053c02c
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 12 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

- Line indicator obstructing vi mode cursor when scrolled into history
- Vi mode search starting in the line below the vi cursor
- Invisible cursor with matching foreground/background colors

## 0.9.0

Expand Down
25 changes: 13 additions & 12 deletions alacritty/src/display/content.rs
Original file line number Diff line number Diff line change
Expand Up @@ -117,22 +117,23 @@ impl<'a> RenderableContent<'a> {
} else {
self.config.ui_config.colors.cursor
};
let mut cursor_color =
let cursor_color =
self.terminal_content.colors[NamedColor::Cursor].map_or(color.background, CellRgb::Rgb);
let mut text_color = color.foreground;
let text_color = color.foreground;

// Invert the cursor if it has a fixed background close to the cell's background.
if matches!(
cursor_color,
CellRgb::Rgb(color) if color.contrast(cell.bg) < MIN_CURSOR_CONTRAST
) {
cursor_color = CellRgb::CellForeground;
text_color = CellRgb::CellBackground;
}
let insufficient_contrast = (!matches!(cursor_color, CellRgb::Rgb(_))
|| !matches!(text_color, CellRgb::Rgb(_)))
&& cell.fg.contrast(cell.bg) < MIN_CURSOR_CONTRAST;

// Convert from cell colors to RGB.
let text_color = text_color.color(cell.fg, cell.bg);
let cursor_color = cursor_color.color(cell.fg, cell.bg);
let mut text_color = text_color.color(cell.fg, cell.bg);
let mut cursor_color = cursor_color.color(cell.fg, cell.bg);

// Invert cursor color with insufficient contrast to prevent invisible cursors.
if insufficient_contrast {
cursor_color = self.config.ui_config.colors.primary.foreground;
text_color = self.config.ui_config.colors.primary.background;
}

Some(RenderableCursor {
is_wide: cell.flags.contains(Flags::WIDE_CHAR),
Expand Down

0 comments on commit 053c02c

Please sign in to comment.