1#![allow(clippy::deprecated_semver)]
25
26mod macos;
27mod windows;
28
29pub use macos::{NSGlassEffectViewStyle, NSVisualEffectMaterial, NSVisualEffectState};
30
31#[cfg(target_os = "macos")]
32pub use macos::{NSGlassEffectViewTagged, 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#[cfg(target_os = "macos")]
272pub fn apply_liquid_glass(
273 window: impl raw_window_handle::HasWindowHandle,
274 #[allow(unused)] style: NSGlassEffectViewStyle,
275 #[allow(unused)] tint_color: Option<Color>,
276 #[allow(unused)] radius: Option<f64>,
277) -> Result<(), Error> {
278 match window.window_handle()?.as_raw() {
279 #[cfg(target_os = "macos")]
280 raw_window_handle::RawWindowHandle::AppKit(handle) => unsafe {
281 macos::apply_liquid_glass(handle.ns_view, style, tint_color, radius)
282 },
283 _ => Err(Error::UnsupportedPlatform(
284 "\"apply_vibrancy()\" is only supported on macOS.",
285 )),
286 }
287}
288
289#[cfg(target_os = "macos")]
300pub fn clear_liquid_glass(window: impl raw_window_handle::HasWindowHandle) -> Result<bool, Error> {
301 match window.window_handle()?.as_raw() {
302 #[cfg(target_os = "macos")]
303 raw_window_handle::RawWindowHandle::AppKit(handle) => unsafe {
304 macos::clear_liquid_glass(handle.ns_view)
305 },
306 _ => Err(Error::UnsupportedPlatform(
307 "\"clear_liquid_glass()\" is only supported on macOS.",
308 )),
309 }
310}
311
312#[derive(Debug)]
313pub enum Error {
314 UnsupportedPlatform(&'static str),
315 UnsupportedPlatformVersion(&'static str),
316 NotMainThread(&'static str),
317 NoWindowHandle(raw_window_handle::HandleError),
318}
319
320impl std::fmt::Display for Error {
321 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
322 match self {
323 Error::UnsupportedPlatform(e)
324 | Error::UnsupportedPlatformVersion(e)
325 | Error::NotMainThread(e) => {
326 write!(f, "{}", e)
327 }
328 Error::NoWindowHandle(e) => {
329 write!(f, "{}", e)
330 }
331 }
332 }
333}
334
335impl std::error::Error for Error {}
336
337impl From<raw_window_handle::HandleError> for Error {
338 fn from(err: raw_window_handle::HandleError) -> Self {
339 Error::NoWindowHandle(err)
340 }
341}