wayland_protocols_async/zwlr_output_management_v1/output/
output_head.rs1
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}