Automatically adjust ANSI color contrast (#34033)
Closes #33253 in a way that doesn't regress #32175 - namely, automatically adjusts the contrast between the foreground and background text in the terminal such that it's above a certain threshold. The threshold is configurable in settings, and can be set to 0 to turn off this feature and use exactly the colors the theme specifies even if they are illegible. ## One Light Theme Before <img width="220" alt="Screenshot 2025-07-07 at 6 00 47 PM" src="https://github.com/user-attachments/assets/096754a6-f79f-4fea-a86e-cb7b8ff45d60" /> (Last row is highlighted because otherwise the text is unreadable; the foreground and background are the same color.) ## One Light Theme After (This is with the new default contrast adjustment setting.) <img width="215" alt="Screenshot 2025-07-07 at 6 22 02 PM" src="https://github.com/user-attachments/assets/b082fefe-76f5-4231-b704-ff387983a3cb" /> This approach was inspired by @mitchellh's use of automatic contrast adjustment in [Ghostty](https://ghostty.org/) - thanks, Mitchell! The main difference is that we're using APCA's formula instead of WCAG for [these reasons](https://khan-tw.medium.com/wcag2-are-you-still-using-it-ui-contrast-visibility-standard-readability-contrast-f34eb73e89ee). Release Notes: - Added automatic dynamic contrast adjustment for terminal foreground and background colors
This commit is contained in:
parent
877ef5e1b1
commit
9b7632d5f6
6 changed files with 669 additions and 8 deletions
|
@ -25,6 +25,7 @@ use alacritty_terminal::{
|
|||
use gpui::{Bounds, ClipboardItem, Entity, FontStyle, TextStyle, WhiteSpace, canvas, size};
|
||||
use language::Buffer;
|
||||
use settings::Settings as _;
|
||||
use terminal::terminal_settings::TerminalSettings;
|
||||
use terminal_view::terminal_element::TerminalElement;
|
||||
use theme::ThemeSettings;
|
||||
use ui::{IntoElement, prelude::*};
|
||||
|
@ -257,8 +258,17 @@ impl Render for TerminalOutput {
|
|||
point: ic.point,
|
||||
cell: ic.cell.clone(),
|
||||
});
|
||||
let (cells, rects) =
|
||||
TerminalElement::layout_grid(grid, 0, &text_style, text_system, None, window, cx);
|
||||
let minimum_contrast = TerminalSettings::get_global(cx).minimum_contrast;
|
||||
let (cells, rects) = TerminalElement::layout_grid(
|
||||
grid,
|
||||
0,
|
||||
&text_style,
|
||||
text_system,
|
||||
None,
|
||||
minimum_contrast,
|
||||
window,
|
||||
cx,
|
||||
);
|
||||
|
||||
// lines are 0-indexed, so we must add 1 to get the number of lines
|
||||
let text_line_height = text_style.line_height_in_pixels(window.rem_size());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue