diff options
Diffstat (limited to 'alacritty/src/display/wayland_theme.rs')
-rw-r--r-- | alacritty/src/display/wayland_theme.rs | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/alacritty/src/display/wayland_theme.rs b/alacritty/src/display/wayland_theme.rs new file mode 100644 index 00000000..1932ae01 --- /dev/null +++ b/alacritty/src/display/wayland_theme.rs @@ -0,0 +1,81 @@ +use glutin::platform::unix::{ARGBColor, Button, ButtonState, Element, Theme as WaylandTheme}; + +use alacritty_terminal::term::color::Rgb; + +use crate::config::color::Colors; + +const INACTIVE_OPACITY: u8 = 127; + +#[derive(Debug, Clone)] +pub struct AlacrittyWaylandTheme { + pub background: ARGBColor, + pub foreground: ARGBColor, + pub dim_foreground: ARGBColor, + pub hovered_close_icon: ARGBColor, + pub hovered_maximize_icon: ARGBColor, + pub hovered_minimize_icon: ARGBColor, +} + +impl AlacrittyWaylandTheme { + pub fn new(colors: &Colors) -> Self { + let hovered_close_icon = colors.normal.red.into_rgba(); + let hovered_maximize_icon = colors.normal.green.into_rgba(); + let hovered_minimize_icon = colors.normal.yellow.into_rgba(); + let foreground = colors.search_bar_foreground().into_rgba(); + let background = colors.search_bar_background().into_rgba(); + + let mut dim_foreground = foreground; + dim_foreground.a = INACTIVE_OPACITY; + + Self { + foreground, + background, + dim_foreground, + hovered_close_icon, + hovered_minimize_icon, + hovered_maximize_icon, + } + } +} + +impl WaylandTheme for AlacrittyWaylandTheme { + fn element_color(&self, element: Element, window_active: bool) -> ARGBColor { + match element { + Element::Bar | Element::Separator => self.background, + Element::Text if window_active => self.foreground, + Element::Text => self.dim_foreground, + } + } + + fn button_color( + &self, + button: Button, + state: ButtonState, + foreground: bool, + window_active: bool, + ) -> ARGBColor { + if !foreground { + return ARGBColor { a: 0, r: 0, g: 0, b: 0 }; + } else if !window_active { + return self.dim_foreground; + } + + match (state, button) { + (ButtonState::Idle, _) => self.foreground, + (ButtonState::Disabled, _) => self.dim_foreground, + (_, Button::Minimize) => self.hovered_minimize_icon, + (_, Button::Maximize) => self.hovered_maximize_icon, + (_, Button::Close) => self.hovered_close_icon, + } + } +} + +trait IntoARGBColor { + fn into_rgba(self) -> ARGBColor; +} + +impl IntoARGBColor for Rgb { + fn into_rgba(self) -> ARGBColor { + ARGBColor { a: 0xff, r: self.r, g: self.g, b: self.b } + } +} |