1 | use crate::{ |
2 | error::AtspiError, |
3 | events::{BusProperties, EventBodyOwned, HasMatchRule, HasRegistryEventString, ObjectRef}, |
4 | Event, EventProperties, EventTypeProperties, |
5 | }; |
6 | use zbus_names::UniqueName; |
7 | use zvariant::ObjectPath; |
8 | |
9 | /// All events related to the `org.a11y.atspi.Event.Terminal` interface. |
10 | #[derive (Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)] |
11 | pub enum TerminalEvents { |
12 | /// See: [`LineChangedEvent`]. |
13 | LineChanged(LineChangedEvent), |
14 | /// See: [`ColumnCountChangedEvent`]. |
15 | ColumnCountChanged(ColumnCountChangedEvent), |
16 | /// See: [`LineCountChangedEvent`]. |
17 | LineCountChanged(LineCountChangedEvent), |
18 | /// See: [`ApplicationChangedEvent`]. |
19 | ApplicationChanged(ApplicationChangedEvent), |
20 | /// See: [`CharWidthChangedEvent`]. |
21 | CharWidthChanged(CharWidthChangedEvent), |
22 | } |
23 | |
24 | impl EventTypeProperties for TerminalEvents { |
25 | fn member(&self) -> &'static str { |
26 | match self { |
27 | Self::LineChanged(inner) => inner.member(), |
28 | Self::ColumnCountChanged(inner) => inner.member(), |
29 | Self::LineCountChanged(inner) => inner.member(), |
30 | Self::ApplicationChanged(inner) => inner.member(), |
31 | Self::CharWidthChanged(inner) => inner.member(), |
32 | } |
33 | } |
34 | fn interface(&self) -> &'static str { |
35 | match self { |
36 | Self::LineChanged(inner) => inner.interface(), |
37 | Self::ColumnCountChanged(inner) => inner.interface(), |
38 | Self::LineCountChanged(inner) => inner.interface(), |
39 | Self::ApplicationChanged(inner) => inner.interface(), |
40 | Self::CharWidthChanged(inner) => inner.interface(), |
41 | } |
42 | } |
43 | fn match_rule(&self) -> &'static str { |
44 | match self { |
45 | Self::LineChanged(inner) => inner.match_rule(), |
46 | Self::ColumnCountChanged(inner) => inner.match_rule(), |
47 | Self::LineCountChanged(inner) => inner.match_rule(), |
48 | Self::ApplicationChanged(inner) => inner.match_rule(), |
49 | Self::CharWidthChanged(inner) => inner.match_rule(), |
50 | } |
51 | } |
52 | fn registry_string(&self) -> &'static str { |
53 | match self { |
54 | Self::LineChanged(inner) => inner.registry_string(), |
55 | Self::ColumnCountChanged(inner) => inner.registry_string(), |
56 | Self::LineCountChanged(inner) => inner.registry_string(), |
57 | Self::ApplicationChanged(inner) => inner.registry_string(), |
58 | Self::CharWidthChanged(inner) => inner.registry_string(), |
59 | } |
60 | } |
61 | } |
62 | |
63 | impl EventProperties for TerminalEvents { |
64 | fn path(&self) -> ObjectPath<'_> { |
65 | match self { |
66 | Self::LineChanged(inner: &LineChangedEvent) => inner.path(), |
67 | Self::ColumnCountChanged(inner: &ColumnCountChangedEvent) => inner.path(), |
68 | Self::LineCountChanged(inner: &LineCountChangedEvent) => inner.path(), |
69 | Self::ApplicationChanged(inner: &ApplicationChangedEvent) => inner.path(), |
70 | Self::CharWidthChanged(inner: &CharWidthChangedEvent) => inner.path(), |
71 | } |
72 | } |
73 | fn sender(&self) -> UniqueName<'_> { |
74 | match self { |
75 | Self::LineChanged(inner: &LineChangedEvent) => inner.sender(), |
76 | Self::ColumnCountChanged(inner: &ColumnCountChangedEvent) => inner.sender(), |
77 | Self::LineCountChanged(inner: &LineCountChangedEvent) => inner.sender(), |
78 | Self::ApplicationChanged(inner: &ApplicationChangedEvent) => inner.sender(), |
79 | Self::CharWidthChanged(inner: &CharWidthChangedEvent) => inner.sender(), |
80 | } |
81 | } |
82 | } |
83 | |
84 | impl_from_interface_event_enum_for_event!(TerminalEvents, Event::Terminal); |
85 | impl_try_from_event_for_user_facing_event_type!(TerminalEvents, Event::Terminal); |
86 | |
87 | event_wrapper_test_cases!(TerminalEvents, LineChangedEvent); |
88 | |
89 | impl HasMatchRule for TerminalEvents { |
90 | const MATCH_RULE_STRING: &'static str = |
91 | "type='signal',interface='org.a11y.atspi.Event.Terminal'" ; |
92 | } |
93 | |
94 | /// A line of text has been changed. |
95 | #[derive (Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)] |
96 | pub struct LineChangedEvent { |
97 | /// The [`ObjectRef`] which the event applies to. |
98 | pub item: crate::events::ObjectRef, |
99 | } |
100 | |
101 | /// The width of a terminal emulator has changed sufficiently such that the number of characters |
102 | /// able to fit on one *visual* line has changed. |
103 | #[derive (Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)] |
104 | pub struct ColumnCountChangedEvent { |
105 | /// The [`ObjectRef`] which the event applies to. |
106 | pub item: crate::events::ObjectRef, |
107 | } |
108 | |
109 | /// The height of a terminal emulator has changed sufficiently such that the number of lines |
110 | /// able to fit within the terminal has changed. |
111 | #[derive (Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)] |
112 | pub struct LineCountChangedEvent { |
113 | /// The [`ObjectRef`] which the event applies to. |
114 | pub item: crate::events::ObjectRef, |
115 | } |
116 | |
117 | #[derive (Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)] |
118 | pub struct ApplicationChangedEvent { |
119 | /// The [`ObjectRef`] which the event applies to. |
120 | pub item: crate::events::ObjectRef, |
121 | } |
122 | |
123 | /// The width of a terminal emulator has changed sufficiently such that the number of characters |
124 | /// able to fit on one *visual* line has changed. |
125 | #[derive (Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)] |
126 | pub struct CharWidthChangedEvent { |
127 | /// The [`ObjectRef`] which the event applies to. |
128 | pub item: crate::events::ObjectRef, |
129 | } |
130 | |
131 | impl BusProperties for LineChangedEvent { |
132 | const DBUS_MEMBER: &'static str = "LineChanged" ; |
133 | const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Terminal" ; |
134 | const MATCH_RULE_STRING: &'static str = |
135 | "type='signal',interface='org.a11y.atspi.Event.Terminal',member='LineChanged'" ; |
136 | const REGISTRY_EVENT_STRING: &'static str = "Terminal:" ; |
137 | |
138 | type Body = EventBodyOwned; |
139 | |
140 | fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> { |
141 | Ok(Self { item }) |
142 | } |
143 | fn body(&self) -> Self::Body { |
144 | let copy: LineChangedEvent = self.clone(); |
145 | copy.into() |
146 | } |
147 | } |
148 | |
149 | impl BusProperties for ColumnCountChangedEvent { |
150 | const DBUS_MEMBER: &'static str = "ColumncountChanged" ; |
151 | const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Terminal" ; |
152 | const MATCH_RULE_STRING: &'static str = |
153 | "type='signal',interface='org.a11y.atspi.Event.Terminal',member='ColumncountChanged'" ; |
154 | const REGISTRY_EVENT_STRING: &'static str = "Terminal:" ; |
155 | |
156 | type Body = EventBodyOwned; |
157 | |
158 | fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> { |
159 | Ok(Self { item }) |
160 | } |
161 | fn body(&self) -> Self::Body { |
162 | let copy: ColumnCountChangedEvent = self.clone(); |
163 | copy.into() |
164 | } |
165 | } |
166 | |
167 | impl BusProperties for LineCountChangedEvent { |
168 | const DBUS_MEMBER: &'static str = "LinecountChanged" ; |
169 | const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Terminal" ; |
170 | const MATCH_RULE_STRING: &'static str = |
171 | "type='signal',interface='org.a11y.atspi.Event.Terminal',member='LinecountChanged'" ; |
172 | const REGISTRY_EVENT_STRING: &'static str = "Terminal:" ; |
173 | |
174 | type Body = EventBodyOwned; |
175 | |
176 | fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> { |
177 | Ok(Self { item }) |
178 | } |
179 | fn body(&self) -> Self::Body { |
180 | let copy: LineCountChangedEvent = self.clone(); |
181 | copy.into() |
182 | } |
183 | } |
184 | |
185 | impl BusProperties for ApplicationChangedEvent { |
186 | const DBUS_MEMBER: &'static str = "ApplicationChanged" ; |
187 | const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Terminal" ; |
188 | const MATCH_RULE_STRING: &'static str = |
189 | "type='signal',interface='org.a11y.atspi.Event.Terminal',member='ApplicationChanged'" ; |
190 | const REGISTRY_EVENT_STRING: &'static str = "Terminal:" ; |
191 | |
192 | type Body = EventBodyOwned; |
193 | |
194 | fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> { |
195 | Ok(Self { item }) |
196 | } |
197 | fn body(&self) -> Self::Body { |
198 | let copy: ApplicationChangedEvent = self.clone(); |
199 | copy.into() |
200 | } |
201 | } |
202 | |
203 | impl BusProperties for CharWidthChangedEvent { |
204 | const DBUS_MEMBER: &'static str = "CharwidthChanged" ; |
205 | const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Terminal" ; |
206 | const MATCH_RULE_STRING: &'static str = |
207 | "type='signal',interface='org.a11y.atspi.Event.Terminal',member='CharwidthChanged'" ; |
208 | const REGISTRY_EVENT_STRING: &'static str = "Terminal:" ; |
209 | |
210 | type Body = EventBodyOwned; |
211 | |
212 | fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> { |
213 | Ok(Self { item }) |
214 | } |
215 | fn body(&self) -> Self::Body { |
216 | let copy: CharWidthChangedEvent = self.clone(); |
217 | copy.into() |
218 | } |
219 | } |
220 | |
221 | #[cfg (feature = "zbus" )] |
222 | impl TryFrom<&zbus::Message> for TerminalEvents { |
223 | type Error = AtspiError; |
224 | fn try_from(ev: &zbus::Message) -> Result<Self, Self::Error> { |
225 | let header: Header<'_> = ev.header(); |
226 | let member: &MemberName<'_> = header |
227 | .member() |
228 | .ok_or(err:AtspiError::MemberMatch("Event without member" .into()))?; |
229 | match member.as_str() { |
230 | "LineChanged" => Ok(TerminalEvents::LineChanged(ev.try_into()?)), |
231 | "ColumncountChanged" => Ok(TerminalEvents::ColumnCountChanged(ev.try_into()?)), |
232 | "LinecountChanged" => Ok(TerminalEvents::LineCountChanged(ev.try_into()?)), |
233 | "ApplicationChanged" => Ok(TerminalEvents::ApplicationChanged(ev.try_into()?)), |
234 | "CharwidthChanged" => Ok(TerminalEvents::CharWidthChanged(ev.try_into()?)), |
235 | _ => Err(AtspiError::MemberMatch("No matching member for Terminal" .into())), |
236 | } |
237 | } |
238 | } |
239 | |
240 | impl_from_user_facing_event_for_interface_event_enum!( |
241 | LineChangedEvent, |
242 | TerminalEvents, |
243 | TerminalEvents::LineChanged |
244 | ); |
245 | impl_from_user_facing_type_for_event_enum!(LineChangedEvent, Event::Terminal); |
246 | impl_try_from_event_for_user_facing_type!( |
247 | LineChangedEvent, |
248 | TerminalEvents::LineChanged, |
249 | Event::Terminal |
250 | ); |
251 | event_test_cases!(LineChangedEvent); |
252 | impl_to_dbus_message!(LineChangedEvent); |
253 | impl_from_dbus_message!(LineChangedEvent); |
254 | impl_event_properties!(LineChangedEvent); |
255 | impl From<LineChangedEvent> for EventBodyOwned { |
256 | fn from(_event: LineChangedEvent) -> Self { |
257 | EventBodyOwned { |
258 | properties: std::collections::HashMap::new(), |
259 | kind: String::default(), |
260 | detail1: i32::default(), |
261 | detail2: i32::default(), |
262 | any_data: u8::default().into(), |
263 | } |
264 | } |
265 | } |
266 | |
267 | impl_from_user_facing_event_for_interface_event_enum!( |
268 | ColumnCountChangedEvent, |
269 | TerminalEvents, |
270 | TerminalEvents::ColumnCountChanged |
271 | ); |
272 | impl_from_user_facing_type_for_event_enum!(ColumnCountChangedEvent, Event::Terminal); |
273 | impl_try_from_event_for_user_facing_type!( |
274 | ColumnCountChangedEvent, |
275 | TerminalEvents::ColumnCountChanged, |
276 | Event::Terminal |
277 | ); |
278 | event_test_cases!(ColumnCountChangedEvent); |
279 | impl_to_dbus_message!(ColumnCountChangedEvent); |
280 | impl_from_dbus_message!(ColumnCountChangedEvent); |
281 | impl_event_properties!(ColumnCountChangedEvent); |
282 | impl From<ColumnCountChangedEvent> for EventBodyOwned { |
283 | fn from(_event: ColumnCountChangedEvent) -> Self { |
284 | EventBodyOwned { |
285 | properties: std::collections::HashMap::new(), |
286 | kind: String::default(), |
287 | detail1: i32::default(), |
288 | detail2: i32::default(), |
289 | any_data: u8::default().into(), |
290 | } |
291 | } |
292 | } |
293 | |
294 | impl_from_user_facing_event_for_interface_event_enum!( |
295 | LineCountChangedEvent, |
296 | TerminalEvents, |
297 | TerminalEvents::LineCountChanged |
298 | ); |
299 | impl_from_user_facing_type_for_event_enum!(LineCountChangedEvent, Event::Terminal); |
300 | impl_try_from_event_for_user_facing_type!( |
301 | LineCountChangedEvent, |
302 | TerminalEvents::LineCountChanged, |
303 | Event::Terminal |
304 | ); |
305 | event_test_cases!(LineCountChangedEvent); |
306 | impl_to_dbus_message!(LineCountChangedEvent); |
307 | impl_from_dbus_message!(LineCountChangedEvent); |
308 | impl_event_properties!(LineCountChangedEvent); |
309 | impl From<LineCountChangedEvent> for EventBodyOwned { |
310 | fn from(_event: LineCountChangedEvent) -> Self { |
311 | EventBodyOwned { |
312 | properties: std::collections::HashMap::new(), |
313 | kind: String::default(), |
314 | detail1: i32::default(), |
315 | detail2: i32::default(), |
316 | any_data: u8::default().into(), |
317 | } |
318 | } |
319 | } |
320 | |
321 | impl_from_user_facing_event_for_interface_event_enum!( |
322 | ApplicationChangedEvent, |
323 | TerminalEvents, |
324 | TerminalEvents::ApplicationChanged |
325 | ); |
326 | impl_from_user_facing_type_for_event_enum!(ApplicationChangedEvent, Event::Terminal); |
327 | impl_try_from_event_for_user_facing_type!( |
328 | ApplicationChangedEvent, |
329 | TerminalEvents::ApplicationChanged, |
330 | Event::Terminal |
331 | ); |
332 | event_test_cases!(ApplicationChangedEvent); |
333 | impl_to_dbus_message!(ApplicationChangedEvent); |
334 | impl_from_dbus_message!(ApplicationChangedEvent); |
335 | impl_event_properties!(ApplicationChangedEvent); |
336 | impl From<ApplicationChangedEvent> for EventBodyOwned { |
337 | fn from(_event: ApplicationChangedEvent) -> Self { |
338 | EventBodyOwned { |
339 | properties: std::collections::HashMap::new(), |
340 | kind: String::default(), |
341 | detail1: i32::default(), |
342 | detail2: i32::default(), |
343 | any_data: u8::default().into(), |
344 | } |
345 | } |
346 | } |
347 | |
348 | impl_from_user_facing_event_for_interface_event_enum!( |
349 | CharWidthChangedEvent, |
350 | TerminalEvents, |
351 | TerminalEvents::CharWidthChanged |
352 | ); |
353 | impl_from_user_facing_type_for_event_enum!(CharWidthChangedEvent, Event::Terminal); |
354 | impl_try_from_event_for_user_facing_type!( |
355 | CharWidthChangedEvent, |
356 | TerminalEvents::CharWidthChanged, |
357 | Event::Terminal |
358 | ); |
359 | event_test_cases!(CharWidthChangedEvent); |
360 | impl_to_dbus_message!(CharWidthChangedEvent); |
361 | impl_from_dbus_message!(CharWidthChangedEvent); |
362 | impl_event_properties!(CharWidthChangedEvent); |
363 | impl From<CharWidthChangedEvent> for EventBodyOwned { |
364 | fn from(_event: CharWidthChangedEvent) -> Self { |
365 | EventBodyOwned { |
366 | properties: std::collections::HashMap::new(), |
367 | kind: String::default(), |
368 | detail1: i32::default(), |
369 | detail2: i32::default(), |
370 | any_data: u8::default().into(), |
371 | } |
372 | } |
373 | } |
374 | |
375 | impl HasRegistryEventString for TerminalEvents { |
376 | const REGISTRY_EVENT_STRING: &'static str = "Terminal:" ; |
377 | } |
378 | |