wayland_protocols_async/zwlr_output_management_v1/output/
output_head.rs

1
2use wayland_client::{Dispatch, Connection, QueueHandle, Proxy, backend::ObjectId, protocol::wl_output::Transform};
3use wayland_protocols_wlr::output_management::v1::client::{zwlr_output_head_v1::{ZwlrOutputHeadV1, self, AdaptiveSyncState}, zwlr_output_mode_v1::ZwlrOutputModeV1, zwlr_output_manager_v1::ZwlrOutputManagerV1};
4
5use crate::zwlr_output_management_v1::{handler::OutputManagementEvent, output::output_mode::WlOutputMode};
6use crate::zwlr_output_management_v1::handler::OutputManagementState;
7
8#[derive(Debug, Clone)]
9pub struct WlOutputHead {
10    pub adaptive_sync: Option<AdaptiveSyncState>,
11    pub current_mode: Option<ObjectId>,
12    pub description: String,
13    pub enabled: bool,
14    pub height: i32,
15    pub make: String,
16    pub model: String,
17    pub modes: Vec<ObjectId>,
18    pub name: String,
19    pub output_head: ZwlrOutputHeadV1,
20    pub pos_x: i32,
21    pub pos_y: i32,
22    pub scale: f64,
23    pub serial_number: String,
24    pub transform: Option<Transform>,
25    pub width: i32,
26}
27
28impl WlOutputHead {
29    pub fn new(output_head: ZwlrOutputHeadV1) -> Self {
30        Self {
31            adaptive_sync: None,
32            current_mode: None,
33            description: String::new(),
34            enabled: false,
35            height: 0,
36            make: String::new(),
37            model: String::new(),
38            modes: Vec::new(),
39            name: String::new(),
40            pos_x: 0,
41            pos_y: 0,
42            scale: 1.0,
43            serial_number: String::new(),
44            transform: None,
45            output_head,
46            width: 0,
47        }
48    }
49}
50
51impl Dispatch<ZwlrOutputHeadV1, ()> for OutputManagementState {
52    fn event(
53        state: &mut Self,
54        head: &ZwlrOutputHeadV1,
55        event: <ZwlrOutputHeadV1 as Proxy>::Event,
56        _: &(),
57        _: &Connection,
58        _handle: &QueueHandle<Self>,
59    ) {
60        let output_head = state
61            .output_heads
62            .entry(head.id())
63            .or_insert_with(|| WlOutputHead::new(head.clone()));
64
65        match event {
66            zwlr_output_head_v1::Event::Name { name } => {
67                output_head.name = name.clone();
68                state.dispatch_event(OutputManagementEvent::HeadName { id: head.id(), name });
69            },
70            zwlr_output_head_v1::Event::Description { description } => {
71                output_head.description = description.clone();
72                state.dispatch_event(OutputManagementEvent::HeadDescription { id: head.id(), description });
73            },
74            zwlr_output_head_v1::Event::PhysicalSize { width, height } => {
75                output_head.width = width;
76                output_head.height = height;
77                state.dispatch_event(OutputManagementEvent::HeadPhysicalSize { id: head.id(), height, width });
78            },
79            zwlr_output_head_v1::Event::Mode { mode } => {
80                let mode_id = mode.id();
81                state.mode_to_head_ids.insert(mode_id.clone(), head.id());
82                output_head.modes.push(mode_id.clone());
83                state.output_modes.insert(mode_id.clone(), WlOutputMode::new(mode));
84                state.dispatch_event(OutputManagementEvent::HeadMode { id: head.id(), mode_id: mode_id });
85
86            },
87            zwlr_output_head_v1::Event::Enabled { enabled } => {
88                let enabled = match enabled {
89                    0 => false,
90                    _ => true
91                };
92                output_head.enabled = enabled;
93                state.dispatch_event(OutputManagementEvent::HeadEnabled { id: head.id(), enabled })
94            },
95            zwlr_output_head_v1::Event::CurrentMode { mode } => {
96                output_head.current_mode = Some(mode.id());
97                state.dispatch_event(OutputManagementEvent::HeadCurrentMode { id: head.id(), mode_id: mode.id() });
98            },
99            zwlr_output_head_v1::Event::Position { x, y } => {
100                output_head.pos_x = x;
101                output_head.pos_y = y;
102                state.dispatch_event(OutputManagementEvent::HeadPosition { id: head.id(), x, y });
103            },
104            zwlr_output_head_v1::Event::Transform { transform } => {
105                let transform = transform.into_result();
106                output_head.transform = transform.ok();
107                state.dispatch_event(OutputManagementEvent::HeadTransform { id: head.id(), transform });
108            },
109            zwlr_output_head_v1::Event::Scale { scale } => {
110                output_head.scale = scale;
111                state.dispatch_event(OutputManagementEvent::HeadScale { id: head.id(), scale });
112            },
113            zwlr_output_head_v1::Event::Finished => {
114                head.release();
115                state.output_heads.remove(&head.id());
116                state.dispatch_event(OutputManagementEvent::HeadFinished { id: head.id() });
117
118            },
119            zwlr_output_head_v1::Event::Make { make } => {
120                output_head.make = make.clone();
121                state.dispatch_event(OutputManagementEvent::HeadMake { id: head.id(), make });
122
123            },
124            zwlr_output_head_v1::Event::Model { model } => {
125                output_head.model = model.clone();
126                state.dispatch_event(OutputManagementEvent::HeadModel { id: head.id(), model });
127            },
128            zwlr_output_head_v1::Event::SerialNumber { serial_number } => {
129                output_head.serial_number = serial_number.clone();
130                state.dispatch_event(OutputManagementEvent::HeadSerialNumber { id: head.id(), serial_number });
131
132            },
133            zwlr_output_head_v1::Event::AdaptiveSync { state: adaptive_sync } => {
134                let adaptive_sync = adaptive_sync.into_result();
135                output_head.adaptive_sync = adaptive_sync.ok();
136                state.dispatch_event(OutputManagementEvent::HeadAdaptiveSync { id: head.id(), state: adaptive_sync });
137            },
138            _ => {},
139        }
140    }
141
142    wayland_client::event_created_child!(Self, ZwlrOutputManagerV1, [
143        EVT_MODE_OPCODE => (ZwlrOutputModeV1, ()),
144    ]);
145}