gpui: Use DWM API for backdrop effects and add Mica/Mica Alt support (#41842)

This PR updates window background rendering to use the **official DWM
backdrop API** (`DwmSetWindowAttribute`) instead of the legacy
`SetWindowCompositionAttribute`.
It also adds **Mica** and **Mica Alt** options to
`WindowBackgroundAppearance` for native Windows 11 effects.

### Motivation

Enables modern, stable, and GPU-accelerated backdrops consistent with
Windows 11’s Fluent Design.
Removes reliance on undocumented APIs while maintaining backward
compatibility with older Windows versions.

### Changes

* Added `MicaBackdrop` and `MicaAltBackdrop` variants.
* Switched to DWM API for applying backdrop effects.
* Verified fallback behavior on Windows 10.

### Release Notes:

- Added `WindowBackgroundAppearance::MicaBackdrop` and
`WindowBackgroundAppearance::MicaAltBackdrop` for Windows 11 Mica and
Mica Alt window backdrops.

### Screenshots

- `WindowBackgroundAppearance::Blurred`
<img width="553" height="354" alt="image"
src="https://github.com/user-attachments/assets/57c9c25d-9412-4141-94b5-00000cc0b1ec"
/>

- `WindowBackgroundAppearance::MicaBackdrop`
<img width="553" height="354" alt="image"
src="https://github.com/user-attachments/assets/019f541c-3335-4c9e-b026-71f5a1786534"
/>

- `WindowBackgroundAppearance::MicaAltBackdrop`
<img width="553" height="354" alt="image"
src="https://github.com/user-attachments/assets/5128d600-c94d-4c89-b81a-8b842fe1337a"
/>

---------

Co-authored-by: John Tur <john-tur@outlook.com>
This commit is contained in:
Barani S
2025-11-18 18:20:32 -05:00
committed by GitHub
co-authored by John Tur
parent 951132fc13
commit 917148c5ce
2 changed files with 40 additions and 4 deletions
+4
View File
@@ -1389,6 +1389,10 @@ pub enum WindowBackgroundAppearance {
///
/// Not always supported.
Blurred,
/// The Mica backdrop material, supported on Windows 11.
MicaBackdrop,
/// The Mica Alt backdrop material, supported on Windows 11.
MicaAltBackdrop,
}
/// The options that can be configured for a file dialog prompt
+36 -4
View File
@@ -18,6 +18,7 @@ use smallvec::SmallVec;
use windows::{
Win32::{
Foundation::*,
Graphics::Dwm::*,
Graphics::Gdi::*,
System::{Com::*, LibraryLoader::*, Ole::*, SystemServices::*},
UI::{Controls::*, HiDpi::*, Input::KeyboardAndMouse::*, Shell::*, WindowsAndMessaging::*},
@@ -773,20 +774,26 @@ impl PlatformWindow for WindowsWindow {
fn set_background_appearance(&self, background_appearance: WindowBackgroundAppearance) {
let hwnd = self.0.hwnd;
// using Dwm APIs for Mica and MicaAlt backdrops.
// others follow the set_window_composition_attribute approach
match background_appearance {
WindowBackgroundAppearance::Opaque => {
// ACCENT_DISABLED
set_window_composition_attribute(hwnd, None, 0);
}
WindowBackgroundAppearance::Transparent => {
// Use ACCENT_ENABLE_TRANSPARENTGRADIENT for transparent background
set_window_composition_attribute(hwnd, None, 2);
}
WindowBackgroundAppearance::Blurred => {
// Enable acrylic blur
// ACCENT_ENABLE_ACRYLICBLURBEHIND
set_window_composition_attribute(hwnd, Some((0, 0, 0, 0)), 4);
}
WindowBackgroundAppearance::MicaBackdrop => {
// DWMSBT_MAINWINDOW => MicaBase
dwm_set_window_composition_attribute(hwnd, 2);
}
WindowBackgroundAppearance::MicaAltBackdrop => {
// DWMSBT_TABBEDWINDOW => MicaAlt
dwm_set_window_composition_attribute(hwnd, 4);
}
}
}
@@ -1330,9 +1337,34 @@ fn retrieve_window_placement(
Ok(placement)
}
fn dwm_set_window_composition_attribute(hwnd: HWND, backdrop_type: u32) {
let mut version = unsafe { std::mem::zeroed() };
let status = unsafe { windows::Wdk::System::SystemServices::RtlGetVersion(&mut version) };
// DWMWA_SYSTEMBACKDROP_TYPE is available only on version 22621 or later
// using SetWindowCompositionAttributeType as a fallback
if !status.is_ok() || version.dwBuildNumber < 22621 {
return;
}
unsafe {
let result = DwmSetWindowAttribute(
hwnd,
DWMWA_SYSTEMBACKDROP_TYPE,
&backdrop_type as *const _ as *const _,
std::mem::size_of_val(&backdrop_type) as u32,
);
if !result.is_ok() {
return;
}
}
}
fn set_window_composition_attribute(hwnd: HWND, color: Option<Color>, state: u32) {
let mut version = unsafe { std::mem::zeroed() };
let status = unsafe { windows::Wdk::System::SystemServices::RtlGetVersion(&mut version) };
if !status.is_ok() || version.dwBuildNumber < 17763 {
return;
}