yoda: attenuation des panneaux non focalises, a la Ghostty

Avec Claude Code et Modjo cote a cote, rien ne distinguait le panneau ou
l'on tape, hors le curseur creux. L'amont assombrissait le fond de 8 %
(aussi quand la fenetre perdait le focus) et l'a retire en juillet
(a43b5ae).

Reprise de unfocused-split-opacity de Ghostty : un voile de la couleur du
fond, texte compris, sur chaque panneau non focalise, seulement quand il y
en a plusieurs ; la perte de focus de la fenetre ne change rien.

- Config unfocused_pane_dim (pourcentage, defaut 30 = opacite 0,7 de
  Ghostty, 0 desactive, plafond 85 = opacite minimale 0,15 de Ghostty).
- Reglages > Panneaux : curseur « Attenuation des panneaux inactifs ».
- terminal_box : voile trace dans un calque a part en fin de rendu (dans
  le meme calque, la primitive de texte passerait par-dessus), aux coins
  du fond du panneau.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Lionel DARNIS 2026-10-01 13:40:47 +02:00
parent 52b37cc2f8
commit db9ee02d8d
5 changed files with 99 additions and 0 deletions

View file

@ -591,6 +591,7 @@ pub enum Message {
ShowHeaderBar(bool),
SshConnect(usize),
ShowPaneBorders(bool),
UnfocusedPaneDim(u8),
SyntaxTheme(ColorSchemeKind, usize),
SystemThemeChange,
@ -1729,6 +1730,15 @@ impl App {
.add(
widget::settings::item::builder(fl!("show-pane-borders"))
.toggler(self.config.show_pane_borders, Message::ShowPaneBorders),
)
.add(
widget::settings::item::builder(fl!("unfocused-pane-dim"))
.description(format!("{}%", self.config.unfocused_pane_dim))
.control(widget::slider(
0..=config::UNFOCUSED_PANE_DIM_MAX,
self.config.unfocused_pane_dim,
Message::UnfocusedPaneDim,
)),
);
let advanced_section = widget::settings::section()
@ -3371,6 +3381,12 @@ impl Application for App {
config_set!(show_pane_borders, show_pane_borders);
}
}
Message::UnfocusedPaneDim(dim) => {
config_set!(
unfocused_pane_dim,
cmp::min(config::UNFOCUSED_PANE_DIM_MAX, dim)
);
}
Message::UseBrightBold(use_bright_bold) => {
if use_bright_bold != self.config.use_bright_bold {
config_set!(use_bright_bold, use_bright_bold);
@ -4247,6 +4263,15 @@ impl Application for App {
terminal_box = terminal_box.on_mouse_enter(move || Message::MouseEnter(pane));
}
// [yoda] Voile sur les panneaux non focalisés (à la Ghostty), seulement
// quand il y en a plusieurs : on voit d'un coup d'œil où l'on tape.
if let Some(dim) = self.config.unfocused_pane_dim_ratio()
&& self.pane_model.panes.panes.len() > 1
&& pane != self.pane_model.focused()
{
terminal_box = terminal_box.dim(dim);
}
// The terminal records what was under the right press; the widget opens the
// menu on release, so build it from that state
let context_link = terminal