use std::ffi::c_void;
use std::fmt;
use windows::Win32::Foundation::{HWND, RECT};
use crate::types::ProcessId;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct WindowHandle(pub *mut c_void);
impl WindowHandle {
pub fn new(raw: *mut c_void) -> Self {
Self(raw)
}
pub fn as_ptr(self) -> *mut c_void {
self.0
}
}
impl From<HWND> for WindowHandle {
fn from(value: HWND) -> Self {
Self(value.0)
}
}
impl From<WindowHandle> for HWND {
fn from(value: WindowHandle) -> Self {
HWND(value.0)
}
}
impl fmt::Display for WindowHandle {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{:p}", self.0)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct TrayIconId(pub u32);
impl TrayIconId {
pub fn new(id: u32) -> Self {
Self(id)
}
pub fn as_u32(self) -> u32 {
self.0
}
}
impl fmt::Display for TrayIconId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct WindowRect {
pub left: i32,
pub top: i32,
pub right: i32,
pub bottom: i32,
}
impl WindowRect {
pub fn width(self) -> i32 {
self.right - self.left
}
pub fn height(self) -> i32 {
self.bottom - self.top
}
}
impl From<RECT> for WindowRect {
fn from(value: RECT) -> Self {
Self {
left: value.left,
top: value.top,
right: value.right,
bottom: value.bottom,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CloakState {
NotCloaked,
App,
Shell,
Inherited,
Unknown(u32),
}
impl CloakState {
pub fn from_raw(raw: u32) -> Self {
if raw == 0 {
return CloakState::NotCloaked;
}
if raw & 0x1 != 0 {
return CloakState::App;
}
if raw & 0x2 != 0 {
return CloakState::Shell;
}
if raw & 0x4 != 0 {
return CloakState::Inherited;
}
CloakState::Unknown(raw)
}
pub fn is_cloaked(self) -> bool {
!matches!(self, CloakState::NotCloaked)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BalloonIcon {
None,
Info,
Warning,
Error,
}
#[derive(Debug, Clone)]
pub struct WindowInfo {
pub handle: WindowHandle,
pub parent: Option<WindowHandle>,
pub process_id: ProcessId,
pub class_name: String,
pub title: String,
pub rect: WindowRect,
pub is_visible: bool,
pub cloak_state: CloakState,
}