use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
Serialize, Deserialize, Default)]
pub struct DisplayId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
Serialize, Deserialize, Default)]
pub struct ConnectorId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash,
Serialize, Deserialize, Default)]
pub struct AdapterId(pub String);
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DisplayIdentity {
pub id: DisplayId,
pub connector_id: ConnectorId,
pub adapter_id: AdapterId,
pub hardware_uuid: Option<String>,
pub monitor_name: String,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
pub enum DisplayRotation {
#[default]
Rotate0,
Rotate90,
Rotate180,
Rotate270,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
pub enum HdrState {
Enabled,
#[default]
Disabled,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
pub enum HdrMode {
#[default]
Default,
Cinema,
Game,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct Point2D {
pub x: i32,
pub y: i32,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct Extent2D {
pub width: u32,
pub height: u32,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct Rect {
pub origin: Point2D,
pub size: Extent2D,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, Default)]
pub struct VideoMode {
pub resolution: Extent2D,
pub refresh_rate: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OutputState {
pub identity: DisplayIdentity,
pub geometry: Rect,
pub refresh_rate: u32,
pub rotation: DisplayRotation,
pub hdr_state: HdrState,
pub hdr_mode: HdrMode,
pub scale: f64,
pub native_resolution: Option<Extent2D>,
pub supported_modes: Vec<VideoMode>,
pub enabled: bool,
pub is_primary: bool,
}
impl OutputState {
pub fn is_landscape(&self) -> bool {
match self.rotation {
DisplayRotation::Rotate0 | DisplayRotation::Rotate180 => {
self.geometry.size.width >= self.geometry.size.height
}
DisplayRotation::Rotate90 | DisplayRotation::Rotate270 => {
self.geometry.size.height >= self.geometry.size.width
}
}
}
pub fn refresh_rate_hz(&self) -> f32 {
self.refresh_rate as f32 / 1000.0
}
}
#[derive(Debug, Clone, Default)]
pub struct ActivationPlan {
pub position: Option<Point2D>,
pub resolution: Option<Extent2D>,
pub rotation: Option<DisplayRotation>,
}
impl Default for OutputState {
fn default() -> Self {
Self {
identity: DisplayIdentity {
id: DisplayId(String::new()),
connector_id: ConnectorId(String::new()),
adapter_id: AdapterId(String::new()),
hardware_uuid: None,
monitor_name: "Unknown Display".to_string(),
},
geometry: Rect::default(),
refresh_rate: 0,
rotation: DisplayRotation::Rotate0,
hdr_state: HdrState::Disabled,
hdr_mode: HdrMode::Default,
scale: 1.0,
native_resolution: None,
supported_modes: Vec::new(),
enabled: false,
is_primary: false,
}
}
}