use wayland_client::{
WEnum, backend::ObjectId, protocol::wl_output::Transform,
};
use wayland_protocols_wlr::output_management::v1::client::{
zwlr_output_head_v1::ZwlrOutputHeadV1,
zwlr_output_mode_v1::ZwlrOutputModeV1,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum WlTransform {
Normal,
Rotate90,
Rotate180,
Rotate270,
Flipped,
Flipped90,
Flipped180,
Flipped270,
}
impl WlTransform {
pub(crate) fn from_wayland(t: WEnum<Transform>) -> Self {
match t {
WEnum::Value(Transform::Normal) => Self::Normal,
WEnum::Value(Transform::_90) => Self::Rotate90,
WEnum::Value(Transform::_180) => Self::Rotate180,
WEnum::Value(Transform::_270) => Self::Rotate270,
WEnum::Value(Transform::Flipped) => Self::Flipped,
WEnum::Value(Transform::Flipped90) => Self::Flipped90,
WEnum::Value(Transform::Flipped180) => Self::Flipped180,
WEnum::Value(Transform::Flipped270) => Self::Flipped270,
_ => Self::Normal,
}
}
pub(crate) fn to_wayland(self) -> Transform {
match self {
Self::Normal => Transform::Normal,
Self::Rotate90 => Transform::_90,
Self::Rotate180 => Transform::_180,
Self::Rotate270 => Transform::_270,
Self::Flipped => Transform::Flipped,
Self::Flipped90 => Transform::Flipped90,
Self::Flipped180 => Transform::Flipped180,
Self::Flipped270 => Transform::Flipped270,
}
}
}
#[derive(Default, Clone, Debug)]
pub struct WlResolution {
pub height: i32,
pub width: i32,
}
#[derive(Default, Clone, Debug)]
pub struct WlPosition {
pub x: i32,
pub y: i32,
}
#[derive(Clone)]
pub struct WlMonitorMode {
pub mode_id: ObjectId,
pub head_id: ObjectId,
pub refresh_rate: i32,
pub resolution: WlResolution,
pub preferred: bool,
pub is_current: bool,
pub proxy: ZwlrOutputModeV1,
}
impl std::fmt::Debug for WlMonitorMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("WlMonitorMode")
.field("mode_id", &self.mode_id)
.field("head_id", &self.head_id)
.field("refresh_rate", &self.refresh_rate)
.field("resolution", &self.resolution)
.field("preferred", &self.preferred)
.field("is_current", &self.is_current)
.finish_non_exhaustive()
}
}
#[derive(Clone)]
pub struct WlMonitor {
pub head_id: ObjectId,
pub name: String,
pub description: String,
pub make: String,
pub model: String,
pub serial_number: String,
pub modes: Vec<WlMonitorMode>,
pub resolution: WlResolution,
pub position: WlPosition,
pub scale: f64,
pub enabled: bool,
pub current_mode: Option<ZwlrOutputModeV1>,
pub transform: WlTransform,
pub head: ZwlrOutputHeadV1,
pub changed: bool,
pub last_mode: Option<ObjectId>,
}
impl std::fmt::Debug for WlMonitor {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("WlMonitor")
.field("head_id", &self.head_id)
.field("name", &self.name)
.field("description", &self.description)
.field("make", &self.make)
.field("model", &self.model)
.field("serial_number", &self.serial_number)
.field("modes", &self.modes)
.field("resolution", &self.resolution)
.field("position", &self.position)
.field("scale", &self.scale)
.field("enabled", &self.enabled)
.field("transform", &self.transform)
.field("changed", &self.changed)
.field("last_mode", &self.last_mode)
.finish_non_exhaustive()
}
}