use serde::Serialize;
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Default)]
pub struct WindowPosition {
pub x: i32,
pub y: i32,
pub width: i32,
pub height: i32,
}
#[derive(Debug, Clone, Serialize)]
pub struct WindowInfo {
pub hwnd: isize,
pub pid: u32,
pub title: String,
pub class_name: String,
pub process_name: String,
pub process_file: PathBuf,
pub index: usize,
pub position: WindowPosition,
}
impl WindowInfo {
pub fn builder() -> WindowInfoBuilder {
WindowInfoBuilder::default()
}
}
#[derive(Default)]
pub struct WindowInfoBuilder {
hwnd: Option<isize>,
pid: Option<u32>,
title: Option<String>,
class_name: Option<String>,
process_name: Option<String>,
process_file: Option<PathBuf>,
index: Option<usize>,
position: Option<WindowPosition>,
}
impl WindowInfoBuilder {
pub fn hwnd(mut self, hwnd: isize) -> Self {
self.hwnd = Some(hwnd);
self
}
pub fn pid(mut self, pid: u32) -> Self {
self.pid = Some(pid);
self
}
pub fn title(mut self, title: String) -> Self {
self.title = Some(title);
self
}
pub fn class_name(mut self, class_name: String) -> Self {
self.class_name = Some(class_name);
self
}
pub fn process_name(mut self, process_name: String) -> Self {
self.process_name = Some(process_name);
self
}
pub fn process_file(mut self, process_file: PathBuf) -> Self {
self.process_file = Some(process_file);
self
}
pub fn index(mut self, index: usize) -> Self {
self.index = Some(index);
self
}
pub fn position(mut self, position: WindowPosition) -> Self {
self.position = Some(position);
self
}
pub fn build(self) -> WindowInfo {
WindowInfo {
hwnd: self.hwnd.unwrap_or(0),
pid: self.pid.unwrap_or(0),
title: self.title.unwrap_or_default(),
class_name: self.class_name.unwrap_or_default(),
process_name: self.process_name.unwrap_or_default(),
process_file: self.process_file.unwrap_or_default(),
index: self.index.unwrap_or(0),
position: self.position.unwrap_or_default(),
}
}
}
#[cfg(feature = "window-enumerator")]
impl From<&window_enumerator::WindowInfo> for WindowInfo {
fn from(window: &window_enumerator::WindowInfo) -> Self {
Self::builder()
.hwnd(window.hwnd)
.pid(window.pid)
.title(window.title.clone())
.class_name(window.class_name.clone())
.process_name(window.process_name.clone())
.process_file(window.process_file.clone())
.index(window.index)
.position(WindowPosition {
x: window.position.x,
y: window.position.y,
width: window.position.width,
height: window.position.height,
})
.build()
}
}
#[cfg(feature = "window-enumerator")]
impl From<window_enumerator::WindowInfo> for WindowInfo {
fn from(window: window_enumerator::WindowInfo) -> Self {
Self::from(&window)
}
}