aboutsummaryrefslogtreecommitdiff
path: root/alacritty/src/display/wayland_theme.rs
diff options
context:
space:
mode:
Diffstat (limited to 'alacritty/src/display/wayland_theme.rs')
-rw-r--r--alacritty/src/display/wayland_theme.rs81
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 }
+ }
+}