use std::ptr::null_mut;
use windows_sys::core::PCWSTR;
use windows_sys::Win32::Foundation::{HINSTANCE, HWND};
use windows_sys::Win32::Graphics::Dwm::{
DwmSetWindowAttribute, DWMSBT_TRANSIENTWINDOW, DWMWA_SYSTEMBACKDROP_TYPE,
};
use windows_sys::Win32::UI::WindowsAndMessaging::{
CreateWindowExW, SetWindowLongPtrW, SetWindowPos, GWLP_USERDATA, HWND_TOPMOST, SWP_NOACTIVATE,
SWP_NOMOVE, SWP_NOSIZE, SWP_SHOWWINDOW, WS_EX_LAYERED, WS_EX_NOACTIVATE, WS_EX_TOOLWINDOW,
WS_EX_TOPMOST, WS_POPUP,
};
pub(super) unsafe fn create_popup(
class_name: PCWSTR,
hinstance: HINSTANCE,
kind_tag: isize,
) -> HWND {
let ex_style = WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW | WS_EX_LAYERED | WS_EX_TOPMOST;
let hwnd = CreateWindowExW(
ex_style,
class_name,
null_mut(),
WS_POPUP,
0,
0,
0,
0,
null_mut(),
null_mut(),
hinstance,
null_mut(),
);
if hwnd.is_null() {
return hwnd;
}
SetWindowLongPtrW(hwnd, GWLP_USERDATA, kind_tag);
apply_backdrop(hwnd);
hwnd
}
unsafe fn apply_backdrop(hwnd: HWND) {
let backdrop: i32 = DWMSBT_TRANSIENTWINDOW;
let _ = DwmSetWindowAttribute(
hwnd,
DWMWA_SYSTEMBACKDROP_TYPE as u32,
(&backdrop as *const i32).cast(),
std::mem::size_of::<i32>() as u32,
);
}
pub(super) unsafe fn raise_topmost(hwnd: HWND) {
SetWindowPos(
hwnd,
HWND_TOPMOST,
0,
0,
0,
0,
SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_SHOWWINDOW,
);
}