atspi_common/events/
event_wrappers.rs

1use crate::events::{AvailableEvent, EventListenerEvents};
2#[cfg(feature = "zbus")]
3use crate::events::{EventWrapperMessageConversion, MessageConversion, TryFromMessage};
4use crate::{
5	cache::{CacheItem, LegacyCacheItem},
6	error::AtspiError,
7	events::{
8		cache::{AddAccessibleEvent, LegacyAddAccessibleEvent, RemoveAccessibleEvent},
9		document::AttributesChangedEvent as DocumentAttributesChangedEvent,
10		document::{
11			ContentChangedEvent, LoadCompleteEvent, LoadStoppedEvent, PageChangedEvent, ReloadEvent,
12		},
13		focus::FocusEvent,
14		keyboard::ModifiersEvent,
15		mouse::{AbsEvent, ButtonEvent, RelEvent},
16		terminal::{
17			ApplicationChangedEvent, CharWidthChangedEvent, ColumnCountChangedEvent,
18			LineChangedEvent, LineCountChangedEvent,
19		},
20		window::PropertyChangeEvent as WindowPropertyChangeEvent,
21		window::{
22			ActivateEvent, CloseEvent, CreateEvent, DeactivateEvent, DesktopCreateEvent,
23			DesktopDestroyEvent, DestroyEvent, LowerEvent, MaximizeEvent, MinimizeEvent, MoveEvent,
24			RaiseEvent, ReparentEvent, ResizeEvent, RestoreEvent, RestyleEvent, ShadeEvent,
25			UUshadeEvent,
26		},
27		BusProperties, HasInterfaceName, HasMatchRule, HasRegistryEventString,
28	},
29	EventProperties, EventTypeProperties,
30};
31use crate::{
32	events::object::AttributesChangedEvent as ObjectAttributesChangedEvent,
33	events::object::PropertyChangeEvent as ObjectPropertyChangeEvent,
34	events::object::{
35		ActiveDescendantChangedEvent, AnnouncementEvent, BoundsChangedEvent, ChildrenChangedEvent,
36		ColumnDeletedEvent, ColumnInsertedEvent, ColumnReorderedEvent, LinkSelectedEvent,
37		ModelChangedEvent, RowDeletedEvent, RowInsertedEvent, RowReorderedEvent,
38		SelectionChangedEvent, StateChangedEvent, TextAttributesChangedEvent,
39		TextBoundsChangedEvent, TextCaretMovedEvent, TextChangedEvent, TextSelectionChangedEvent,
40		VisibleDataChangedEvent,
41	},
42};
43use serde::{Deserialize, Serialize};
44use zbus_names::UniqueName;
45use zvariant::{ObjectPath, Type};
46
47#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)]
48pub enum DocumentEvents {
49	/// See: [`LoadCompleteEvent`].
50	LoadComplete(LoadCompleteEvent),
51	/// See: [`ReloadEvent`].
52	Reload(ReloadEvent),
53	/// See: [`LoadStoppedEvent`].
54	LoadStopped(LoadStoppedEvent),
55	/// See: [`ContentChangedEvent`].
56	ContentChanged(ContentChangedEvent),
57	/// See: [`DocumentAttributesChangedEvent`].
58	AttributesChanged(DocumentAttributesChangedEvent),
59	/// See: [`PageChangedEvent`].
60	PageChanged(PageChangedEvent),
61}
62
63impl EventTypeProperties for DocumentEvents {
64	fn member(&self) -> &'static str {
65		match self {
66			Self::LoadComplete(inner) => inner.member(),
67			Self::Reload(inner) => inner.member(),
68			Self::LoadStopped(inner) => inner.member(),
69			Self::ContentChanged(inner) => inner.member(),
70			Self::AttributesChanged(inner) => inner.member(),
71			Self::PageChanged(inner) => inner.member(),
72		}
73	}
74	fn interface(&self) -> &'static str {
75		match self {
76			Self::LoadComplete(inner) => inner.interface(),
77			Self::Reload(inner) => inner.interface(),
78			Self::LoadStopped(inner) => inner.interface(),
79			Self::ContentChanged(inner) => inner.interface(),
80			Self::AttributesChanged(inner) => inner.interface(),
81			Self::PageChanged(inner) => inner.interface(),
82		}
83	}
84	fn match_rule(&self) -> &'static str {
85		match self {
86			Self::LoadComplete(inner) => inner.match_rule(),
87			Self::Reload(inner) => inner.match_rule(),
88			Self::LoadStopped(inner) => inner.match_rule(),
89			Self::ContentChanged(inner) => inner.match_rule(),
90			Self::AttributesChanged(inner) => inner.match_rule(),
91			Self::PageChanged(inner) => inner.match_rule(),
92		}
93	}
94	fn registry_string(&self) -> &'static str {
95		match self {
96			Self::LoadComplete(inner) => inner.registry_string(),
97			Self::Reload(inner) => inner.registry_string(),
98			Self::LoadStopped(inner) => inner.registry_string(),
99			Self::ContentChanged(inner) => inner.registry_string(),
100			Self::AttributesChanged(inner) => inner.registry_string(),
101			Self::PageChanged(inner) => inner.registry_string(),
102		}
103	}
104}
105
106impl EventProperties for DocumentEvents {
107	fn path(&self) -> ObjectPath<'_> {
108		match self {
109			Self::LoadComplete(inner) => inner.path(),
110			Self::Reload(inner) => inner.path(),
111			Self::LoadStopped(inner) => inner.path(),
112			Self::ContentChanged(inner) => inner.path(),
113			Self::AttributesChanged(inner) => inner.path(),
114			Self::PageChanged(inner) => inner.path(),
115		}
116	}
117	fn sender(&self) -> UniqueName<'_> {
118		match self {
119			Self::LoadComplete(inner) => inner.sender(),
120			Self::Reload(inner) => inner.sender(),
121			Self::LoadStopped(inner) => inner.sender(),
122			Self::ContentChanged(inner) => inner.sender(),
123			Self::AttributesChanged(inner) => inner.sender(),
124			Self::PageChanged(inner) => inner.sender(),
125		}
126	}
127}
128
129impl_from_user_facing_type_for_event_enum!(PageChangedEvent, Event::Document);
130impl_from_user_facing_type_for_event_enum!(DocumentAttributesChangedEvent, Event::Document);
131impl_from_user_facing_type_for_event_enum!(ContentChangedEvent, Event::Document);
132impl_from_user_facing_type_for_event_enum!(LoadStoppedEvent, Event::Document);
133impl_from_user_facing_type_for_event_enum!(ReloadEvent, Event::Document);
134impl_from_user_facing_type_for_event_enum!(LoadCompleteEvent, Event::Document);
135
136impl_from_interface_event_enum_for_event!(DocumentEvents, Event::Document);
137impl_try_from_event_for_interface_enum!(DocumentEvents, Event::Document);
138event_wrapper_test_cases!(DocumentEvents, LoadCompleteEvent);
139
140impl HasMatchRule for DocumentEvents {
141	const MATCH_RULE_STRING: &'static str =
142		"type='signal',interface='org.a11y.atspi.Event.Document'";
143}
144
145impl HasInterfaceName for DocumentEvents {
146	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
147}
148
149#[cfg(feature = "zbus")]
150impl EventWrapperMessageConversion for DocumentEvents {
151	fn try_from_message_interface_checked(msg: &zbus::Message) -> Result<Self, AtspiError> {
152		let header = msg.header();
153		let member = header.member().ok_or(AtspiError::MissingMember)?;
154		match member.as_str() {
155			LoadCompleteEvent::DBUS_MEMBER => {
156				Ok(DocumentEvents::LoadComplete(LoadCompleteEvent::from_message_unchecked(msg)?))
157			}
158			ReloadEvent::DBUS_MEMBER => {
159				Ok(DocumentEvents::Reload(ReloadEvent::from_message_unchecked(msg)?))
160			}
161			LoadStoppedEvent::DBUS_MEMBER => {
162				Ok(DocumentEvents::LoadStopped(LoadStoppedEvent::from_message_unchecked(msg)?))
163			}
164			ContentChangedEvent::DBUS_MEMBER => Ok(DocumentEvents::ContentChanged(
165				ContentChangedEvent::from_message_unchecked(msg)?,
166			)),
167			DocumentAttributesChangedEvent::DBUS_MEMBER => Ok(DocumentEvents::AttributesChanged(
168				DocumentAttributesChangedEvent::from_message_unchecked(msg)?,
169			)),
170			PageChangedEvent::DBUS_MEMBER => {
171				Ok(DocumentEvents::PageChanged(PageChangedEvent::from_message_unchecked(msg)?))
172			}
173			_ => Err(AtspiError::MemberMatch("No matching member for Document".into())),
174		}
175	}
176}
177
178#[cfg(feature = "zbus")]
179impl TryFrom<&zbus::Message> for DocumentEvents {
180	type Error = AtspiError;
181	fn try_from(msg: &zbus::Message) -> Result<Self, Self::Error> {
182		Self::try_from_message(msg)
183	}
184}
185
186impl_from_user_facing_event_for_interface_event_enum!(
187	LoadCompleteEvent,
188	DocumentEvents,
189	DocumentEvents::LoadComplete
190);
191impl_try_from_event_for_user_facing_type!(
192	LoadCompleteEvent,
193	DocumentEvents::LoadComplete,
194	Event::Document
195);
196
197impl_from_user_facing_event_for_interface_event_enum!(
198	ReloadEvent,
199	DocumentEvents,
200	DocumentEvents::Reload
201);
202impl_try_from_event_for_user_facing_type!(ReloadEvent, DocumentEvents::Reload, Event::Document);
203
204impl_from_user_facing_event_for_interface_event_enum!(
205	LoadStoppedEvent,
206	DocumentEvents,
207	DocumentEvents::LoadStopped
208);
209impl_try_from_event_for_user_facing_type!(
210	LoadStoppedEvent,
211	DocumentEvents::LoadStopped,
212	Event::Document
213);
214
215impl_from_user_facing_event_for_interface_event_enum!(
216	ContentChangedEvent,
217	DocumentEvents,
218	DocumentEvents::ContentChanged
219);
220impl_try_from_event_for_user_facing_type!(
221	ContentChangedEvent,
222	DocumentEvents::ContentChanged,
223	Event::Document
224);
225
226impl_from_user_facing_event_for_interface_event_enum!(
227	DocumentAttributesChangedEvent,
228	DocumentEvents,
229	DocumentEvents::AttributesChanged
230);
231impl_try_from_event_for_user_facing_type!(
232	DocumentAttributesChangedEvent,
233	DocumentEvents::AttributesChanged,
234	Event::Document
235);
236
237impl_from_user_facing_event_for_interface_event_enum!(
238	PageChangedEvent,
239	DocumentEvents,
240	DocumentEvents::PageChanged
241);
242impl_try_from_event_for_user_facing_type!(
243	PageChangedEvent,
244	DocumentEvents::PageChanged,
245	Event::Document
246);
247
248impl HasRegistryEventString for DocumentEvents {
249	const REGISTRY_EVENT_STRING: &'static str = "Document:";
250}
251
252/// Encapsulates the various different accessibility bus signal types.
253///
254/// Assumes being non exhaustive to allow for future- or custom signals.
255#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
256#[non_exhaustive]
257pub enum Event {
258	/// See: [`DocumentEvents`].
259	Document(DocumentEvents),
260	/// See: [`FocusEvents`].
261	Focus(FocusEvents),
262	/// See: [`KeyboardEvents`].
263	Keyboard(KeyboardEvents),
264	/// See: [`MouseEvents`].
265	Mouse(MouseEvents),
266	/// See: [`ObjectEvents`].
267	Object(ObjectEvents),
268	/// See: [`TerminalEvents`].
269	Terminal(TerminalEvents),
270	/// See: [`WindowEvents`].
271	Window(WindowEvents),
272	/// See: [`AvailableEvent`].
273	Available(AvailableEvent),
274	/// See: [`CacheEvents`].
275	Cache(CacheEvents),
276	/// See: [`EventListenerEvents`].
277	Listener(EventListenerEvents),
278}
279
280impl EventTypeProperties for Event {
281	fn member(&self) -> &'static str {
282		match self {
283			Self::Document(inner) => inner.member(),
284			Self::Focus(inner) => inner.member(),
285			Self::Keyboard(inner) => inner.member(),
286			Self::Mouse(inner) => inner.member(),
287			Self::Object(inner) => inner.member(),
288			Self::Terminal(inner) => inner.member(),
289			Self::Window(inner) => inner.member(),
290			Self::Available(inner) => inner.member(),
291			Self::Cache(inner) => inner.member(),
292			Self::Listener(inner) => inner.member(),
293		}
294	}
295	fn interface(&self) -> &'static str {
296		match self {
297			Self::Document(inner) => inner.interface(),
298			Self::Focus(inner) => inner.interface(),
299			Self::Keyboard(inner) => inner.interface(),
300			Self::Mouse(inner) => inner.interface(),
301			Self::Object(inner) => inner.interface(),
302			Self::Terminal(inner) => inner.interface(),
303			Self::Window(inner) => inner.interface(),
304			Self::Available(inner) => inner.interface(),
305			Self::Cache(inner) => inner.interface(),
306			Self::Listener(inner) => inner.interface(),
307		}
308	}
309	fn match_rule(&self) -> &'static str {
310		match self {
311			Self::Document(inner) => inner.match_rule(),
312			Self::Focus(inner) => inner.match_rule(),
313			Self::Keyboard(inner) => inner.match_rule(),
314			Self::Mouse(inner) => inner.match_rule(),
315			Self::Object(inner) => inner.match_rule(),
316			Self::Terminal(inner) => inner.match_rule(),
317			Self::Window(inner) => inner.match_rule(),
318			Self::Available(inner) => inner.match_rule(),
319			Self::Cache(inner) => inner.match_rule(),
320			Self::Listener(inner) => inner.match_rule(),
321		}
322	}
323	fn registry_string(&self) -> &'static str {
324		match self {
325			Self::Document(inner) => inner.registry_string(),
326			Self::Focus(inner) => inner.registry_string(),
327			Self::Keyboard(inner) => inner.registry_string(),
328			Self::Mouse(inner) => inner.registry_string(),
329			Self::Object(inner) => inner.registry_string(),
330			Self::Terminal(inner) => inner.registry_string(),
331			Self::Window(inner) => inner.registry_string(),
332			Self::Available(inner) => inner.registry_string(),
333			Self::Cache(inner) => inner.registry_string(),
334			Self::Listener(inner) => inner.registry_string(),
335		}
336	}
337}
338
339impl EventProperties for Event {
340	fn path(&self) -> ObjectPath<'_> {
341		match self {
342			Self::Document(inner) => inner.path(),
343			Self::Focus(inner) => inner.path(),
344			Self::Keyboard(inner) => inner.path(),
345			Self::Mouse(inner) => inner.path(),
346			Self::Object(inner) => inner.path(),
347			Self::Terminal(inner) => inner.path(),
348			Self::Window(inner) => inner.path(),
349			Self::Available(inner) => inner.path(),
350			Self::Cache(inner) => inner.path(),
351			Self::Listener(inner) => inner.path(),
352		}
353	}
354	fn sender(&self) -> UniqueName<'_> {
355		match self {
356			Self::Document(inner) => inner.sender(),
357			Self::Focus(inner) => inner.sender(),
358			Self::Keyboard(inner) => inner.sender(),
359			Self::Mouse(inner) => inner.sender(),
360			Self::Object(inner) => inner.sender(),
361			Self::Terminal(inner) => inner.sender(),
362			Self::Window(inner) => inner.sender(),
363			Self::Available(inner) => inner.sender(),
364			Self::Cache(inner) => inner.sender(),
365			Self::Listener(inner) => inner.sender(),
366		}
367	}
368}
369
370#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)]
371pub enum ObjectEvents {
372	/// See: [`ObjectPropertyChangeEvent`].
373	PropertyChange(ObjectPropertyChangeEvent),
374	/// See: [`BoundsChangedEvent`].
375	BoundsChanged(BoundsChangedEvent),
376	/// See: [`LinkSelectedEvent`].
377	LinkSelected(LinkSelectedEvent),
378	/// See: [`StateChangedEvent`].
379	StateChanged(StateChangedEvent),
380	/// See: [`ChildrenChangedEvent`].
381	ChildrenChanged(ChildrenChangedEvent),
382	/// See: [`VisibleDataChangedEvent`].
383	VisibleDataChanged(VisibleDataChangedEvent),
384	/// See: [`SelectionChangedEvent`].
385	SelectionChanged(SelectionChangedEvent),
386	/// See: [`ModelChangedEvent`].
387	ModelChanged(ModelChangedEvent),
388	/// See: [`ActiveDescendantChangedEvent`].
389	ActiveDescendantChanged(ActiveDescendantChangedEvent),
390	/// See: [`AnnouncementEvent`].
391	Announcement(AnnouncementEvent),
392	/// See: [`ObjectAttributesChangedEvent`].
393	AttributesChanged(ObjectAttributesChangedEvent),
394	/// See: [`RowInsertedEvent`].
395	RowInserted(RowInsertedEvent),
396	/// See: [`RowReorderedEvent`].
397	RowReordered(RowReorderedEvent),
398	/// See: [`RowDeletedEvent`].
399	RowDeleted(RowDeletedEvent),
400	/// See: [`ColumnInsertedEvent`].
401	ColumnInserted(ColumnInsertedEvent),
402	/// See: [`ColumnReorderedEvent`].
403	ColumnReordered(ColumnReorderedEvent),
404	/// See: [`ColumnDeletedEvent`].
405	ColumnDeleted(ColumnDeletedEvent),
406	/// See: [`TextBoundsChangedEvent`].
407	TextBoundsChanged(TextBoundsChangedEvent),
408	/// See: [`TextSelectionChangedEvent`].
409	TextSelectionChanged(TextSelectionChangedEvent),
410	/// See: [`TextChangedEvent`].
411	TextChanged(TextChangedEvent),
412	/// See: [`TextAttributesChangedEvent`].
413	TextAttributesChanged(TextAttributesChangedEvent),
414	/// See: [`TextCaretMovedEvent`].
415	TextCaretMoved(TextCaretMovedEvent),
416}
417
418impl EventTypeProperties for ObjectEvents {
419	fn member(&self) -> &'static str {
420		match self {
421			Self::PropertyChange(inner) => inner.member(),
422			Self::BoundsChanged(inner) => inner.member(),
423			Self::LinkSelected(inner) => inner.member(),
424			Self::StateChanged(inner) => inner.member(),
425			Self::ChildrenChanged(inner) => inner.member(),
426			Self::VisibleDataChanged(inner) => inner.member(),
427			Self::SelectionChanged(inner) => inner.member(),
428			Self::ModelChanged(inner) => inner.member(),
429			Self::ActiveDescendantChanged(inner) => inner.member(),
430			Self::Announcement(inner) => inner.member(),
431			Self::AttributesChanged(inner) => inner.member(),
432			Self::RowInserted(inner) => inner.member(),
433			Self::RowReordered(inner) => inner.member(),
434			Self::RowDeleted(inner) => inner.member(),
435			Self::ColumnInserted(inner) => inner.member(),
436			Self::ColumnReordered(inner) => inner.member(),
437			Self::ColumnDeleted(inner) => inner.member(),
438			Self::TextBoundsChanged(inner) => inner.member(),
439			Self::TextSelectionChanged(inner) => inner.member(),
440			Self::TextChanged(inner) => inner.member(),
441			Self::TextAttributesChanged(inner) => inner.member(),
442			Self::TextCaretMoved(inner) => inner.member(),
443		}
444	}
445	fn interface(&self) -> &'static str {
446		match self {
447			Self::PropertyChange(inner) => inner.interface(),
448			Self::BoundsChanged(inner) => inner.interface(),
449			Self::LinkSelected(inner) => inner.interface(),
450			Self::StateChanged(inner) => inner.interface(),
451			Self::ChildrenChanged(inner) => inner.interface(),
452			Self::VisibleDataChanged(inner) => inner.interface(),
453			Self::SelectionChanged(inner) => inner.interface(),
454			Self::ModelChanged(inner) => inner.interface(),
455			Self::ActiveDescendantChanged(inner) => inner.interface(),
456			Self::Announcement(inner) => inner.interface(),
457			Self::AttributesChanged(inner) => inner.interface(),
458			Self::RowInserted(inner) => inner.interface(),
459			Self::RowReordered(inner) => inner.interface(),
460			Self::RowDeleted(inner) => inner.interface(),
461			Self::ColumnInserted(inner) => inner.interface(),
462			Self::ColumnReordered(inner) => inner.interface(),
463			Self::ColumnDeleted(inner) => inner.interface(),
464			Self::TextBoundsChanged(inner) => inner.interface(),
465			Self::TextSelectionChanged(inner) => inner.interface(),
466			Self::TextChanged(inner) => inner.interface(),
467			Self::TextAttributesChanged(inner) => inner.interface(),
468			Self::TextCaretMoved(inner) => inner.interface(),
469		}
470	}
471	fn match_rule(&self) -> &'static str {
472		match self {
473			Self::PropertyChange(inner) => inner.match_rule(),
474			Self::BoundsChanged(inner) => inner.match_rule(),
475			Self::LinkSelected(inner) => inner.match_rule(),
476			Self::StateChanged(inner) => inner.match_rule(),
477			Self::ChildrenChanged(inner) => inner.match_rule(),
478			Self::VisibleDataChanged(inner) => inner.match_rule(),
479			Self::SelectionChanged(inner) => inner.match_rule(),
480			Self::ModelChanged(inner) => inner.match_rule(),
481			Self::ActiveDescendantChanged(inner) => inner.match_rule(),
482			Self::Announcement(inner) => inner.match_rule(),
483			Self::AttributesChanged(inner) => inner.match_rule(),
484			Self::RowInserted(inner) => inner.match_rule(),
485			Self::RowReordered(inner) => inner.match_rule(),
486			Self::RowDeleted(inner) => inner.match_rule(),
487			Self::ColumnInserted(inner) => inner.match_rule(),
488			Self::ColumnReordered(inner) => inner.match_rule(),
489			Self::ColumnDeleted(inner) => inner.match_rule(),
490			Self::TextBoundsChanged(inner) => inner.match_rule(),
491			Self::TextSelectionChanged(inner) => inner.match_rule(),
492			Self::TextChanged(inner) => inner.match_rule(),
493			Self::TextAttributesChanged(inner) => inner.match_rule(),
494			Self::TextCaretMoved(inner) => inner.match_rule(),
495		}
496	}
497	fn registry_string(&self) -> &'static str {
498		match self {
499			Self::PropertyChange(inner) => inner.registry_string(),
500			Self::BoundsChanged(inner) => inner.registry_string(),
501			Self::LinkSelected(inner) => inner.registry_string(),
502			Self::StateChanged(inner) => inner.registry_string(),
503			Self::ChildrenChanged(inner) => inner.registry_string(),
504			Self::VisibleDataChanged(inner) => inner.registry_string(),
505			Self::SelectionChanged(inner) => inner.registry_string(),
506			Self::ModelChanged(inner) => inner.registry_string(),
507			Self::ActiveDescendantChanged(inner) => inner.registry_string(),
508			Self::Announcement(inner) => inner.registry_string(),
509			Self::AttributesChanged(inner) => inner.registry_string(),
510			Self::RowInserted(inner) => inner.registry_string(),
511			Self::RowReordered(inner) => inner.registry_string(),
512			Self::RowDeleted(inner) => inner.registry_string(),
513			Self::ColumnInserted(inner) => inner.registry_string(),
514			Self::ColumnReordered(inner) => inner.registry_string(),
515			Self::ColumnDeleted(inner) => inner.registry_string(),
516			Self::TextBoundsChanged(inner) => inner.registry_string(),
517			Self::TextSelectionChanged(inner) => inner.registry_string(),
518			Self::TextChanged(inner) => inner.registry_string(),
519			Self::TextAttributesChanged(inner) => inner.registry_string(),
520			Self::TextCaretMoved(inner) => inner.registry_string(),
521		}
522	}
523}
524
525impl EventProperties for ObjectEvents {
526	fn path(&self) -> ObjectPath<'_> {
527		match self {
528			Self::PropertyChange(inner) => inner.path(),
529			Self::BoundsChanged(inner) => inner.path(),
530			Self::LinkSelected(inner) => inner.path(),
531			Self::StateChanged(inner) => inner.path(),
532			Self::ChildrenChanged(inner) => inner.path(),
533			Self::VisibleDataChanged(inner) => inner.path(),
534			Self::SelectionChanged(inner) => inner.path(),
535			Self::ModelChanged(inner) => inner.path(),
536			Self::ActiveDescendantChanged(inner) => inner.path(),
537			Self::Announcement(inner) => inner.path(),
538			Self::AttributesChanged(inner) => inner.path(),
539			Self::RowInserted(inner) => inner.path(),
540			Self::RowReordered(inner) => inner.path(),
541			Self::RowDeleted(inner) => inner.path(),
542			Self::ColumnInserted(inner) => inner.path(),
543			Self::ColumnReordered(inner) => inner.path(),
544			Self::ColumnDeleted(inner) => inner.path(),
545			Self::TextBoundsChanged(inner) => inner.path(),
546			Self::TextSelectionChanged(inner) => inner.path(),
547			Self::TextChanged(inner) => inner.path(),
548			Self::TextAttributesChanged(inner) => inner.path(),
549			Self::TextCaretMoved(inner) => inner.path(),
550		}
551	}
552	fn sender(&self) -> UniqueName<'_> {
553		match self {
554			Self::PropertyChange(inner) => inner.sender(),
555			Self::BoundsChanged(inner) => inner.sender(),
556			Self::LinkSelected(inner) => inner.sender(),
557			Self::StateChanged(inner) => inner.sender(),
558			Self::ChildrenChanged(inner) => inner.sender(),
559			Self::VisibleDataChanged(inner) => inner.sender(),
560			Self::SelectionChanged(inner) => inner.sender(),
561			Self::ModelChanged(inner) => inner.sender(),
562			Self::ActiveDescendantChanged(inner) => inner.sender(),
563			Self::Announcement(inner) => inner.sender(),
564			Self::AttributesChanged(inner) => inner.sender(),
565			Self::RowInserted(inner) => inner.sender(),
566			Self::RowReordered(inner) => inner.sender(),
567			Self::RowDeleted(inner) => inner.sender(),
568			Self::ColumnInserted(inner) => inner.sender(),
569			Self::ColumnReordered(inner) => inner.sender(),
570			Self::ColumnDeleted(inner) => inner.sender(),
571			Self::TextBoundsChanged(inner) => inner.sender(),
572			Self::TextSelectionChanged(inner) => inner.sender(),
573			Self::TextChanged(inner) => inner.sender(),
574			Self::TextAttributesChanged(inner) => inner.sender(),
575			Self::TextCaretMoved(inner) => inner.sender(),
576		}
577	}
578}
579
580impl_from_user_facing_type_for_event_enum!(TextCaretMovedEvent, Event::Object);
581impl_from_user_facing_type_for_event_enum!(TextAttributesChangedEvent, Event::Object);
582impl_from_user_facing_type_for_event_enum!(TextChangedEvent, Event::Object);
583impl_from_user_facing_type_for_event_enum!(TextSelectionChangedEvent, Event::Object);
584impl_from_user_facing_type_for_event_enum!(TextBoundsChangedEvent, Event::Object);
585impl_from_user_facing_type_for_event_enum!(ColumnDeletedEvent, Event::Object);
586impl_from_user_facing_type_for_event_enum!(ColumnReorderedEvent, Event::Object);
587impl_from_user_facing_type_for_event_enum!(ColumnInsertedEvent, Event::Object);
588impl_from_user_facing_type_for_event_enum!(RowDeletedEvent, Event::Object);
589impl_from_user_facing_type_for_event_enum!(RowReorderedEvent, Event::Object);
590impl_from_user_facing_type_for_event_enum!(RowInsertedEvent, Event::Object);
591impl_from_user_facing_type_for_event_enum!(ObjectAttributesChangedEvent, Event::Object);
592impl_from_user_facing_type_for_event_enum!(AnnouncementEvent, Event::Object);
593impl_from_user_facing_type_for_event_enum!(ActiveDescendantChangedEvent, Event::Object);
594impl_from_user_facing_type_for_event_enum!(ModelChangedEvent, Event::Object);
595impl_from_user_facing_type_for_event_enum!(SelectionChangedEvent, Event::Object);
596impl_from_user_facing_type_for_event_enum!(VisibleDataChangedEvent, Event::Object);
597impl_from_user_facing_type_for_event_enum!(ChildrenChangedEvent, Event::Object);
598impl_from_user_facing_type_for_event_enum!(StateChangedEvent, Event::Object);
599impl_from_user_facing_type_for_event_enum!(LinkSelectedEvent, Event::Object);
600impl_from_user_facing_type_for_event_enum!(BoundsChangedEvent, Event::Object);
601impl_from_user_facing_type_for_event_enum!(ObjectPropertyChangeEvent, Event::Object);
602
603impl_from_interface_event_enum_for_event!(ObjectEvents, Event::Object);
604impl_try_from_event_for_interface_enum!(ObjectEvents, Event::Object);
605event_wrapper_test_cases!(ObjectEvents, ObjectPropertyChangeEvent);
606
607impl_from_user_facing_event_for_interface_event_enum!(
608	ObjectPropertyChangeEvent,
609	ObjectEvents,
610	ObjectEvents::PropertyChange
611);
612impl_try_from_event_for_user_facing_type!(
613	ObjectPropertyChangeEvent,
614	ObjectEvents::PropertyChange,
615	Event::Object
616);
617impl_from_user_facing_event_for_interface_event_enum!(
618	BoundsChangedEvent,
619	ObjectEvents,
620	ObjectEvents::BoundsChanged
621);
622impl_try_from_event_for_user_facing_type!(
623	BoundsChangedEvent,
624	ObjectEvents::BoundsChanged,
625	Event::Object
626);
627impl_from_user_facing_event_for_interface_event_enum!(
628	LinkSelectedEvent,
629	ObjectEvents,
630	ObjectEvents::LinkSelected
631);
632impl_try_from_event_for_user_facing_type!(
633	LinkSelectedEvent,
634	ObjectEvents::LinkSelected,
635	Event::Object
636);
637impl_from_user_facing_event_for_interface_event_enum!(
638	StateChangedEvent,
639	ObjectEvents,
640	ObjectEvents::StateChanged
641);
642impl_try_from_event_for_user_facing_type!(
643	StateChangedEvent,
644	ObjectEvents::StateChanged,
645	Event::Object
646);
647impl_from_user_facing_event_for_interface_event_enum!(
648	ChildrenChangedEvent,
649	ObjectEvents,
650	ObjectEvents::ChildrenChanged
651);
652impl_try_from_event_for_user_facing_type!(
653	ChildrenChangedEvent,
654	ObjectEvents::ChildrenChanged,
655	Event::Object
656);
657impl_from_user_facing_event_for_interface_event_enum!(
658	VisibleDataChangedEvent,
659	ObjectEvents,
660	ObjectEvents::VisibleDataChanged
661);
662impl_try_from_event_for_user_facing_type!(
663	VisibleDataChangedEvent,
664	ObjectEvents::VisibleDataChanged,
665	Event::Object
666);
667impl_from_user_facing_event_for_interface_event_enum!(
668	SelectionChangedEvent,
669	ObjectEvents,
670	ObjectEvents::SelectionChanged
671);
672impl_try_from_event_for_user_facing_type!(
673	SelectionChangedEvent,
674	ObjectEvents::SelectionChanged,
675	Event::Object
676);
677impl_from_user_facing_event_for_interface_event_enum!(
678	ModelChangedEvent,
679	ObjectEvents,
680	ObjectEvents::ModelChanged
681);
682impl_try_from_event_for_user_facing_type!(
683	ModelChangedEvent,
684	ObjectEvents::ModelChanged,
685	Event::Object
686);
687impl_from_user_facing_event_for_interface_event_enum!(
688	ActiveDescendantChangedEvent,
689	ObjectEvents,
690	ObjectEvents::ActiveDescendantChanged
691);
692impl_try_from_event_for_user_facing_type!(
693	ActiveDescendantChangedEvent,
694	ObjectEvents::ActiveDescendantChanged,
695	Event::Object
696);
697impl_from_user_facing_event_for_interface_event_enum!(
698	AnnouncementEvent,
699	ObjectEvents,
700	ObjectEvents::Announcement
701);
702impl_try_from_event_for_user_facing_type!(
703	AnnouncementEvent,
704	ObjectEvents::Announcement,
705	Event::Object
706);
707impl_from_user_facing_event_for_interface_event_enum!(
708	ObjectAttributesChangedEvent,
709	ObjectEvents,
710	ObjectEvents::AttributesChanged
711);
712impl_try_from_event_for_user_facing_type!(
713	ObjectAttributesChangedEvent,
714	ObjectEvents::AttributesChanged,
715	Event::Object
716);
717impl_from_user_facing_event_for_interface_event_enum!(
718	RowInsertedEvent,
719	ObjectEvents,
720	ObjectEvents::RowInserted
721);
722impl_try_from_event_for_user_facing_type!(
723	RowInsertedEvent,
724	ObjectEvents::RowInserted,
725	Event::Object
726);
727impl_from_user_facing_event_for_interface_event_enum!(
728	RowReorderedEvent,
729	ObjectEvents,
730	ObjectEvents::RowReordered
731);
732impl_try_from_event_for_user_facing_type!(
733	RowReorderedEvent,
734	ObjectEvents::RowReordered,
735	Event::Object
736);
737impl_from_user_facing_event_for_interface_event_enum!(
738	RowDeletedEvent,
739	ObjectEvents,
740	ObjectEvents::RowDeleted
741);
742impl_try_from_event_for_user_facing_type!(RowDeletedEvent, ObjectEvents::RowDeleted, Event::Object);
743impl_from_user_facing_event_for_interface_event_enum!(
744	ColumnInsertedEvent,
745	ObjectEvents,
746	ObjectEvents::ColumnInserted
747);
748impl_try_from_event_for_user_facing_type!(
749	ColumnInsertedEvent,
750	ObjectEvents::ColumnInserted,
751	Event::Object
752);
753impl_from_user_facing_event_for_interface_event_enum!(
754	ColumnReorderedEvent,
755	ObjectEvents,
756	ObjectEvents::ColumnReordered
757);
758impl_try_from_event_for_user_facing_type!(
759	ColumnReorderedEvent,
760	ObjectEvents::ColumnReordered,
761	Event::Object
762);
763impl_from_user_facing_event_for_interface_event_enum!(
764	ColumnDeletedEvent,
765	ObjectEvents,
766	ObjectEvents::ColumnDeleted
767);
768impl_try_from_event_for_user_facing_type!(
769	ColumnDeletedEvent,
770	ObjectEvents::ColumnDeleted,
771	Event::Object
772);
773impl_from_user_facing_event_for_interface_event_enum!(
774	TextBoundsChangedEvent,
775	ObjectEvents,
776	ObjectEvents::TextBoundsChanged
777);
778impl_try_from_event_for_user_facing_type!(
779	TextBoundsChangedEvent,
780	ObjectEvents::TextBoundsChanged,
781	Event::Object
782);
783impl_from_user_facing_event_for_interface_event_enum!(
784	TextSelectionChangedEvent,
785	ObjectEvents,
786	ObjectEvents::TextSelectionChanged
787);
788impl_try_from_event_for_user_facing_type!(
789	TextSelectionChangedEvent,
790	ObjectEvents::TextSelectionChanged,
791	Event::Object
792);
793impl_from_user_facing_event_for_interface_event_enum!(
794	TextChangedEvent,
795	ObjectEvents,
796	ObjectEvents::TextChanged
797);
798impl_try_from_event_for_user_facing_type!(
799	TextChangedEvent,
800	ObjectEvents::TextChanged,
801	Event::Object
802);
803impl_from_user_facing_event_for_interface_event_enum!(
804	TextAttributesChangedEvent,
805	ObjectEvents,
806	ObjectEvents::TextAttributesChanged
807);
808impl_try_from_event_for_user_facing_type!(
809	TextAttributesChangedEvent,
810	ObjectEvents::TextAttributesChanged,
811	Event::Object
812);
813impl_from_user_facing_event_for_interface_event_enum!(
814	TextCaretMovedEvent,
815	ObjectEvents,
816	ObjectEvents::TextCaretMoved
817);
818impl_try_from_event_for_user_facing_type!(
819	TextCaretMovedEvent,
820	ObjectEvents::TextCaretMoved,
821	Event::Object
822);
823
824impl HasMatchRule for ObjectEvents {
825	const MATCH_RULE_STRING: &'static str = "type='signal',interface='org.a11y.atspi.Event.Object'";
826}
827
828impl HasInterfaceName for ObjectEvents {
829	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
830}
831
832impl HasRegistryEventString for ObjectEvents {
833	const REGISTRY_EVENT_STRING: &'static str = "Object:";
834}
835
836#[cfg(feature = "zbus")]
837impl EventWrapperMessageConversion for ObjectEvents {
838	fn try_from_message_interface_checked(msg: &zbus::Message) -> Result<Self, AtspiError> {
839		let header = msg.header();
840		let member = header.member().ok_or(AtspiError::MissingMember)?;
841		match member.as_str() {
842			ObjectPropertyChangeEvent::DBUS_MEMBER => Ok(ObjectEvents::PropertyChange(
843				ObjectPropertyChangeEvent::from_message_unchecked(msg)?,
844			)),
845			BoundsChangedEvent::DBUS_MEMBER => {
846				Ok(ObjectEvents::BoundsChanged(BoundsChangedEvent::from_message_unchecked(msg)?))
847			}
848			LinkSelectedEvent::DBUS_MEMBER => {
849				Ok(ObjectEvents::LinkSelected(LinkSelectedEvent::from_message_unchecked(msg)?))
850			}
851			StateChangedEvent::DBUS_MEMBER => {
852				Ok(ObjectEvents::StateChanged(StateChangedEvent::from_message_unchecked(msg)?))
853			}
854			ChildrenChangedEvent::DBUS_MEMBER => Ok(ObjectEvents::ChildrenChanged(
855				ChildrenChangedEvent::from_message_unchecked(msg)?,
856			)),
857			VisibleDataChangedEvent::DBUS_MEMBER => Ok(ObjectEvents::VisibleDataChanged(
858				VisibleDataChangedEvent::from_message_unchecked(msg)?,
859			)),
860			SelectionChangedEvent::DBUS_MEMBER => Ok(ObjectEvents::SelectionChanged(
861				SelectionChangedEvent::from_message_unchecked(msg)?,
862			)),
863			ModelChangedEvent::DBUS_MEMBER => {
864				Ok(ObjectEvents::ModelChanged(ModelChangedEvent::from_message_unchecked(msg)?))
865			}
866			ActiveDescendantChangedEvent::DBUS_MEMBER => Ok(ObjectEvents::ActiveDescendantChanged(
867				ActiveDescendantChangedEvent::from_message_unchecked(msg)?,
868			)),
869			AnnouncementEvent::DBUS_MEMBER => {
870				Ok(ObjectEvents::Announcement(AnnouncementEvent::from_message_unchecked(msg)?))
871			}
872			ObjectAttributesChangedEvent::DBUS_MEMBER => Ok(ObjectEvents::AttributesChanged(
873				ObjectAttributesChangedEvent::from_message_unchecked(msg)?,
874			)),
875			RowInsertedEvent::DBUS_MEMBER => {
876				Ok(ObjectEvents::RowInserted(RowInsertedEvent::from_message_unchecked(msg)?))
877			}
878			RowReorderedEvent::DBUS_MEMBER => {
879				Ok(ObjectEvents::RowReordered(RowReorderedEvent::from_message_unchecked(msg)?))
880			}
881			RowDeletedEvent::DBUS_MEMBER => {
882				Ok(ObjectEvents::RowDeleted(RowDeletedEvent::from_message_unchecked(msg)?))
883			}
884			ColumnInsertedEvent::DBUS_MEMBER => {
885				Ok(ObjectEvents::ColumnInserted(ColumnInsertedEvent::from_message_unchecked(msg)?))
886			}
887			ColumnReorderedEvent::DBUS_MEMBER => Ok(ObjectEvents::ColumnReordered(
888				ColumnReorderedEvent::from_message_unchecked(msg)?,
889			)),
890			ColumnDeletedEvent::DBUS_MEMBER => {
891				Ok(ObjectEvents::ColumnDeleted(ColumnDeletedEvent::from_message_unchecked(msg)?))
892			}
893			TextBoundsChangedEvent::DBUS_MEMBER => Ok(ObjectEvents::TextBoundsChanged(
894				TextBoundsChangedEvent::from_message_unchecked(msg)?,
895			)),
896			TextSelectionChangedEvent::DBUS_MEMBER => Ok(ObjectEvents::TextSelectionChanged(
897				TextSelectionChangedEvent::from_message_unchecked(msg)?,
898			)),
899			TextChangedEvent::DBUS_MEMBER => {
900				Ok(ObjectEvents::TextChanged(TextChangedEvent::from_message_unchecked(msg)?))
901			}
902			TextAttributesChangedEvent::DBUS_MEMBER => Ok(ObjectEvents::TextAttributesChanged(
903				TextAttributesChangedEvent::from_message_unchecked(msg)?,
904			)),
905			TextCaretMovedEvent::DBUS_MEMBER => {
906				Ok(ObjectEvents::TextCaretMoved(TextCaretMovedEvent::from_message_unchecked(msg)?))
907			}
908			_ => Err(AtspiError::MemberMatch(format!(
909				"No matching member {member} for interface {}",
910				Self::DBUS_INTERFACE,
911			))),
912		}
913	}
914}
915
916#[cfg(feature = "zbus")]
917impl TryFrom<&zbus::Message> for ObjectEvents {
918	type Error = AtspiError;
919	fn try_from(msg: &zbus::Message) -> Result<Self, Self::Error> {
920		Self::try_from_message(msg)
921	}
922}
923
924/// All events related to the `org.a11y.atspi.Cache` interface.
925/// Note that these are not telling the client that an item *has been added* to a cache.
926/// It is telling the client "here is a bunch of information to store it in your cache".
927#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Eq, Hash)]
928#[allow(clippy::module_name_repetitions)]
929pub enum CacheEvents {
930	/// See: [`AddAccessibleEvent`].
931	Add(AddAccessibleEvent),
932	/// See: [`LegacyAddAccessibleEvent`].
933	LegacyAdd(LegacyAddAccessibleEvent),
934	/// See: [`RemoveAccessibleEvent`].
935	Remove(RemoveAccessibleEvent),
936}
937
938impl_from_user_facing_type_for_event_enum!(RemoveAccessibleEvent, Event::Cache);
939impl_from_user_facing_type_for_event_enum!(AddAccessibleEvent, Event::Cache);
940impl_from_user_facing_type_for_event_enum!(LegacyAddAccessibleEvent, Event::Cache);
941
942impl HasMatchRule for CacheEvents {
943	const MATCH_RULE_STRING: &'static str = "type='signal',interface='org.a11y.atspi.Cache'";
944}
945
946impl HasRegistryEventString for CacheEvents {
947	const REGISTRY_EVENT_STRING: &'static str = "Cache";
948}
949
950impl HasInterfaceName for CacheEvents {
951	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Cache";
952}
953
954impl EventTypeProperties for CacheEvents {
955	fn member(&self) -> &'static str {
956		match self {
957			Self::Add(inner) => inner.member(),
958			Self::LegacyAdd(inner) => inner.member(),
959			Self::Remove(inner) => inner.member(),
960		}
961	}
962	fn interface(&self) -> &'static str {
963		match self {
964			Self::Add(inner) => inner.interface(),
965			Self::LegacyAdd(inner) => inner.interface(),
966			Self::Remove(inner) => inner.interface(),
967		}
968	}
969	fn match_rule(&self) -> &'static str {
970		match self {
971			Self::Add(inner) => inner.match_rule(),
972			Self::LegacyAdd(inner) => inner.match_rule(),
973			Self::Remove(inner) => inner.match_rule(),
974		}
975	}
976	fn registry_string(&self) -> &'static str {
977		match self {
978			Self::Add(inner) => inner.registry_string(),
979			Self::LegacyAdd(inner) => inner.registry_string(),
980			Self::Remove(inner) => inner.registry_string(),
981		}
982	}
983}
984
985impl EventProperties for CacheEvents {
986	fn path(&self) -> ObjectPath<'_> {
987		match self {
988			Self::Add(inner) => inner.path(),
989			Self::LegacyAdd(inner) => inner.path(),
990			Self::Remove(inner) => inner.path(),
991		}
992	}
993	fn sender(&self) -> UniqueName<'_> {
994		match self {
995			Self::Add(inner) => inner.sender(),
996			Self::LegacyAdd(inner) => inner.sender(),
997			Self::Remove(inner) => inner.sender(),
998		}
999	}
1000}
1001
1002#[cfg(feature = "zbus")]
1003impl EventWrapperMessageConversion for CacheEvents {
1004	fn try_from_message_interface_checked(msg: &zbus::Message) -> Result<Self, AtspiError> {
1005		let header = msg.header();
1006		let member = header.member().ok_or(AtspiError::MissingMember)?;
1007		match member.as_str() {
1008			AddAccessibleEvent::DBUS_MEMBER => {
1009				let body = msg.body();
1010				let sig = body.signature();
1011				if sig == CacheItem::SIGNATURE {
1012					Ok(CacheEvents::Add(AddAccessibleEvent::from_message_unchecked(msg)?))
1013				} else if sig == LegacyCacheItem::SIGNATURE {
1014					Ok(CacheEvents::LegacyAdd(LegacyAddAccessibleEvent::from_message_unchecked(
1015						msg,
1016					)?))
1017				} else {
1018					Err(AtspiError::SignatureMatch(format!(
1019						"No matching event for signature {:?} in interface {}",
1020						sig,
1021						Self::DBUS_INTERFACE
1022					)))
1023				}
1024			}
1025			RemoveAccessibleEvent::DBUS_MEMBER => {
1026				Ok(CacheEvents::Remove(RemoveAccessibleEvent::from_message_unchecked(msg)?))
1027			}
1028			_ => Err(AtspiError::MemberMatch(format!(
1029				"No member {} in {}",
1030				member.as_str(),
1031				Self::DBUS_INTERFACE
1032			))),
1033		}
1034	}
1035}
1036
1037#[cfg(feature = "zbus")]
1038impl TryFrom<&zbus::Message> for CacheEvents {
1039	type Error = AtspiError;
1040	fn try_from(msg: &zbus::Message) -> Result<Self, Self::Error> {
1041		Self::try_from_message(msg)
1042	}
1043}
1044
1045impl_from_user_facing_event_for_interface_event_enum!(
1046	LegacyAddAccessibleEvent,
1047	CacheEvents,
1048	CacheEvents::LegacyAdd
1049);
1050impl_try_from_event_for_user_facing_type!(
1051	LegacyAddAccessibleEvent,
1052	CacheEvents::LegacyAdd,
1053	Event::Cache
1054);
1055impl_from_user_facing_event_for_interface_event_enum!(
1056	AddAccessibleEvent,
1057	CacheEvents,
1058	CacheEvents::Add
1059);
1060impl_try_from_event_for_user_facing_type!(AddAccessibleEvent, CacheEvents::Add, Event::Cache);
1061impl_from_user_facing_event_for_interface_event_enum!(
1062	RemoveAccessibleEvent,
1063	CacheEvents,
1064	CacheEvents::Remove
1065);
1066impl_try_from_event_for_user_facing_type!(RemoveAccessibleEvent, CacheEvents::Remove, Event::Cache);
1067
1068#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)]
1069pub enum FocusEvents {
1070	/// See: [`FocusEvent`].
1071	Focus(FocusEvent),
1072}
1073
1074impl EventTypeProperties for FocusEvents {
1075	fn member(&self) -> &'static str {
1076		match self {
1077			Self::Focus(inner) => inner.member(),
1078		}
1079	}
1080	fn match_rule(&self) -> &'static str {
1081		match self {
1082			Self::Focus(inner) => inner.match_rule(),
1083		}
1084	}
1085	fn interface(&self) -> &'static str {
1086		match self {
1087			Self::Focus(inner) => inner.interface(),
1088		}
1089	}
1090	fn registry_string(&self) -> &'static str {
1091		match self {
1092			Self::Focus(inner) => inner.registry_string(),
1093		}
1094	}
1095}
1096
1097impl EventProperties for FocusEvents {
1098	fn path(&self) -> ObjectPath<'_> {
1099		match self {
1100			Self::Focus(inner) => inner.path(),
1101		}
1102	}
1103	fn sender(&self) -> UniqueName<'_> {
1104		match self {
1105			Self::Focus(inner) => inner.sender(),
1106		}
1107	}
1108}
1109
1110impl_from_user_facing_type_for_event_enum!(FocusEvent, Event::Focus);
1111impl_from_interface_event_enum_for_event!(FocusEvents, Event::Focus);
1112impl_try_from_event_for_interface_enum!(FocusEvents, Event::Focus);
1113event_wrapper_test_cases!(FocusEvents, FocusEvent);
1114impl HasMatchRule for FocusEvents {
1115	const MATCH_RULE_STRING: &'static str = "type='signal',interface='org.a11y.atspi.Event.Focus'";
1116}
1117impl HasInterfaceName for FocusEvents {
1118	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Focus";
1119}
1120#[cfg(feature = "zbus")]
1121impl EventWrapperMessageConversion for FocusEvents {
1122	fn try_from_message_interface_checked(msg: &zbus::Message) -> Result<Self, AtspiError> {
1123		let header = msg.header();
1124		let member = header.member().ok_or(AtspiError::MissingMember)?;
1125		match member.as_str() {
1126			FocusEvent::DBUS_MEMBER => {
1127				Ok(FocusEvents::Focus(FocusEvent::from_message_unchecked(msg)?))
1128			}
1129			_ => Err(AtspiError::MemberMatch(format!(
1130				"No matching member {member} for interface {}",
1131				Self::DBUS_INTERFACE,
1132			))),
1133		}
1134	}
1135}
1136#[cfg(feature = "zbus")]
1137impl TryFrom<&zbus::Message> for FocusEvents {
1138	type Error = AtspiError;
1139	fn try_from(msg: &zbus::Message) -> Result<Self, Self::Error> {
1140		Self::try_from_message(msg)
1141	}
1142}
1143impl_from_user_facing_event_for_interface_event_enum!(FocusEvent, FocusEvents, FocusEvents::Focus);
1144impl_try_from_event_for_user_facing_type!(FocusEvent, FocusEvents::Focus, Event::Focus);
1145impl HasRegistryEventString for FocusEvents {
1146	const REGISTRY_EVENT_STRING: &'static str = "Focus:";
1147}
1148
1149#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)]
1150pub enum KeyboardEvents {
1151	/// See: [`ModifiersEvent`].
1152	Modifiers(ModifiersEvent),
1153}
1154
1155impl EventTypeProperties for KeyboardEvents {
1156	fn member(&self) -> &'static str {
1157		match self {
1158			Self::Modifiers(inner) => inner.member(),
1159		}
1160	}
1161	fn match_rule(&self) -> &'static str {
1162		match self {
1163			Self::Modifiers(inner) => inner.match_rule(),
1164		}
1165	}
1166	fn interface(&self) -> &'static str {
1167		match self {
1168			Self::Modifiers(inner) => inner.interface(),
1169		}
1170	}
1171	fn registry_string(&self) -> &'static str {
1172		match self {
1173			Self::Modifiers(inner) => inner.registry_string(),
1174		}
1175	}
1176}
1177
1178impl EventProperties for KeyboardEvents {
1179	fn path(&self) -> ObjectPath<'_> {
1180		match self {
1181			Self::Modifiers(inner) => inner.path(),
1182		}
1183	}
1184	fn sender(&self) -> UniqueName<'_> {
1185		match self {
1186			Self::Modifiers(inner) => inner.sender(),
1187		}
1188	}
1189}
1190
1191impl_from_user_facing_type_for_event_enum!(ModifiersEvent, Event::Keyboard);
1192impl_from_interface_event_enum_for_event!(KeyboardEvents, Event::Keyboard);
1193impl_try_from_event_for_interface_enum!(KeyboardEvents, Event::Keyboard);
1194event_wrapper_test_cases!(KeyboardEvents, ModifiersEvent);
1195
1196impl HasMatchRule for KeyboardEvents {
1197	const MATCH_RULE_STRING: &'static str =
1198		"type='signal',interface='org.a11y.atspi.Event.Keyboard'";
1199}
1200
1201impl HasInterfaceName for KeyboardEvents {
1202	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Keyboard";
1203}
1204#[cfg(feature = "zbus")]
1205impl EventWrapperMessageConversion for KeyboardEvents {
1206	fn try_from_message_interface_checked(msg: &zbus::Message) -> Result<Self, AtspiError> {
1207		let header = msg.header();
1208		let member = header
1209			.member()
1210			.ok_or(AtspiError::MemberMatch("Event without member".into()))?;
1211		match member.as_str() {
1212			ModifiersEvent::DBUS_MEMBER => {
1213				Ok(KeyboardEvents::Modifiers(ModifiersEvent::from_message_unchecked(msg)?))
1214			}
1215			_ => Err(AtspiError::MemberMatch("No matching member for Keyboard".into())),
1216		}
1217	}
1218}
1219
1220#[cfg(feature = "zbus")]
1221impl TryFrom<&zbus::Message> for KeyboardEvents {
1222	type Error = AtspiError;
1223	fn try_from(msg: &zbus::Message) -> Result<Self, Self::Error> {
1224		Self::try_from_message(msg)
1225	}
1226}
1227
1228impl_from_user_facing_event_for_interface_event_enum!(
1229	ModifiersEvent,
1230	KeyboardEvents,
1231	KeyboardEvents::Modifiers
1232);
1233impl_try_from_event_for_user_facing_type!(
1234	ModifiersEvent,
1235	KeyboardEvents::Modifiers,
1236	Event::Keyboard
1237);
1238impl HasRegistryEventString for KeyboardEvents {
1239	const REGISTRY_EVENT_STRING: &'static str = "Keyboard:";
1240}
1241
1242#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)]
1243pub enum MouseEvents {
1244	/// See: [`AbsEvent`].
1245	Abs(AbsEvent),
1246	/// See: [`RelEvent`].
1247	Rel(RelEvent),
1248	/// See: [`ButtonEvent`].
1249	Button(ButtonEvent),
1250}
1251
1252impl EventTypeProperties for MouseEvents {
1253	fn member(&self) -> &'static str {
1254		match self {
1255			Self::Abs(inner) => inner.member(),
1256			Self::Rel(inner) => inner.member(),
1257			Self::Button(inner) => inner.member(),
1258		}
1259	}
1260	fn interface(&self) -> &'static str {
1261		match self {
1262			Self::Abs(inner) => inner.interface(),
1263			Self::Rel(inner) => inner.interface(),
1264			Self::Button(inner) => inner.interface(),
1265		}
1266	}
1267	fn match_rule(&self) -> &'static str {
1268		match self {
1269			Self::Abs(inner) => inner.match_rule(),
1270			Self::Rel(inner) => inner.match_rule(),
1271			Self::Button(inner) => inner.match_rule(),
1272		}
1273	}
1274	fn registry_string(&self) -> &'static str {
1275		match self {
1276			Self::Abs(inner) => inner.registry_string(),
1277			Self::Rel(inner) => inner.registry_string(),
1278			Self::Button(inner) => inner.registry_string(),
1279		}
1280	}
1281}
1282
1283impl EventProperties for MouseEvents {
1284	fn path(&self) -> ObjectPath<'_> {
1285		match self {
1286			Self::Abs(inner) => inner.path(),
1287			Self::Rel(inner) => inner.path(),
1288			Self::Button(inner) => inner.path(),
1289		}
1290	}
1291	fn sender(&self) -> UniqueName<'_> {
1292		match self {
1293			Self::Abs(inner) => inner.sender(),
1294			Self::Rel(inner) => inner.sender(),
1295			Self::Button(inner) => inner.sender(),
1296		}
1297	}
1298}
1299impl_from_user_facing_type_for_event_enum!(ButtonEvent, Event::Mouse);
1300impl_from_user_facing_type_for_event_enum!(RelEvent, Event::Mouse);
1301impl_from_user_facing_type_for_event_enum!(AbsEvent, Event::Mouse);
1302impl_from_interface_event_enum_for_event!(MouseEvents, Event::Mouse);
1303impl_try_from_event_for_interface_enum!(MouseEvents, Event::Mouse);
1304
1305event_wrapper_test_cases!(MouseEvents, AbsEvent);
1306
1307impl HasMatchRule for MouseEvents {
1308	const MATCH_RULE_STRING: &'static str = "type='signal',interface='org.a11y.atspi.Event.Mouse'";
1309}
1310
1311impl HasInterfaceName for MouseEvents {
1312	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Mouse";
1313}
1314#[cfg(feature = "zbus")]
1315impl EventWrapperMessageConversion for MouseEvents {
1316	fn try_from_message_interface_checked(msg: &zbus::Message) -> Result<Self, AtspiError> {
1317		let header = msg.header();
1318		let member = header.member().ok_or(AtspiError::MissingMember)?;
1319		match member.as_str() {
1320			AbsEvent::DBUS_MEMBER => Ok(MouseEvents::Abs(AbsEvent::from_message_unchecked(msg)?)),
1321			RelEvent::DBUS_MEMBER => Ok(MouseEvents::Rel(RelEvent::from_message_unchecked(msg)?)),
1322			ButtonEvent::DBUS_MEMBER => {
1323				Ok(MouseEvents::Button(ButtonEvent::from_message_unchecked(msg)?))
1324			}
1325			_ => Err(AtspiError::MemberMatch("No matching member for Mouse".into())),
1326		}
1327	}
1328}
1329
1330#[cfg(feature = "zbus")]
1331impl TryFrom<&zbus::Message> for MouseEvents {
1332	type Error = AtspiError;
1333	fn try_from(msg: &zbus::Message) -> Result<Self, Self::Error> {
1334		Self::try_from_message(msg)
1335	}
1336}
1337
1338impl_from_user_facing_event_for_interface_event_enum!(AbsEvent, MouseEvents, MouseEvents::Abs);
1339impl_try_from_event_for_user_facing_type!(AbsEvent, MouseEvents::Abs, Event::Mouse);
1340impl_from_user_facing_event_for_interface_event_enum!(RelEvent, MouseEvents, MouseEvents::Rel);
1341impl_try_from_event_for_user_facing_type!(RelEvent, MouseEvents::Rel, Event::Mouse);
1342impl_from_user_facing_event_for_interface_event_enum!(
1343	ButtonEvent,
1344	MouseEvents,
1345	MouseEvents::Button
1346);
1347impl_try_from_event_for_user_facing_type!(ButtonEvent, MouseEvents::Button, Event::Mouse);
1348impl HasRegistryEventString for MouseEvents {
1349	const REGISTRY_EVENT_STRING: &'static str = "Mouse:";
1350}
1351
1352impl HasRegistryEventString for TerminalEvents {
1353	const REGISTRY_EVENT_STRING: &'static str = "Terminal:";
1354}
1355
1356/// All events related to the `org.a11y.atspi.Event.Terminal` interface.
1357#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)]
1358pub enum TerminalEvents {
1359	/// See: [`LineChangedEvent`].
1360	LineChanged(LineChangedEvent),
1361	/// See: [`ColumnCountChangedEvent`].
1362	ColumnCountChanged(ColumnCountChangedEvent),
1363	/// See: [`LineCountChangedEvent`].
1364	LineCountChanged(LineCountChangedEvent),
1365	/// See: [`ApplicationChangedEvent`].
1366	ApplicationChanged(ApplicationChangedEvent),
1367	/// See: [`CharWidthChangedEvent`].
1368	CharWidthChanged(CharWidthChangedEvent),
1369}
1370
1371impl EventTypeProperties for TerminalEvents {
1372	fn member(&self) -> &'static str {
1373		match self {
1374			Self::LineChanged(inner) => inner.member(),
1375			Self::ColumnCountChanged(inner) => inner.member(),
1376			Self::LineCountChanged(inner) => inner.member(),
1377			Self::ApplicationChanged(inner) => inner.member(),
1378			Self::CharWidthChanged(inner) => inner.member(),
1379		}
1380	}
1381	fn interface(&self) -> &'static str {
1382		match self {
1383			Self::LineChanged(inner) => inner.interface(),
1384			Self::ColumnCountChanged(inner) => inner.interface(),
1385			Self::LineCountChanged(inner) => inner.interface(),
1386			Self::ApplicationChanged(inner) => inner.interface(),
1387			Self::CharWidthChanged(inner) => inner.interface(),
1388		}
1389	}
1390	fn match_rule(&self) -> &'static str {
1391		match self {
1392			Self::LineChanged(inner) => inner.match_rule(),
1393			Self::ColumnCountChanged(inner) => inner.match_rule(),
1394			Self::LineCountChanged(inner) => inner.match_rule(),
1395			Self::ApplicationChanged(inner) => inner.match_rule(),
1396			Self::CharWidthChanged(inner) => inner.match_rule(),
1397		}
1398	}
1399	fn registry_string(&self) -> &'static str {
1400		match self {
1401			Self::LineChanged(inner) => inner.registry_string(),
1402			Self::ColumnCountChanged(inner) => inner.registry_string(),
1403			Self::LineCountChanged(inner) => inner.registry_string(),
1404			Self::ApplicationChanged(inner) => inner.registry_string(),
1405			Self::CharWidthChanged(inner) => inner.registry_string(),
1406		}
1407	}
1408}
1409
1410impl EventProperties for TerminalEvents {
1411	fn path(&self) -> ObjectPath<'_> {
1412		match self {
1413			Self::LineChanged(inner) => inner.path(),
1414			Self::ColumnCountChanged(inner) => inner.path(),
1415			Self::LineCountChanged(inner) => inner.path(),
1416			Self::ApplicationChanged(inner) => inner.path(),
1417			Self::CharWidthChanged(inner) => inner.path(),
1418		}
1419	}
1420	fn sender(&self) -> UniqueName<'_> {
1421		match self {
1422			Self::LineChanged(inner) => inner.sender(),
1423			Self::ColumnCountChanged(inner) => inner.sender(),
1424			Self::LineCountChanged(inner) => inner.sender(),
1425			Self::ApplicationChanged(inner) => inner.sender(),
1426			Self::CharWidthChanged(inner) => inner.sender(),
1427		}
1428	}
1429}
1430
1431impl_from_user_facing_type_for_event_enum!(CharWidthChangedEvent, Event::Terminal);
1432impl_from_user_facing_type_for_event_enum!(ApplicationChangedEvent, Event::Terminal);
1433impl_from_user_facing_type_for_event_enum!(LineCountChangedEvent, Event::Terminal);
1434impl_from_user_facing_type_for_event_enum!(ColumnCountChangedEvent, Event::Terminal);
1435impl_from_user_facing_type_for_event_enum!(LineChangedEvent, Event::Terminal);
1436
1437impl_from_interface_event_enum_for_event!(TerminalEvents, Event::Terminal);
1438impl_try_from_event_for_interface_enum!(TerminalEvents, Event::Terminal);
1439
1440event_wrapper_test_cases!(TerminalEvents, LineChangedEvent);
1441
1442impl HasMatchRule for TerminalEvents {
1443	const MATCH_RULE_STRING: &'static str =
1444		"type='signal',interface='org.a11y.atspi.Event.Terminal'";
1445}
1446
1447impl HasInterfaceName for TerminalEvents {
1448	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Terminal";
1449}
1450
1451#[cfg(feature = "zbus")]
1452impl EventWrapperMessageConversion for TerminalEvents {
1453	fn try_from_message_interface_checked(msg: &zbus::Message) -> Result<Self, AtspiError> {
1454		let header = msg.header();
1455		let member = header
1456			.member()
1457			.ok_or(AtspiError::MemberMatch("Event without member".into()))?;
1458		match member.as_str() {
1459			LineChangedEvent::DBUS_MEMBER => {
1460				Ok(TerminalEvents::LineChanged(LineChangedEvent::from_message_unchecked(msg)?))
1461			}
1462			ColumnCountChangedEvent::DBUS_MEMBER => Ok(TerminalEvents::ColumnCountChanged(
1463				ColumnCountChangedEvent::from_message_unchecked(msg)?,
1464			)),
1465			LineCountChangedEvent::DBUS_MEMBER => Ok(TerminalEvents::LineCountChanged(
1466				LineCountChangedEvent::from_message_unchecked(msg)?,
1467			)),
1468			ApplicationChangedEvent::DBUS_MEMBER => Ok(TerminalEvents::ApplicationChanged(
1469				ApplicationChangedEvent::from_message_unchecked(msg)?,
1470			)),
1471			CharWidthChangedEvent::DBUS_MEMBER => Ok(TerminalEvents::CharWidthChanged(
1472				CharWidthChangedEvent::from_message_unchecked(msg)?,
1473			)),
1474			_ => Err(AtspiError::MemberMatch("No matching member for Terminal".into())),
1475		}
1476	}
1477}
1478
1479#[cfg(feature = "zbus")]
1480impl TryFrom<&zbus::Message> for TerminalEvents {
1481	type Error = AtspiError;
1482	fn try_from(msg: &zbus::Message) -> Result<Self, Self::Error> {
1483		Self::try_from_message(msg)
1484	}
1485}
1486
1487impl_from_user_facing_event_for_interface_event_enum!(
1488	LineChangedEvent,
1489	TerminalEvents,
1490	TerminalEvents::LineChanged
1491);
1492impl_try_from_event_for_user_facing_type!(
1493	LineChangedEvent,
1494	TerminalEvents::LineChanged,
1495	Event::Terminal
1496);
1497impl_from_user_facing_event_for_interface_event_enum!(
1498	ColumnCountChangedEvent,
1499	TerminalEvents,
1500	TerminalEvents::ColumnCountChanged
1501);
1502impl_try_from_event_for_user_facing_type!(
1503	ColumnCountChangedEvent,
1504	TerminalEvents::ColumnCountChanged,
1505	Event::Terminal
1506);
1507impl_from_user_facing_event_for_interface_event_enum!(
1508	LineCountChangedEvent,
1509	TerminalEvents,
1510	TerminalEvents::LineCountChanged
1511);
1512impl_try_from_event_for_user_facing_type!(
1513	LineCountChangedEvent,
1514	TerminalEvents::LineCountChanged,
1515	Event::Terminal
1516);
1517impl_from_user_facing_event_for_interface_event_enum!(
1518	ApplicationChangedEvent,
1519	TerminalEvents,
1520	TerminalEvents::ApplicationChanged
1521);
1522impl_try_from_event_for_user_facing_type!(
1523	ApplicationChangedEvent,
1524	TerminalEvents::ApplicationChanged,
1525	Event::Terminal
1526);
1527impl_from_user_facing_event_for_interface_event_enum!(
1528	CharWidthChangedEvent,
1529	TerminalEvents,
1530	TerminalEvents::CharWidthChanged
1531);
1532impl_try_from_event_for_user_facing_type!(
1533	CharWidthChangedEvent,
1534	TerminalEvents::CharWidthChanged,
1535	Event::Terminal
1536);
1537
1538/// All events on the `org.a11y.atspi.Event.Window` interface.
1539#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)]
1540pub enum WindowEvents {
1541	/// See: [`WindowPropertyChangeEvent`].
1542	PropertyChange(WindowPropertyChangeEvent),
1543	/// See: [`MinimizeEvent`].
1544	Minimize(MinimizeEvent),
1545	/// See: [`MaximizeEvent`].
1546	Maximize(MaximizeEvent),
1547	/// See: [`RestoreEvent`].
1548	Restore(RestoreEvent),
1549	/// See: [`CloseEvent`].
1550	Close(CloseEvent),
1551	/// See: [`CreateEvent`].
1552	Create(CreateEvent),
1553	/// See: [`ReparentEvent`].
1554	Reparent(ReparentEvent),
1555	/// See: [`DesktopCreateEvent`].
1556	DesktopCreate(DesktopCreateEvent),
1557	/// See: [`DesktopDestroyEvent`].
1558	DesktopDestroy(DesktopDestroyEvent),
1559	/// See: [`DestroyEvent`].
1560	Destroy(DestroyEvent),
1561	/// See: [`ActivateEvent`].
1562	Activate(ActivateEvent),
1563	/// See: [`DeactivateEvent`].
1564	Deactivate(DeactivateEvent),
1565	/// See: [`RaiseEvent`].
1566	Raise(RaiseEvent),
1567	/// See: [`LowerEvent`].
1568	Lower(LowerEvent),
1569	/// See: [`MoveEvent`].
1570	Move(MoveEvent),
1571	/// See: [`ResizeEvent`].
1572	Resize(ResizeEvent),
1573	/// See: [`ShadeEvent`].
1574	Shade(ShadeEvent),
1575	/// See: [`UUshadeEvent`].
1576	UUshade(UUshadeEvent),
1577	/// See: [`RestyleEvent`].
1578	Restyle(RestyleEvent),
1579}
1580
1581impl EventTypeProperties for WindowEvents {
1582	fn member(&self) -> &'static str {
1583		match self {
1584			Self::PropertyChange(inner) => inner.member(),
1585			Self::Minimize(inner) => inner.member(),
1586			Self::Maximize(inner) => inner.member(),
1587			Self::Restore(inner) => inner.member(),
1588			Self::Close(inner) => inner.member(),
1589			Self::Create(inner) => inner.member(),
1590			Self::Reparent(inner) => inner.member(),
1591			Self::DesktopCreate(inner) => inner.member(),
1592			Self::DesktopDestroy(inner) => inner.member(),
1593			Self::Destroy(inner) => inner.member(),
1594			Self::Activate(inner) => inner.member(),
1595			Self::Deactivate(inner) => inner.member(),
1596			Self::Raise(inner) => inner.member(),
1597			Self::Lower(inner) => inner.member(),
1598			Self::Move(inner) => inner.member(),
1599			Self::Resize(inner) => inner.member(),
1600			Self::Shade(inner) => inner.member(),
1601			Self::UUshade(inner) => inner.member(),
1602			Self::Restyle(inner) => inner.member(),
1603		}
1604	}
1605	fn interface(&self) -> &'static str {
1606		match self {
1607			Self::PropertyChange(inner) => inner.interface(),
1608			Self::Minimize(inner) => inner.interface(),
1609			Self::Maximize(inner) => inner.interface(),
1610			Self::Restore(inner) => inner.interface(),
1611			Self::Close(inner) => inner.interface(),
1612			Self::Create(inner) => inner.interface(),
1613			Self::Reparent(inner) => inner.interface(),
1614			Self::DesktopCreate(inner) => inner.interface(),
1615			Self::DesktopDestroy(inner) => inner.interface(),
1616			Self::Destroy(inner) => inner.interface(),
1617			Self::Activate(inner) => inner.interface(),
1618			Self::Deactivate(inner) => inner.interface(),
1619			Self::Raise(inner) => inner.interface(),
1620			Self::Lower(inner) => inner.interface(),
1621			Self::Move(inner) => inner.interface(),
1622			Self::Resize(inner) => inner.interface(),
1623			Self::Shade(inner) => inner.interface(),
1624			Self::UUshade(inner) => inner.interface(),
1625			Self::Restyle(inner) => inner.interface(),
1626		}
1627	}
1628	fn match_rule(&self) -> &'static str {
1629		match self {
1630			Self::PropertyChange(inner) => inner.match_rule(),
1631			Self::Minimize(inner) => inner.match_rule(),
1632			Self::Maximize(inner) => inner.match_rule(),
1633			Self::Restore(inner) => inner.match_rule(),
1634			Self::Close(inner) => inner.match_rule(),
1635			Self::Create(inner) => inner.match_rule(),
1636			Self::Reparent(inner) => inner.match_rule(),
1637			Self::DesktopCreate(inner) => inner.match_rule(),
1638			Self::DesktopDestroy(inner) => inner.match_rule(),
1639			Self::Destroy(inner) => inner.match_rule(),
1640			Self::Activate(inner) => inner.match_rule(),
1641			Self::Deactivate(inner) => inner.match_rule(),
1642			Self::Raise(inner) => inner.match_rule(),
1643			Self::Lower(inner) => inner.match_rule(),
1644			Self::Move(inner) => inner.match_rule(),
1645			Self::Resize(inner) => inner.match_rule(),
1646			Self::Shade(inner) => inner.match_rule(),
1647			Self::UUshade(inner) => inner.match_rule(),
1648			Self::Restyle(inner) => inner.match_rule(),
1649		}
1650	}
1651	fn registry_string(&self) -> &'static str {
1652		match self {
1653			Self::PropertyChange(inner) => inner.registry_string(),
1654			Self::Minimize(inner) => inner.registry_string(),
1655			Self::Maximize(inner) => inner.registry_string(),
1656			Self::Restore(inner) => inner.registry_string(),
1657			Self::Close(inner) => inner.registry_string(),
1658			Self::Create(inner) => inner.registry_string(),
1659			Self::Reparent(inner) => inner.registry_string(),
1660			Self::DesktopCreate(inner) => inner.registry_string(),
1661			Self::DesktopDestroy(inner) => inner.registry_string(),
1662			Self::Destroy(inner) => inner.registry_string(),
1663			Self::Activate(inner) => inner.registry_string(),
1664			Self::Deactivate(inner) => inner.registry_string(),
1665			Self::Raise(inner) => inner.registry_string(),
1666			Self::Lower(inner) => inner.registry_string(),
1667			Self::Move(inner) => inner.registry_string(),
1668			Self::Resize(inner) => inner.registry_string(),
1669			Self::Shade(inner) => inner.registry_string(),
1670			Self::UUshade(inner) => inner.registry_string(),
1671			Self::Restyle(inner) => inner.registry_string(),
1672		}
1673	}
1674}
1675
1676impl EventProperties for WindowEvents {
1677	fn path(&self) -> ObjectPath<'_> {
1678		match self {
1679			Self::PropertyChange(inner) => inner.path(),
1680			Self::Minimize(inner) => inner.path(),
1681			Self::Maximize(inner) => inner.path(),
1682			Self::Restore(inner) => inner.path(),
1683			Self::Close(inner) => inner.path(),
1684			Self::Create(inner) => inner.path(),
1685			Self::Reparent(inner) => inner.path(),
1686			Self::DesktopCreate(inner) => inner.path(),
1687			Self::DesktopDestroy(inner) => inner.path(),
1688			Self::Destroy(inner) => inner.path(),
1689			Self::Activate(inner) => inner.path(),
1690			Self::Deactivate(inner) => inner.path(),
1691			Self::Raise(inner) => inner.path(),
1692			Self::Lower(inner) => inner.path(),
1693			Self::Move(inner) => inner.path(),
1694			Self::Resize(inner) => inner.path(),
1695			Self::Shade(inner) => inner.path(),
1696			Self::UUshade(inner) => inner.path(),
1697			Self::Restyle(inner) => inner.path(),
1698		}
1699	}
1700	fn sender(&self) -> UniqueName<'_> {
1701		match self {
1702			Self::PropertyChange(inner) => inner.sender(),
1703			Self::Minimize(inner) => inner.sender(),
1704			Self::Maximize(inner) => inner.sender(),
1705			Self::Restore(inner) => inner.sender(),
1706			Self::Close(inner) => inner.sender(),
1707			Self::Create(inner) => inner.sender(),
1708			Self::Reparent(inner) => inner.sender(),
1709			Self::DesktopCreate(inner) => inner.sender(),
1710			Self::DesktopDestroy(inner) => inner.sender(),
1711			Self::Destroy(inner) => inner.sender(),
1712			Self::Activate(inner) => inner.sender(),
1713			Self::Deactivate(inner) => inner.sender(),
1714			Self::Raise(inner) => inner.sender(),
1715			Self::Lower(inner) => inner.sender(),
1716			Self::Move(inner) => inner.sender(),
1717			Self::Resize(inner) => inner.sender(),
1718			Self::Shade(inner) => inner.sender(),
1719			Self::UUshade(inner) => inner.sender(),
1720			Self::Restyle(inner) => inner.sender(),
1721		}
1722	}
1723}
1724
1725impl_from_user_facing_type_for_event_enum!(ReparentEvent, Event::Window);
1726impl_from_user_facing_type_for_event_enum!(CloseEvent, Event::Window);
1727impl_from_user_facing_type_for_event_enum!(RestoreEvent, Event::Window);
1728impl_from_user_facing_type_for_event_enum!(MaximizeEvent, Event::Window);
1729impl_from_user_facing_type_for_event_enum!(MinimizeEvent, Event::Window);
1730impl_from_user_facing_type_for_event_enum!(WindowPropertyChangeEvent, Event::Window);
1731impl_from_user_facing_type_for_event_enum!(RestyleEvent, Event::Window);
1732impl_from_user_facing_type_for_event_enum!(UUshadeEvent, Event::Window);
1733impl_from_user_facing_type_for_event_enum!(ShadeEvent, Event::Window);
1734impl_from_user_facing_type_for_event_enum!(ResizeEvent, Event::Window);
1735impl_from_user_facing_type_for_event_enum!(MoveEvent, Event::Window);
1736impl_from_user_facing_type_for_event_enum!(LowerEvent, Event::Window);
1737impl_from_user_facing_type_for_event_enum!(RaiseEvent, Event::Window);
1738impl_from_user_facing_type_for_event_enum!(DeactivateEvent, Event::Window);
1739impl_from_user_facing_type_for_event_enum!(ActivateEvent, Event::Window);
1740impl_from_user_facing_type_for_event_enum!(DestroyEvent, Event::Window);
1741impl_from_user_facing_type_for_event_enum!(DesktopDestroyEvent, Event::Window);
1742impl_from_user_facing_type_for_event_enum!(DesktopCreateEvent, Event::Window);
1743impl_from_user_facing_type_for_event_enum!(CreateEvent, Event::Window);
1744
1745impl_from_interface_event_enum_for_event!(WindowEvents, Event::Window);
1746impl_try_from_event_for_interface_enum!(WindowEvents, Event::Window);
1747
1748event_wrapper_test_cases!(WindowEvents, MoveEvent);
1749
1750impl HasMatchRule for WindowEvents {
1751	const MATCH_RULE_STRING: &'static str = "type='signal',interface='org.a11y.atspi.Event.Window'";
1752}
1753
1754impl HasInterfaceName for WindowEvents {
1755	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Window";
1756}
1757
1758#[cfg(feature = "zbus")]
1759impl EventWrapperMessageConversion for WindowEvents {
1760	fn try_from_message_interface_checked(msg: &zbus::Message) -> Result<Self, AtspiError> {
1761		let header = msg.header();
1762		let member = header.member().ok_or(AtspiError::MissingMember)?;
1763		match member.as_str() {
1764			WindowPropertyChangeEvent::DBUS_MEMBER => Ok(WindowEvents::PropertyChange(
1765				WindowPropertyChangeEvent::from_message_unchecked(msg)?,
1766			)),
1767			MinimizeEvent::DBUS_MEMBER => {
1768				Ok(WindowEvents::Minimize(MinimizeEvent::from_message_unchecked(msg)?))
1769			}
1770			MaximizeEvent::DBUS_MEMBER => {
1771				Ok(WindowEvents::Maximize(MaximizeEvent::from_message_unchecked(msg)?))
1772			}
1773			RestoreEvent::DBUS_MEMBER => {
1774				Ok(WindowEvents::Restore(RestoreEvent::from_message_unchecked(msg)?))
1775			}
1776			"Close" => Ok(WindowEvents::Close(CloseEvent::from_message_unchecked(msg)?)),
1777			CreateEvent::DBUS_MEMBER => {
1778				Ok(WindowEvents::Create(CreateEvent::from_message_unchecked(msg)?))
1779			}
1780			ReparentEvent::DBUS_MEMBER => {
1781				Ok(WindowEvents::Reparent(ReparentEvent::from_message_unchecked(msg)?))
1782			}
1783			"DesktopCreate" => {
1784				Ok(WindowEvents::DesktopCreate(DesktopCreateEvent::from_message_unchecked(msg)?))
1785			}
1786			"DesktopDestroy" => {
1787				Ok(WindowEvents::DesktopDestroy(DesktopDestroyEvent::from_message_unchecked(msg)?))
1788			}
1789			"Destroy" => Ok(WindowEvents::Destroy(DestroyEvent::from_message_unchecked(msg)?)),
1790			"Activate" => Ok(WindowEvents::Activate(ActivateEvent::from_message_unchecked(msg)?)),
1791			"Deactivate" => {
1792				Ok(WindowEvents::Deactivate(DeactivateEvent::from_message_unchecked(msg)?))
1793			}
1794			"Raise" => Ok(WindowEvents::Raise(RaiseEvent::from_message_unchecked(msg)?)),
1795			"Lower" => Ok(WindowEvents::Lower(LowerEvent::from_message_unchecked(msg)?)),
1796			"Move" => Ok(WindowEvents::Move(MoveEvent::from_message_unchecked(msg)?)),
1797			"Resize" => Ok(WindowEvents::Resize(ResizeEvent::from_message_unchecked(msg)?)),
1798			"Shade" => Ok(WindowEvents::Shade(ShadeEvent::from_message_unchecked(msg)?)),
1799			"uUshade" => Ok(WindowEvents::UUshade(UUshadeEvent::from_message_unchecked(msg)?)),
1800			"Restyle" => Ok(WindowEvents::Restyle(RestyleEvent::from_message_unchecked(msg)?)),
1801			_ => Err(AtspiError::MemberMatch("No matching member for Window".into())),
1802		}
1803	}
1804}
1805
1806#[cfg(feature = "zbus")]
1807impl TryFrom<&zbus::Message> for WindowEvents {
1808	type Error = AtspiError;
1809	fn try_from(msg: &zbus::Message) -> Result<Self, Self::Error> {
1810		Self::try_from_message(msg)
1811	}
1812}
1813
1814impl_from_user_facing_event_for_interface_event_enum!(
1815	WindowPropertyChangeEvent,
1816	WindowEvents,
1817	WindowEvents::PropertyChange
1818);
1819impl_try_from_event_for_user_facing_type!(
1820	WindowPropertyChangeEvent,
1821	WindowEvents::PropertyChange,
1822	Event::Window
1823);
1824impl_from_user_facing_event_for_interface_event_enum!(
1825	MinimizeEvent,
1826	WindowEvents,
1827	WindowEvents::Minimize
1828);
1829impl_try_from_event_for_user_facing_type!(MinimizeEvent, WindowEvents::Minimize, Event::Window);
1830impl_from_user_facing_event_for_interface_event_enum!(
1831	MaximizeEvent,
1832	WindowEvents,
1833	WindowEvents::Maximize
1834);
1835impl_try_from_event_for_user_facing_type!(MaximizeEvent, WindowEvents::Maximize, Event::Window);
1836impl_from_user_facing_event_for_interface_event_enum!(
1837	RestoreEvent,
1838	WindowEvents,
1839	WindowEvents::Restore
1840);
1841impl_try_from_event_for_user_facing_type!(RestoreEvent, WindowEvents::Restore, Event::Window);
1842impl_from_user_facing_event_for_interface_event_enum!(
1843	CloseEvent,
1844	WindowEvents,
1845	WindowEvents::Close
1846);
1847impl_try_from_event_for_user_facing_type!(CloseEvent, WindowEvents::Close, Event::Window);
1848impl_from_user_facing_event_for_interface_event_enum!(
1849	CreateEvent,
1850	WindowEvents,
1851	WindowEvents::Create
1852);
1853impl_try_from_event_for_user_facing_type!(CreateEvent, WindowEvents::Create, Event::Window);
1854impl_from_user_facing_event_for_interface_event_enum!(
1855	ReparentEvent,
1856	WindowEvents,
1857	WindowEvents::Reparent
1858);
1859impl_try_from_event_for_user_facing_type!(ReparentEvent, WindowEvents::Reparent, Event::Window);
1860impl_from_user_facing_event_for_interface_event_enum!(
1861	DesktopCreateEvent,
1862	WindowEvents,
1863	WindowEvents::DesktopCreate
1864);
1865impl_try_from_event_for_user_facing_type!(
1866	DesktopCreateEvent,
1867	WindowEvents::DesktopCreate,
1868	Event::Window
1869);
1870impl_from_user_facing_event_for_interface_event_enum!(
1871	DesktopDestroyEvent,
1872	WindowEvents,
1873	WindowEvents::DesktopDestroy
1874);
1875impl_try_from_event_for_user_facing_type!(
1876	DesktopDestroyEvent,
1877	WindowEvents::DesktopDestroy,
1878	Event::Window
1879);
1880impl_from_user_facing_event_for_interface_event_enum!(
1881	DestroyEvent,
1882	WindowEvents,
1883	WindowEvents::Destroy
1884);
1885impl_try_from_event_for_user_facing_type!(DestroyEvent, WindowEvents::Destroy, Event::Window);
1886impl_from_user_facing_event_for_interface_event_enum!(
1887	ActivateEvent,
1888	WindowEvents,
1889	WindowEvents::Activate
1890);
1891impl_try_from_event_for_user_facing_type!(ActivateEvent, WindowEvents::Activate, Event::Window);
1892impl_from_user_facing_event_for_interface_event_enum!(
1893	DeactivateEvent,
1894	WindowEvents,
1895	WindowEvents::Deactivate
1896);
1897impl_try_from_event_for_user_facing_type!(DeactivateEvent, WindowEvents::Deactivate, Event::Window);
1898impl_from_user_facing_event_for_interface_event_enum!(
1899	RaiseEvent,
1900	WindowEvents,
1901	WindowEvents::Raise
1902);
1903impl_try_from_event_for_user_facing_type!(RaiseEvent, WindowEvents::Raise, Event::Window);
1904impl_from_user_facing_event_for_interface_event_enum!(
1905	LowerEvent,
1906	WindowEvents,
1907	WindowEvents::Lower
1908);
1909impl_try_from_event_for_user_facing_type!(LowerEvent, WindowEvents::Lower, Event::Window);
1910impl_from_user_facing_event_for_interface_event_enum!(MoveEvent, WindowEvents, WindowEvents::Move);
1911impl_try_from_event_for_user_facing_type!(MoveEvent, WindowEvents::Move, Event::Window);
1912impl_from_user_facing_event_for_interface_event_enum!(
1913	ResizeEvent,
1914	WindowEvents,
1915	WindowEvents::Resize
1916);
1917impl_try_from_event_for_user_facing_type!(ResizeEvent, WindowEvents::Resize, Event::Window);
1918impl_from_user_facing_event_for_interface_event_enum!(
1919	ShadeEvent,
1920	WindowEvents,
1921	WindowEvents::Shade
1922);
1923impl_try_from_event_for_user_facing_type!(ShadeEvent, WindowEvents::Shade, Event::Window);
1924impl_from_user_facing_event_for_interface_event_enum!(
1925	UUshadeEvent,
1926	WindowEvents,
1927	WindowEvents::UUshade
1928);
1929impl_try_from_event_for_user_facing_type!(UUshadeEvent, WindowEvents::UUshade, Event::Window);
1930impl_from_user_facing_event_for_interface_event_enum!(
1931	RestyleEvent,
1932	WindowEvents,
1933	WindowEvents::Restyle
1934);
1935impl_try_from_event_for_user_facing_type!(RestyleEvent, WindowEvents::Restyle, Event::Window);
1936impl HasRegistryEventString for WindowEvents {
1937	const REGISTRY_EVENT_STRING: &'static str = "Window:";
1938}