1
1
mirror of https://github.com/wez/wezterm.git synced 2024-11-27 12:23:46 +03:00

gui: allow specifying colors for copy mode and quickselect

refs: https://github.com/wez/wezterm/issues/2320

```lua
return {
  colors = {
    copy_mode_active_highlight_fg={Color="red"},
    copy_mode_active_highlight_bg={Color="blue"},
    copy_mode_inactive_highlight_fg={AnsiColor="Black"},
    copy_mode_inactive_highlight_bg={AnsiColor="White"},
    quick_select_label_fg={Color="white"},
    quick_select_label_bg={Color="blue"},
    quick_select_match_fg={Color="grey"},
    quick_select_match_bg={Color="skyblue"},
  }
}
```
This commit is contained in:
Wez Furlong 2022-07-28 17:54:07 -07:00
parent 718a021817
commit 7e3b35303c
3 changed files with 92 additions and 12 deletions

View File

@ -3,7 +3,8 @@ use luahelper::impl_lua_conversion_dynamic;
use std::convert::{TryFrom, TryInto}; use std::convert::{TryFrom, TryInto};
use std::str::FromStr; use std::str::FromStr;
use termwiz::cell::CellAttributes; use termwiz::cell::CellAttributes;
pub use termwiz::color::{ColorSpec, RgbColor, SrgbaTuple}; use termwiz::color::ColorSpec as TWColorSpec;
pub use termwiz::color::{AnsiColor, ColorAttribute, RgbColor, SrgbaTuple};
use wezterm_dynamic::{FromDynamic, ToDynamic}; use wezterm_dynamic::{FromDynamic, ToDynamic};
use wezterm_term::color::ColorPalette; use wezterm_term::color::ColorPalette;
@ -90,6 +91,39 @@ impl TryFrom<String> for RgbaColor {
} }
} }
#[derive(Debug, FromDynamic, ToDynamic, Clone, Copy, PartialEq, Eq)]
pub enum ColorSpec {
AnsiColor(AnsiColor),
Color(RgbaColor),
Default,
}
impl From<AnsiColor> for ColorSpec {
fn from(color: AnsiColor) -> ColorSpec {
Self::AnsiColor(color)
}
}
impl Into<ColorAttribute> for ColorSpec {
fn into(self) -> ColorAttribute {
match self {
Self::AnsiColor(c) => ColorAttribute::PaletteIndex(c.into()),
Self::Color(RgbaColor { color }) => ColorAttribute::TrueColorWithDefaultFallback(color),
Self::Default => ColorAttribute::Default,
}
}
}
impl Into<TWColorSpec> for ColorSpec {
fn into(self) -> TWColorSpec {
match self {
Self::AnsiColor(c) => c.into(),
Self::Color(RgbaColor { color }) => TWColorSpec::TrueColor(color),
Self::Default => TWColorSpec::Default,
}
}
}
#[derive(Default, Debug, Clone, PartialEq, FromDynamic, ToDynamic)] #[derive(Default, Debug, Clone, PartialEq, FromDynamic, ToDynamic)]
pub struct Palette { pub struct Palette {
/// The text color to use when the attributes are reset to default /// The text color to use when the attributes are reset to default
@ -124,6 +158,16 @@ pub struct Palette {
pub visual_bell: Option<RgbaColor>, pub visual_bell: Option<RgbaColor>,
/// The color to use for the cursor when a dead key or leader state is active /// The color to use for the cursor when a dead key or leader state is active
pub compose_cursor: Option<RgbaColor>, pub compose_cursor: Option<RgbaColor>,
pub copy_mode_active_highlight_fg: Option<ColorSpec>,
pub copy_mode_active_highlight_bg: Option<ColorSpec>,
pub copy_mode_inactive_highlight_fg: Option<ColorSpec>,
pub copy_mode_inactive_highlight_bg: Option<ColorSpec>,
pub quick_select_label_fg: Option<ColorSpec>,
pub quick_select_label_bg: Option<ColorSpec>,
pub quick_select_match_fg: Option<ColorSpec>,
pub quick_select_match_bg: Option<ColorSpec>,
} }
impl_lua_conversion_dynamic!(Palette); impl_lua_conversion_dynamic!(Palette);
@ -238,8 +282,8 @@ impl TabBarColor {
.set_underline(self.underline) .set_underline(self.underline)
.set_italic(self.italic) .set_italic(self.italic)
.set_strikethrough(self.strikethrough) .set_strikethrough(self.strikethrough)
.set_background(ColorSpec::TrueColor(*self.bg_color)) .set_background(TWColorSpec::TrueColor(*self.bg_color))
.set_foreground(ColorSpec::TrueColor(*self.fg_color)); .set_foreground(TWColorSpec::TrueColor(*self.fg_color));
attr attr
} }
} }

View File

@ -956,6 +956,9 @@ impl Pane for CopyOverlay {
let (top, mut lines) = self.delegate.get_lines(lines); let (top, mut lines) = self.delegate.get_lines(lines);
let config = config::configuration();
let colors = &config.resolved_palette;
// Process the lines; for the search row we want to render instead // Process the lines; for the search row we want to render instead
// the search UI. // the search UI.
// For rows with search results, we want to highlight the matching ranges // For rows with search results, we want to highlight the matching ranges
@ -994,13 +997,29 @@ impl Pane for CopyOverlay {
{ {
if Some(m.result_index) == renderer.result_pos { if Some(m.result_index) == renderer.result_pos {
cell.attrs_mut() cell.attrs_mut()
.set_background(AnsiColor::Yellow) .set_background(
.set_foreground(AnsiColor::Black) colors
.copy_mode_active_highlight_bg
.unwrap_or(AnsiColor::Yellow.into()),
)
.set_foreground(
colors
.copy_mode_active_highlight_fg
.unwrap_or(AnsiColor::Black.into()),
)
.set_reverse(false); .set_reverse(false);
} else { } else {
cell.attrs_mut() cell.attrs_mut()
.set_background(AnsiColor::Fuchsia) .set_background(
.set_foreground(AnsiColor::Black) colors
.copy_mode_inactive_highlight_bg
.unwrap_or(AnsiColor::Fuchsia.into()),
)
.set_foreground(
colors
.copy_mode_inactive_highlight_fg
.unwrap_or(AnsiColor::Black.into()),
)
.set_reverse(false); .set_reverse(false);
} }
} }

View File

@ -458,6 +458,7 @@ impl Pane for QuickSelectOverlay {
let dims = self.get_dimensions(); let dims = self.get_dimensions();
let (top, mut lines) = self.delegate.get_lines(lines); let (top, mut lines) = self.delegate.get_lines(lines);
let colors = renderer.config.resolved_palette.clone();
// Process the lines; for the search row we want to render instead // Process the lines; for the search row we want to render instead
// the search UI. // the search UI.
@ -492,8 +493,16 @@ impl Pane for QuickSelectOverlay {
if let Some(cell) = line.cells_mut_for_attr_changes_only().get_mut(cell_idx) if let Some(cell) = line.cells_mut_for_attr_changes_only().get_mut(cell_idx)
{ {
cell.attrs_mut() cell.attrs_mut()
.set_background(AnsiColor::Black) .set_background(
.set_foreground(AnsiColor::Green) colors
.quick_select_match_bg
.unwrap_or(AnsiColor::Black.into()),
)
.set_foreground(
colors
.quick_select_match_fg
.unwrap_or(AnsiColor::Green.into()),
)
.set_reverse(false); .set_reverse(false);
} }
} }
@ -502,9 +511,17 @@ impl Pane for QuickSelectOverlay {
.get_cell(idx) .get_cell(idx)
.map(|cell| cell.attrs().clone()) .map(|cell| cell.attrs().clone())
.unwrap_or_else(|| CellAttributes::default()); .unwrap_or_else(|| CellAttributes::default());
attr.set_background(AnsiColor::Black) attr.set_background(
.set_foreground(AnsiColor::Olive) colors
.set_reverse(false); .quick_select_label_bg
.unwrap_or(AnsiColor::Black.into()),
)
.set_foreground(
colors
.quick_select_label_fg
.unwrap_or(AnsiColor::Olive.into()),
)
.set_reverse(false);
line.set_cell(m.range.start + idx, Cell::new(c, attr), SEQ_ZERO); line.set_cell(m.range.start + idx, Cell::new(c, attr), SEQ_ZERO);
} }
} }