From 6343059bc0165c87930912c80e831d1f235a7591 Mon Sep 17 00:00:00 2001 From: Jim Porter <826865+jimporter@users.noreply.github.com> Date: Wed, 14 Oct 2020 03:23:34 -0700 Subject: [PATCH] Fix Windows transparency behavior to support fully-opaque regions (#1621) This patch removes an unneeded workaround for transparent windows on the Windows platform. In addition, it simplifies a couple of related API calls: * Remove the `CreateRectRgn` call, since we want the entire window's region to have blur behind it, and `DwnEnableBlurBehindWindow` does that by default. * Remove the `color_key` for `SetLayeredWindowAttributes`, since it's not used (we're not passing `winuser::LWA_COLORKEY` to the flags). --- CHANGELOG.md | 1 + src/platform_impl/windows/window.rs | 23 ++++------------------- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ffc58f6a..c360b614 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ # Unreleased - On Android, calling `WindowEvent::Focused` now works properly instead of always returning false. +- On Windows, fix bug preventing windows with transparency enabled from having fully-opaque regions. # 0.23.0 (2020-10-02) diff --git a/src/platform_impl/windows/window.rs b/src/platform_impl/windows/window.rs index 6253c943..bd2362fa 100644 --- a/src/platform_impl/windows/window.rs +++ b/src/platform_impl/windows/window.rs @@ -23,7 +23,6 @@ use winapi::{ ole2, oleidl::LPDROPTARGET, shobjidl_core::{CLSID_TaskbarList, ITaskbarList2}, - wingdi::{CreateRectRgn, DeleteObject}, winnt::LPCWSTR, winuser, }, @@ -708,33 +707,19 @@ unsafe fn init( // making the window transparent if attributes.transparent && !pl_attribs.no_redirection_bitmap { - let region = CreateRectRgn(0, 0, -1, -1); // makes the window transparent - let bb = dwmapi::DWM_BLURBEHIND { - dwFlags: dwmapi::DWM_BB_ENABLE | dwmapi::DWM_BB_BLURREGION, + dwFlags: dwmapi::DWM_BB_ENABLE, fEnable: 1, - hRgnBlur: region, + hRgnBlur: ptr::null_mut(), fTransitionOnMaximized: 0, }; dwmapi::DwmEnableBlurBehindWindow(real_window.0, &bb); - DeleteObject(region as _); if attributes.decorations { - // HACK: When opaque (opacity 255), there is a trail whenever - // the transparent window is moved. By reducing it to 254, - // the window is rendered properly. - let opacity = 254; + let opacity = 255; - // The color key can be any value except for black (0x0). - let color_key = 0x0030c100; - - winuser::SetLayeredWindowAttributes( - real_window.0, - color_key, - opacity, - winuser::LWA_ALPHA, - ); + winuser::SetLayeredWindowAttributes(real_window.0, 0, opacity, winuser::LWA_ALPHA); } }