mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-04-24 09:38:32 +02:00
feat(borders): remove black pixels around direct2d corners
This commit is contained in:
@@ -15,11 +15,14 @@ use std::ops::Deref;
|
|||||||
use std::sync::atomic::Ordering;
|
use std::sync::atomic::Ordering;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
use std::sync::LazyLock;
|
use std::sync::LazyLock;
|
||||||
|
use std::time::Duration;
|
||||||
use windows::Foundation::Numerics::Matrix3x2;
|
use windows::Foundation::Numerics::Matrix3x2;
|
||||||
use windows::Win32::Foundation::BOOL;
|
use windows::Win32::Foundation::BOOL;
|
||||||
|
use windows::Win32::Foundation::FALSE;
|
||||||
use windows::Win32::Foundation::HWND;
|
use windows::Win32::Foundation::HWND;
|
||||||
use windows::Win32::Foundation::LPARAM;
|
use windows::Win32::Foundation::LPARAM;
|
||||||
use windows::Win32::Foundation::LRESULT;
|
use windows::Win32::Foundation::LRESULT;
|
||||||
|
use windows::Win32::Foundation::TRUE;
|
||||||
use windows::Win32::Foundation::WPARAM;
|
use windows::Win32::Foundation::WPARAM;
|
||||||
use windows::Win32::Graphics::Direct2D::Common::D2D1_ALPHA_MODE_PREMULTIPLIED;
|
use windows::Win32::Graphics::Direct2D::Common::D2D1_ALPHA_MODE_PREMULTIPLIED;
|
||||||
use windows::Win32::Graphics::Direct2D::Common::D2D1_COLOR_F;
|
use windows::Win32::Graphics::Direct2D::Common::D2D1_COLOR_F;
|
||||||
@@ -36,17 +39,24 @@ use windows::Win32::Graphics::Direct2D::D2D1_PRESENT_OPTIONS_IMMEDIATELY;
|
|||||||
use windows::Win32::Graphics::Direct2D::D2D1_RENDER_TARGET_PROPERTIES;
|
use windows::Win32::Graphics::Direct2D::D2D1_RENDER_TARGET_PROPERTIES;
|
||||||
use windows::Win32::Graphics::Direct2D::D2D1_RENDER_TARGET_TYPE_DEFAULT;
|
use windows::Win32::Graphics::Direct2D::D2D1_RENDER_TARGET_TYPE_DEFAULT;
|
||||||
use windows::Win32::Graphics::Direct2D::D2D1_ROUNDED_RECT;
|
use windows::Win32::Graphics::Direct2D::D2D1_ROUNDED_RECT;
|
||||||
|
use windows::Win32::Graphics::Dwm::DwmEnableBlurBehindWindow;
|
||||||
|
use windows::Win32::Graphics::Dwm::DWM_BB_BLURREGION;
|
||||||
|
use windows::Win32::Graphics::Dwm::DWM_BB_ENABLE;
|
||||||
|
use windows::Win32::Graphics::Dwm::DWM_BLURBEHIND;
|
||||||
use windows::Win32::Graphics::Dxgi::Common::DXGI_FORMAT_UNKNOWN;
|
use windows::Win32::Graphics::Dxgi::Common::DXGI_FORMAT_UNKNOWN;
|
||||||
use windows::Win32::Graphics::Gdi::BeginPaint;
|
use windows::Win32::Graphics::Gdi::BeginPaint;
|
||||||
|
use windows::Win32::Graphics::Gdi::CreateRectRgn;
|
||||||
use windows::Win32::Graphics::Gdi::EndPaint;
|
use windows::Win32::Graphics::Gdi::EndPaint;
|
||||||
use windows::Win32::Graphics::Gdi::InvalidateRect;
|
use windows::Win32::Graphics::Gdi::InvalidateRect;
|
||||||
use windows::Win32::Graphics::Gdi::PAINTSTRUCT;
|
use windows::Win32::Graphics::Gdi::PAINTSTRUCT;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::DefWindowProcW;
|
use windows::Win32::UI::WindowsAndMessaging::DefWindowProcW;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::DispatchMessageW;
|
use windows::Win32::UI::WindowsAndMessaging::DispatchMessageW;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::GetMessageW;
|
use windows::Win32::UI::WindowsAndMessaging::GetMessageW;
|
||||||
|
use windows::Win32::UI::WindowsAndMessaging::GetSystemMetrics;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::PostQuitMessage;
|
use windows::Win32::UI::WindowsAndMessaging::PostQuitMessage;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::TranslateMessage;
|
use windows::Win32::UI::WindowsAndMessaging::TranslateMessage;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::MSG;
|
use windows::Win32::UI::WindowsAndMessaging::MSG;
|
||||||
|
use windows::Win32::UI::WindowsAndMessaging::SM_CXVIRTUALSCREEN;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::WM_DESTROY;
|
use windows::Win32::UI::WindowsAndMessaging::WM_DESTROY;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::WM_PAINT;
|
use windows::Win32::UI::WindowsAndMessaging::WM_PAINT;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::WM_SIZE;
|
use windows::Win32::UI::WindowsAndMessaging::WM_SIZE;
|
||||||
@@ -131,12 +141,33 @@ impl Border {
|
|||||||
let _ = TranslateMessage(&msg);
|
let _ = TranslateMessage(&msg);
|
||||||
DispatchMessageW(&msg);
|
DispatchMessageW(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::thread::sleep(Duration::from_millis(1))
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
});
|
});
|
||||||
|
|
||||||
let hwnd = hwnd_receiver.recv()?;
|
let hwnd = hwnd_receiver.recv()?;
|
||||||
|
let border = Self { hwnd };
|
||||||
|
|
||||||
|
// I have literally no idea, apparently this is to get rid of the black pixels
|
||||||
|
// around the edges of rounded corners? @lukeyou05 borrowed this from PowerToys
|
||||||
|
unsafe {
|
||||||
|
let pos: i32 = -GetSystemMetrics(SM_CXVIRTUALSCREEN) - 8;
|
||||||
|
let hrgn = CreateRectRgn(pos, 0, pos + 1, 1);
|
||||||
|
let mut bh: DWM_BLURBEHIND = Default::default();
|
||||||
|
if !hrgn.is_invalid() {
|
||||||
|
bh = DWM_BLURBEHIND {
|
||||||
|
dwFlags: DWM_BB_ENABLE | DWM_BB_BLURREGION,
|
||||||
|
fEnable: TRUE,
|
||||||
|
hRgnBlur: hrgn,
|
||||||
|
fTransitionOnMaximized: FALSE,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
let _ = DwmEnableBlurBehindWindow(border.hwnd(), &bh);
|
||||||
|
}
|
||||||
|
|
||||||
let hwnd_render_target_properties = D2D1_HWND_RENDER_TARGET_PROPERTIES {
|
let hwnd_render_target_properties = D2D1_HWND_RENDER_TARGET_PROPERTIES {
|
||||||
hwnd: HWND(windows_api::as_ptr!(hwnd)),
|
hwnd: HWND(windows_api::as_ptr!(hwnd)),
|
||||||
@@ -163,7 +194,7 @@ impl Border {
|
|||||||
render_target.SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
|
render_target.SetAntialiasMode(D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
|
||||||
let mut render_targets = RENDER_TARGETS.lock();
|
let mut render_targets = RENDER_TARGETS.lock();
|
||||||
render_targets.insert(hwnd, render_target);
|
render_targets.insert(hwnd, render_target);
|
||||||
Ok(Self { hwnd })
|
Ok(border)
|
||||||
},
|
},
|
||||||
Err(error) => Err(error.into()),
|
Err(error) => Err(error.into()),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user