diff --git a/komorebi/src/window.rs b/komorebi/src/window.rs index 98e21b02..13b001ce 100644 --- a/komorebi/src/window.rs +++ b/komorebi/src/window.rs @@ -343,11 +343,29 @@ impl Window { Ok(()) } + pub fn transparent(self) -> Result<()> { + let mut ex_style = self.ex_style()?; + ex_style.insert(ExtendedWindowStyle::LAYERED); + self.update_ex_style(ex_style)?; + WindowsApi::set_transparent(self.hwnd()); + Ok(()) + } + + pub fn opaque(self) -> Result<()> { + let mut ex_style = self.ex_style()?; + ex_style.remove(ExtendedWindowStyle::LAYERED); + self.update_ex_style(ex_style) + } + #[allow(dead_code)] pub fn update_style(self, style: WindowStyle) -> Result<()> { WindowsApi::update_style(self.hwnd(), isize::try_from(style.bits())?) } + pub fn update_ex_style(self, style: ExtendedWindowStyle) -> Result<()> { + WindowsApi::update_ex_style(self.hwnd(), isize::try_from(style.bits())?) + } + pub fn style(self) -> Result { let bits = u32::try_from(WindowsApi::gwl_style(self.hwnd())?)?; WindowStyle::from_bits(bits).ok_or_else(|| anyhow!("there is no gwl style")) @@ -477,6 +495,9 @@ fn window_is_eligible( || layered_whitelist.contains(title) }; + // TODO: might need this for transparency + // let allow_layered = true; + let allow_wsl2_gui = { let wsl2_ui_processes = WSL2_UI_PROCESSES.lock(); wsl2_ui_processes.contains(exe_name) diff --git a/komorebi/src/windows_api.rs b/komorebi/src/windows_api.rs index 2df64f1c..79b586f6 100644 --- a/komorebi/src/windows_api.rs +++ b/komorebi/src/windows_api.rs @@ -98,6 +98,7 @@ use windows::Win32::UI::WindowsAndMessaging::GW_HWNDNEXT; use windows::Win32::UI::WindowsAndMessaging::HWND_BOTTOM; use windows::Win32::UI::WindowsAndMessaging::HWND_NOTOPMOST; use windows::Win32::UI::WindowsAndMessaging::HWND_TOPMOST; +use windows::Win32::UI::WindowsAndMessaging::LWA_ALPHA; use windows::Win32::UI::WindowsAndMessaging::LWA_COLORKEY; use windows::Win32::UI::WindowsAndMessaging::SET_WINDOW_POS_FLAGS; use windows::Win32::UI::WindowsAndMessaging::SHOW_WINDOW_CMD; @@ -773,6 +774,14 @@ impl WindowsApi { .process() } + pub fn set_transparent(hwnd: HWND) { + unsafe { + #[allow(clippy::cast_sign_loss)] + // TODO: alpha should be configurable + SetLayeredWindowAttributes(hwnd, COLORREF(-1i32 as u32), 150, LWA_ALPHA); + } + } + pub fn create_hidden_window(name: PCSTR, instance: HINSTANCE) -> Result { unsafe { CreateWindowExA(