mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-05-17 09:17:02 +02:00
feat(wm): add internal transparent/opaque window fns
This commit is contained in:
@@ -343,11 +343,29 @@ impl Window {
|
|||||||
Ok(())
|
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)]
|
#[allow(dead_code)]
|
||||||
pub fn update_style(self, style: WindowStyle) -> Result<()> {
|
pub fn update_style(self, style: WindowStyle) -> Result<()> {
|
||||||
WindowsApi::update_style(self.hwnd(), isize::try_from(style.bits())?)
|
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<WindowStyle> {
|
pub fn style(self) -> Result<WindowStyle> {
|
||||||
let bits = u32::try_from(WindowsApi::gwl_style(self.hwnd())?)?;
|
let bits = u32::try_from(WindowsApi::gwl_style(self.hwnd())?)?;
|
||||||
WindowStyle::from_bits(bits).ok_or_else(|| anyhow!("there is no gwl style"))
|
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)
|
|| layered_whitelist.contains(title)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// TODO: might need this for transparency
|
||||||
|
// let allow_layered = true;
|
||||||
|
|
||||||
let allow_wsl2_gui = {
|
let allow_wsl2_gui = {
|
||||||
let wsl2_ui_processes = WSL2_UI_PROCESSES.lock();
|
let wsl2_ui_processes = WSL2_UI_PROCESSES.lock();
|
||||||
wsl2_ui_processes.contains(exe_name)
|
wsl2_ui_processes.contains(exe_name)
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ use windows::Win32::UI::WindowsAndMessaging::GW_HWNDNEXT;
|
|||||||
use windows::Win32::UI::WindowsAndMessaging::HWND_BOTTOM;
|
use windows::Win32::UI::WindowsAndMessaging::HWND_BOTTOM;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::HWND_NOTOPMOST;
|
use windows::Win32::UI::WindowsAndMessaging::HWND_NOTOPMOST;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::HWND_TOPMOST;
|
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::LWA_COLORKEY;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::SET_WINDOW_POS_FLAGS;
|
use windows::Win32::UI::WindowsAndMessaging::SET_WINDOW_POS_FLAGS;
|
||||||
use windows::Win32::UI::WindowsAndMessaging::SHOW_WINDOW_CMD;
|
use windows::Win32::UI::WindowsAndMessaging::SHOW_WINDOW_CMD;
|
||||||
@@ -773,6 +774,14 @@ impl WindowsApi {
|
|||||||
.process()
|
.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<isize> {
|
pub fn create_hidden_window(name: PCSTR, instance: HINSTANCE) -> Result<isize> {
|
||||||
unsafe {
|
unsafe {
|
||||||
CreateWindowExA(
|
CreateWindowExA(
|
||||||
|
|||||||
Reference in New Issue
Block a user