Fix cursor inversion logic

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 #4564.
Fixes #5550.
This commit is contained in:
Christian Duerr 2021-10-22 06:33:34 +00:00 committed by GitHub
parent f90dd12efd
commit d8a98f8829
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 14 additions and 12 deletions

View file

@ -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

View file

@ -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),