atspi_common/events/
event_wrappers.rs

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