atspi_common/events/
terminal.rs

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