1#![allow(clippy::deprecated_semver)]
25
26mod macos;
27mod windows;
28
29pub use macos::{NSVisualEffectMaterial, NSVisualEffectState};
30
31#[cfg(target_os = "macos")]
32pub use macos::NSVisualEffectViewTagged;
33
34pub type Color = (u8, u8, u8, u8);
36
37pub fn apply_blur(
51 window: impl raw_window_handle::HasWindowHandle,
52 #[allow(unused)] color: Option<Color>,
53) -> Result<(), Error> {
54 match window.window_handle()?.as_raw() {
55 #[cfg(target_os = "windows")]
56 raw_window_handle::RawWindowHandle::Win32(handle) => {
57 windows::apply_blur(handle.hwnd.get() as _, color)
58 }
59 _ => Err(Error::UnsupportedPlatform(
60 "\"apply_blur()\" is only supported on Windows.",
61 )),
62 }
63}
64
65pub fn clear_blur(window: impl raw_window_handle::HasWindowHandle) -> Result<(), Error> {
71 match window.window_handle()?.as_raw() {
72 #[cfg(target_os = "windows")]
73 raw_window_handle::RawWindowHandle::Win32(handle) => {
74 windows::clear_blur(handle.hwnd.get() as _)
75 }
76 _ => Err(Error::UnsupportedPlatform(
77 "\"clear_blur()\" is only supported on Windows.",
78 )),
79 }
80}
81
82pub fn apply_acrylic(
96 window: impl raw_window_handle::HasWindowHandle,
97 #[allow(unused)] color: Option<Color>,
98) -> Result<(), Error> {
99 match window.window_handle()?.as_raw() {
100 #[cfg(target_os = "windows")]
101 raw_window_handle::RawWindowHandle::Win32(handle) => {
102 windows::apply_acrylic(handle.hwnd.get() as _, color)
103 }
104 _ => Err(Error::UnsupportedPlatform(
105 "\"apply_acrylic()\" is only supported on Windows.",
106 )),
107 }
108}
109
110pub fn clear_acrylic(window: impl raw_window_handle::HasWindowHandle) -> Result<(), Error> {
116 match window.window_handle()?.as_raw() {
117 #[cfg(target_os = "windows")]
118 raw_window_handle::RawWindowHandle::Win32(handle) => {
119 windows::clear_acrylic(handle.hwnd.get() as _)
120 }
121 _ => Err(Error::UnsupportedPlatform(
122 "\"clear_acrylic()\" is only supported on Windows.",
123 )),
124 }
125}
126
127pub fn apply_mica(
137 window: impl raw_window_handle::HasWindowHandle,
138 dark: Option<bool>,
139) -> Result<(), Error> {
140 #[cfg(not(target_os = "windows"))]
141 let _ = dark;
142 match window.window_handle()?.as_raw() {
143 #[cfg(target_os = "windows")]
144 raw_window_handle::RawWindowHandle::Win32(handle) => {
145 windows::apply_mica(handle.hwnd.get() as _, dark)
146 }
147 _ => Err(Error::UnsupportedPlatform(
148 "\"apply_mica()\" is only supported on Windows.",
149 )),
150 }
151}
152
153pub fn clear_mica(window: impl raw_window_handle::HasWindowHandle) -> Result<(), Error> {
159 match window.window_handle()?.as_raw() {
160 #[cfg(target_os = "windows")]
161 raw_window_handle::RawWindowHandle::Win32(handle) => {
162 windows::clear_mica(handle.hwnd.get() as _)
163 }
164 _ => Err(Error::UnsupportedPlatform(
165 "\"clear_mica()\" is only supported on Windows.",
166 )),
167 }
168}
169
170pub fn apply_tabbed(
180 window: impl raw_window_handle::HasWindowHandle,
181 dark: Option<bool>,
182) -> Result<(), Error> {
183 #[cfg(not(target_os = "windows"))]
184 let _ = dark;
185 match window.window_handle()?.as_raw() {
186 #[cfg(target_os = "windows")]
187 raw_window_handle::RawWindowHandle::Win32(handle) => {
188 windows::apply_tabbed(handle.hwnd.get() as _, dark)
189 }
190 _ => Err(Error::UnsupportedPlatform(
191 "\"apply_tabbed()\" is only supported on Windows.",
192 )),
193 }
194}
195
196pub fn clear_tabbed(window: impl raw_window_handle::HasWindowHandle) -> Result<(), Error> {
202 match window.window_handle()?.as_raw() {
203 #[cfg(target_os = "windows")]
204 raw_window_handle::RawWindowHandle::Win32(handle) => {
205 windows::clear_tabbed(handle.hwnd.get() as _)
206 }
207 _ => Err(Error::UnsupportedPlatform(
208 "\"clear_tabbed()\" is only supported on Windows.",
209 )),
210 }
211}
212
213pub fn apply_vibrancy(
219 window: impl raw_window_handle::HasWindowHandle,
220 #[allow(unused)] effect: NSVisualEffectMaterial,
221 #[allow(unused)] state: Option<NSVisualEffectState>,
222 #[allow(unused)] radius: Option<f64>,
223) -> Result<(), Error> {
224 match window.window_handle()?.as_raw() {
225 #[cfg(target_os = "macos")]
226 raw_window_handle::RawWindowHandle::AppKit(handle) => unsafe {
227 macos::apply_vibrancy(handle.ns_view, effect, state, radius)
228 },
229 _ => Err(Error::UnsupportedPlatform(
230 "\"apply_vibrancy()\" is only supported on macOS.",
231 )),
232 }
233}
234
235pub fn clear_vibrancy(window: impl raw_window_handle::HasWindowHandle) -> Result<bool, Error> {
246 match window.window_handle()?.as_raw() {
247 #[cfg(target_os = "macos")]
248 raw_window_handle::RawWindowHandle::AppKit(handle) => unsafe {
249 macos::clear_vibrancy(handle.ns_view)
250 },
251 _ => Err(Error::UnsupportedPlatform(
252 "\"clear_vibrancy()\" is only supported on macOS.",
253 )),
254 }
255}
256
257#[derive(Debug)]
258pub enum Error {
259 UnsupportedPlatform(&'static str),
260 UnsupportedPlatformVersion(&'static str),
261 NotMainThread(&'static str),
262 NoWindowHandle(raw_window_handle::HandleError),
263}
264
265impl std::fmt::Display for Error {
266 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
267 match self {
268 Error::UnsupportedPlatform(e)
269 | Error::UnsupportedPlatformVersion(e)
270 | Error::NotMainThread(e) => {
271 write!(f, "{}", e)
272 }
273 Error::NoWindowHandle(e) => {
274 write!(f, "{}", e)
275 }
276 }
277 }
278}
279
280impl std::error::Error for Error {}
281
282impl From<raw_window_handle::HandleError> for Error {
283 fn from(err: raw_window_handle::HandleError) -> Self {
284 Error::NoWindowHandle(err)
285 }
286}