From d7a0d87bd8b6bbe62822db6281394e761b793b31 Mon Sep 17 00:00:00 2001 From: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:28:19 +0000 Subject: [PATCH 1/2] fix(ui): keep selections visible without host colors refs #2708 --- docs/next/CHANGELOG.md | 1 + src/ui/panes.rs | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/docs/next/CHANGELOG.md b/docs/next/CHANGELOG.md index 428a973d3a..567a70e361 100644 --- a/docs/next/CHANGELOG.md +++ b/docs/next/CHANGELOG.md @@ -19,6 +19,7 @@ - Experimental pane graphics now support bounded named layers, acknowledged full-RGBA primary-layer direct file frames on audited local terminals, owned BGRA fallback, exact pixel mouse input, and placement-only resize replay. ### Fixed +- Text selections remain visible over Mosh and other terminals that do not report their background color. (#2708) - Prefix keybindings now disambiguate layout-aware shifted punctuation, so a shifted `\` no longer triggers `prefix+|` on keyboard layouts where the same key produces both characters. (#2674) - Remote clients now continue redrawing at very large terminal sizes instead of freezing when a full ANSI frame exceeds the transport limit. (#2670) - OpenCode panes now track the root conversation selected in their own TUI for native restore without adopting activity from attached clients. (#2450) diff --git a/src/ui/panes.rs b/src/ui/panes.rs index f20b55b588..6c07db61ab 100644 --- a/src/ui/panes.rs +++ b/src/ui/panes.rs @@ -875,8 +875,13 @@ fn automatic_selection_style( } fn automatic_selection_bg(p: &Palette, host_theme: crate::terminal_theme::TerminalTheme) -> Color { - let Some(background) = host_theme.background.map(terminal_theme_to_rgb) else { - return selection_palette_background(p); + let fallback = selection_palette_background(p); + let Some(background) = host_theme + .background + .map(terminal_theme_to_rgb) + .or_else(|| color_to_rgb(fallback)) + else { + return fallback; }; let target = if relative_luminance(background) < 0.5 { @@ -1604,4 +1609,19 @@ mod tests { }; assert!(relative_luminance((r, g, b)) > relative_luminance((12, 14, 16))); } + + #[test] + fn automatic_selection_background_contrasts_when_host_background_is_unknown() { + for panel_bg in [Color::Rgb(0x2d, 0x35, 0x3b), Color::Rgb(239, 241, 245)] { + let mut palette = Palette::catppuccin(); + palette.panel_bg = panel_bg; + + let selected = + automatic_selection_bg(&palette, crate::terminal_theme::TerminalTheme::default()); + let base_luminance = relative_luminance(color_to_rgb(panel_bg).unwrap()); + let selected_luminance = relative_luminance(color_to_rgb(selected).unwrap()); + + assert!((selected_luminance - base_luminance).abs() > 0.08); + } + } } From bb85fddacc61c5f6b2321e80978335a9eb2b1238 Mon Sep 17 00:00:00 2001 From: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Date: Wed, 12 Aug 2026 10:35:34 +0000 Subject: [PATCH 2/2] test(ui): strengthen selection fallback coverage refs #2708 --- src/ui/panes.rs | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/ui/panes.rs b/src/ui/panes.rs index 6c07db61ab..91c4b5abf6 100644 --- a/src/ui/panes.rs +++ b/src/ui/panes.rs @@ -1612,16 +1612,30 @@ mod tests { #[test] fn automatic_selection_background_contrasts_when_host_background_is_unknown() { - for panel_bg in [Color::Rgb(0x2d, 0x35, 0x3b), Color::Rgb(239, 241, 245)] { + for (panel_bg, should_lighten) in [ + (Color::Rgb(0x2d, 0x35, 0x3b), true), + (Color::Rgb(239, 241, 245), false), + ] { let mut palette = Palette::catppuccin(); palette.panel_bg = panel_bg; + let Color::Rgb(r, g, b) = panel_bg else { + unreachable!("test backgrounds are rgb"); + }; let selected = automatic_selection_bg(&palette, crate::terminal_theme::TerminalTheme::default()); - let base_luminance = relative_luminance(color_to_rgb(panel_bg).unwrap()); + let known_host_selected = automatic_selection_bg( + &palette, + crate::terminal_theme::TerminalTheme { + background: Some(crate::terminal_theme::RgbColor { r, g, b }), + ..Default::default() + }, + ); + let base_luminance = relative_luminance((r, g, b)); let selected_luminance = relative_luminance(color_to_rgb(selected).unwrap()); - assert!((selected_luminance - base_luminance).abs() > 0.08); + assert_eq!(selected, known_host_selected); + assert_eq!(selected_luminance > base_luminance, should_lighten); } } }