mirror of
https://github.com/tauri-apps/tauri.git
synced 2024-11-28 20:48:52 +03:00
feat(core): add dark/light mica option (#7384)
* feat(core): add dark/light mica option * Update .changes/dark-light-mica-effect.md * fix macos build
This commit is contained in:
parent
fd5dc788d1
commit
74b1f4fc66
5
.changes/dark-light-mica-effect.md
Normal file
5
.changes/dark-light-mica-effect.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
'tauri-utils': 'patch:feat'
|
||||||
|
---
|
||||||
|
|
||||||
|
Add `WindowEffect::MicaDark` and `WindowEffect::MicaLight`
|
@ -771,12 +771,26 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "*Windows 11 Only**",
|
"description": "Mica effect that matches the system dark perefence **Windows 11 Only**",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"mica"
|
"mica"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "Mica effect with dark mode but only if dark mode is enabled on the system **Windows 11 Only**",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"micaDark"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Mica effect with light mode **Windows 11 Only**",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"micaLight"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"description": "**Windows 7/10/11(22H1) Only**\n\n## Notes\n\nThis effect has bad performance when resizing/dragging the window on Windows 11 build 22621.",
|
"description": "**Windows 7/10/11(22H1) Only**\n\n## Notes\n\nThis effect has bad performance when resizing/dragging the window on Windows 11 build 22621.",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
@ -2111,6 +2111,8 @@ mod build {
|
|||||||
WindowEffect::UnderWindowBackground => quote! { #prefix::UnderWindowBackground},
|
WindowEffect::UnderWindowBackground => quote! { #prefix::UnderWindowBackground},
|
||||||
WindowEffect::UnderPageBackground => quote! { #prefix::UnderPageBackground},
|
WindowEffect::UnderPageBackground => quote! { #prefix::UnderPageBackground},
|
||||||
WindowEffect::Mica => quote! { #prefix::Mica},
|
WindowEffect::Mica => quote! { #prefix::Mica},
|
||||||
|
WindowEffect::MicaDark => quote! { #prefix::MicaDark},
|
||||||
|
WindowEffect::MicaLight => quote! { #prefix::MicaLight},
|
||||||
WindowEffect::Blur => quote! { #prefix::Blur},
|
WindowEffect::Blur => quote! { #prefix::Blur},
|
||||||
WindowEffect::Acrylic => quote! { #prefix::Acrylic},
|
WindowEffect::Acrylic => quote! { #prefix::Acrylic},
|
||||||
})
|
})
|
||||||
|
@ -118,8 +118,12 @@ mod window_effects {
|
|||||||
UnderWindowBackground,
|
UnderWindowBackground,
|
||||||
/// **macOS 10.14+**
|
/// **macOS 10.14+**
|
||||||
UnderPageBackground,
|
UnderPageBackground,
|
||||||
/// **Windows 11 Only**
|
/// Mica effect that matches the system dark perefence **Windows 11 Only**
|
||||||
Mica,
|
Mica,
|
||||||
|
/// Mica effect with dark mode but only if dark mode is enabled on the system **Windows 11 Only**
|
||||||
|
MicaDark,
|
||||||
|
/// Mica effect with light mode **Windows 11 Only**
|
||||||
|
MicaLight,
|
||||||
/// **Windows 7/10/11(22H1) Only**
|
/// **Windows 7/10/11(22H1) Only**
|
||||||
///
|
///
|
||||||
/// ## Notes
|
/// ## Notes
|
||||||
|
@ -283,7 +283,7 @@ impl From<crate::window::Effect> for NSVisualEffectMaterial {
|
|||||||
Effect::ContentBackground => NSVisualEffectMaterial::ContentBackground,
|
Effect::ContentBackground => NSVisualEffectMaterial::ContentBackground,
|
||||||
Effect::UnderWindowBackground => NSVisualEffectMaterial::UnderWindowBackground,
|
Effect::UnderWindowBackground => NSVisualEffectMaterial::UnderWindowBackground,
|
||||||
Effect::UnderPageBackground => NSVisualEffectMaterial::UnderPageBackground,
|
Effect::UnderPageBackground => NSVisualEffectMaterial::UnderPageBackground,
|
||||||
Effect::Mica | Effect::Blur | Effect::Acrylic => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,9 @@ use std::ffi::c_void;
|
|||||||
use crate::utils::config::WindowEffectsConfig;
|
use crate::utils::config::WindowEffectsConfig;
|
||||||
use crate::window::{Color, Effect};
|
use crate::window::{Color, Effect};
|
||||||
use tauri_utils::platform::{get_function_impl, is_windows_7, windows_version};
|
use tauri_utils::platform::{get_function_impl, is_windows_7, windows_version};
|
||||||
use windows::Win32::Graphics::Dwm::{DwmSetWindowAttribute, DWMWINDOWATTRIBUTE};
|
use windows::Win32::Graphics::Dwm::{
|
||||||
|
DwmSetWindowAttribute, DWMWA_USE_IMMERSIVE_DARK_MODE, DWMWINDOWATTRIBUTE,
|
||||||
|
};
|
||||||
use windows::Win32::{
|
use windows::Win32::{
|
||||||
Foundation::{BOOL, HWND},
|
Foundation::{BOOL, HWND},
|
||||||
Graphics::{
|
Graphics::{
|
||||||
@ -23,10 +25,12 @@ use windows::Win32::{
|
|||||||
|
|
||||||
pub fn apply_effects(window: HWND, effects: WindowEffectsConfig) {
|
pub fn apply_effects(window: HWND, effects: WindowEffectsConfig) {
|
||||||
let WindowEffectsConfig { effects, color, .. } = effects;
|
let WindowEffectsConfig { effects, color, .. } = effects;
|
||||||
let effect = if let Some(effect) = effects
|
let effect = if let Some(effect) = effects.iter().find(|e| {
|
||||||
.iter()
|
matches!(
|
||||||
.find(|e| matches!(e, Effect::Mica | Effect::Acrylic | Effect::Blur))
|
e,
|
||||||
{
|
Effect::Mica | Effect::MicaDark | Effect::MicaLight | Effect::Acrylic | Effect::Blur
|
||||||
|
)
|
||||||
|
}) {
|
||||||
effect
|
effect
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
@ -35,7 +39,9 @@ pub fn apply_effects(window: HWND, effects: WindowEffectsConfig) {
|
|||||||
match effect {
|
match effect {
|
||||||
Effect::Blur => apply_blur(window, color),
|
Effect::Blur => apply_blur(window, color),
|
||||||
Effect::Acrylic => apply_acrylic(window, color),
|
Effect::Acrylic => apply_acrylic(window, color),
|
||||||
Effect::Mica => apply_mica(window),
|
Effect::Mica => apply_mica(window, None),
|
||||||
|
Effect::MicaDark => apply_mica(window, Some(true)),
|
||||||
|
Effect::MicaLight => apply_mica(window, Some(false)),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -114,7 +120,18 @@ pub fn clear_acrylic(hwnd: HWND) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn apply_mica(hwnd: HWND) {
|
pub fn apply_mica(hwnd: HWND, dark: Option<bool>) {
|
||||||
|
if let Some(dark) = dark {
|
||||||
|
unsafe {
|
||||||
|
DwmSetWindowAttribute(
|
||||||
|
hwnd,
|
||||||
|
DWMWA_USE_IMMERSIVE_DARK_MODE,
|
||||||
|
&(dark as u32) as *const _ as _,
|
||||||
|
4,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if is_backdroptype_supported() {
|
if is_backdroptype_supported() {
|
||||||
unsafe {
|
unsafe {
|
||||||
let _ = DwmSetWindowAttribute(
|
let _ = DwmSetWindowAttribute(
|
||||||
|
@ -771,12 +771,26 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "*Windows 11 Only**",
|
"description": "Mica effect that matches the system dark perefence **Windows 11 Only**",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
"enum": [
|
"enum": [
|
||||||
"mica"
|
"mica"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"description": "Mica effect with dark mode but only if dark mode is enabled on the system **Windows 11 Only**",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"micaDark"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Mica effect with light mode **Windows 11 Only**",
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"micaLight"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"description": "**Windows 7/10/11(22H1) Only**\n\n## Notes\n\nThis effect has bad performance when resizing/dragging the window on Windows 11 build 22621.",
|
"description": "**Windows 7/10/11(22H1) Only**\n\n## Notes\n\nThis effect has bad performance when resizing/dragging the window on Windows 11 build 22621.",
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
Loading…
Reference in New Issue
Block a user