1pub use tiny_skia::Color;
2use tiny_skia::{Paint, Shader};
3
4// https://gitlab.gnome.org/GNOME/gtk/-/blob/1bf88f1d81043fd99740e2f91e56ade7ede7303b/gtk/gtkwindow.c#L165
5pub(crate) const RESIZE_HANDLE_SIZE: u32 = 12;
6// https://gitlab.gnome.org/GNOME/gtk/-/blob/1bf88f1d81043fd99740e2f91e56ade7ede7303b/gtk/gtkwindow.c#L166
7pub(crate) const RESIZE_HANDLE_CORNER_SIZE: u32 = 24;
8pub(crate) const BORDER_SIZE: u32 = crate::shadow::SHADOW_SIZE + VISIBLE_BORDER_SIZE;
9pub(crate) const HEADER_SIZE: u32 = 35;
10pub(crate) const CORNER_RADIUS: u32 = 10;
11pub(crate) const VISIBLE_BORDER_SIZE: u32 = 1;
12
13/// The color theme to use with the decorations frame.
14#[derive(Debug, Clone)]
15pub struct ColorTheme {
16 pub active: ColorMap,
17 pub inactive: ColorMap,
18}
19
20impl ColorTheme {
21 /// Automatically choose between light & dark themes based on:
22 /// * dbus org.freedesktop.portal.Settings
23 /// <https://flatpak.github.io/xdg-desktop-portal/#gdbus-interface-org-freedesktop-portal-Settings>
24 pub fn auto() -> Self {
25 match crate::config::prefer_dark() {
26 true => Self::dark(),
27 false => Self::light(),
28 }
29 }
30
31 /// Predefined light variant, which aims to replecate Adwaita theme.
32 pub fn light() -> Self {
33 Self {
34 active: ColorMap {
35 headerbar: Color::from_rgba8(235, 235, 235, 255),
36 button_idle: Color::from_rgba8(216, 216, 216, 255),
37 button_hover: Color::from_rgba8(207, 207, 207, 255),
38 button_icon: Color::from_rgba8(42, 42, 42, 255),
39 border_color: Color::from_rgba8(220, 220, 220, 255),
40 font_color: Color::from_rgba8(47, 47, 47, 255),
41 },
42 inactive: ColorMap {
43 headerbar: Color::from_rgba8(250, 250, 250, 255),
44 button_idle: Color::from_rgba8(240, 240, 240, 255),
45 button_hover: Color::from_rgba8(216, 216, 216, 255),
46 button_icon: Color::from_rgba8(148, 148, 148, 255),
47 border_color: Color::from_rgba8(220, 220, 220, 255),
48 font_color: Color::from_rgba8(150, 150, 150, 255),
49 },
50 }
51 }
52
53 /// Predefined dark variant, which aims to replecate Adwaita-dark theme.
54 pub fn dark() -> Self {
55 Self {
56 active: ColorMap {
57 headerbar: Color::from_rgba8(48, 48, 48, 255),
58 button_idle: Color::from_rgba8(69, 69, 69, 255),
59 button_hover: Color::from_rgba8(79, 79, 79, 255),
60 button_icon: Color::from_rgba8(255, 255, 255, 255),
61 border_color: Color::from_rgba8(58, 58, 58, 255),
62 font_color: Color::from_rgba8(255, 255, 255, 255),
63 },
64 inactive: ColorMap {
65 headerbar: Color::from_rgba8(36, 36, 36, 255),
66 button_idle: Color::from_rgba8(47, 47, 47, 255),
67 button_hover: Color::from_rgba8(57, 57, 57, 255),
68 button_icon: Color::from_rgba8(144, 144, 144, 255),
69 border_color: Color::from_rgba8(58, 58, 58, 255),
70 font_color: Color::from_rgba8(144, 144, 144, 255),
71 },
72 }
73 }
74
75 pub(crate) fn for_state(&self, active: bool) -> &ColorMap {
76 if active {
77 &self.active
78 } else {
79 &self.inactive
80 }
81 }
82}
83
84impl Default for ColorTheme {
85 fn default() -> Self {
86 Self::auto()
87 }
88}
89
90/// The color map for various decorcation parts.
91#[derive(Debug, Clone)]
92pub struct ColorMap {
93 pub headerbar: Color,
94 pub button_idle: Color,
95 pub button_hover: Color,
96 pub button_icon: Color,
97 pub border_color: Color,
98 pub font_color: Color,
99}
100
101impl ColorMap {
102 pub(crate) fn headerbar_paint(&self) -> Paint {
103 Paint {
104 shader: Shader::SolidColor(self.headerbar),
105 anti_alias: true,
106 ..Default::default()
107 }
108 }
109
110 pub(crate) fn button_idle_paint(&self) -> Paint {
111 Paint {
112 shader: Shader::SolidColor(self.button_idle),
113 anti_alias: true,
114 ..Default::default()
115 }
116 }
117
118 pub(crate) fn button_hover_paint(&self) -> Paint {
119 Paint {
120 shader: Shader::SolidColor(self.button_hover),
121 anti_alias: true,
122 ..Default::default()
123 }
124 }
125
126 pub(crate) fn button_icon_paint(&self) -> Paint {
127 Paint {
128 shader: Shader::SolidColor(self.button_icon),
129 ..Default::default()
130 }
131 }
132
133 pub(crate) fn border_paint(&self) -> Paint {
134 Paint {
135 shader: Shader::SolidColor(self.border_color),
136 ..Default::default()
137 }
138 }
139}
140