atspi_common/events/
document.rs

1use crate::{
2	error::AtspiError,
3	events::{BusProperties, EventBodyOwned, HasMatchRule, HasRegistryEventString, ObjectRef},
4	Event, EventProperties, EventTypeProperties,
5};
6use zbus_names::UniqueName;
7use zvariant::{ObjectPath, OwnedValue};
8
9#[derive(Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)]
10pub enum DocumentEvents {
11	/// See: [`LoadCompleteEvent`].
12	LoadComplete(LoadCompleteEvent),
13	/// See: [`ReloadEvent`].
14	Reload(ReloadEvent),
15	/// See: [`LoadStoppedEvent`].
16	LoadStopped(LoadStoppedEvent),
17	/// See: [`ContentChangedEvent`].
18	ContentChanged(ContentChangedEvent),
19	/// See: [`AttributesChangedEvent`].
20	AttributesChanged(AttributesChangedEvent),
21	/// See: [`PageChangedEvent`].
22	PageChanged(PageChangedEvent),
23}
24
25impl EventTypeProperties for DocumentEvents {
26	fn member(&self) -> &'static str {
27		match self {
28			Self::LoadComplete(inner) => inner.member(),
29			Self::Reload(inner) => inner.member(),
30			Self::LoadStopped(inner) => inner.member(),
31			Self::ContentChanged(inner) => inner.member(),
32			Self::AttributesChanged(inner) => inner.member(),
33			Self::PageChanged(inner) => inner.member(),
34		}
35	}
36	fn interface(&self) -> &'static str {
37		match self {
38			Self::LoadComplete(inner) => inner.interface(),
39			Self::Reload(inner) => inner.interface(),
40			Self::LoadStopped(inner) => inner.interface(),
41			Self::ContentChanged(inner) => inner.interface(),
42			Self::AttributesChanged(inner) => inner.interface(),
43			Self::PageChanged(inner) => inner.interface(),
44		}
45	}
46	fn match_rule(&self) -> &'static str {
47		match self {
48			Self::LoadComplete(inner) => inner.match_rule(),
49			Self::Reload(inner) => inner.match_rule(),
50			Self::LoadStopped(inner) => inner.match_rule(),
51			Self::ContentChanged(inner) => inner.match_rule(),
52			Self::AttributesChanged(inner) => inner.match_rule(),
53			Self::PageChanged(inner) => inner.match_rule(),
54		}
55	}
56	fn registry_string(&self) -> &'static str {
57		match self {
58			Self::LoadComplete(inner) => inner.registry_string(),
59			Self::Reload(inner) => inner.registry_string(),
60			Self::LoadStopped(inner) => inner.registry_string(),
61			Self::ContentChanged(inner) => inner.registry_string(),
62			Self::AttributesChanged(inner) => inner.registry_string(),
63			Self::PageChanged(inner) => inner.registry_string(),
64		}
65	}
66}
67
68impl EventProperties for DocumentEvents {
69	fn path(&self) -> ObjectPath<'_> {
70		match self {
71			Self::LoadComplete(inner) => inner.path(),
72			Self::Reload(inner) => inner.path(),
73			Self::LoadStopped(inner) => inner.path(),
74			Self::ContentChanged(inner) => inner.path(),
75			Self::AttributesChanged(inner) => inner.path(),
76			Self::PageChanged(inner) => inner.path(),
77		}
78	}
79	fn sender(&self) -> UniqueName<'_> {
80		match self {
81			Self::LoadComplete(inner) => inner.sender(),
82			Self::Reload(inner) => inner.sender(),
83			Self::LoadStopped(inner) => inner.sender(),
84			Self::ContentChanged(inner) => inner.sender(),
85			Self::AttributesChanged(inner) => inner.sender(),
86			Self::PageChanged(inner) => inner.sender(),
87		}
88	}
89}
90
91impl_from_interface_event_enum_for_event!(DocumentEvents, Event::Document);
92impl_try_from_event_for_user_facing_event_type!(DocumentEvents, Event::Document);
93event_wrapper_test_cases!(DocumentEvents, LoadCompleteEvent);
94
95impl HasMatchRule for DocumentEvents {
96	const MATCH_RULE_STRING: &'static str =
97		"type='signal',interface='org.a11y.atspi.Event.Document'";
98}
99
100/// An event triggered by the completion of a document load action.
101/// For example: a web page has finished loading its initial payload, or
102/// `LibreOffice` has loaded a document from disk.
103#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
104pub struct LoadCompleteEvent {
105	/// The [`ObjectRef`] which the event applies to.
106	pub item: crate::events::ObjectRef,
107}
108
109/// An event triggered by a reloading of a document.
110/// For example: pressing F5, or `Control + r` will reload a page in a web browser.
111#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
112pub struct ReloadEvent {
113	/// The [`ObjectRef`] which the event applies to.
114	pub item: crate::events::ObjectRef,
115}
116
117/// An event triggered by the cancelling of a document load.
118/// For example: during the loading of a large web page, a user may press `Escape` to stop loading the page.
119#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
120pub struct LoadStoppedEvent {
121	/// The [`ObjectRef`] which the event applies to.
122	pub item: crate::events::ObjectRef,
123}
124
125#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
126pub struct ContentChangedEvent {
127	/// The [`ObjectRef`] which the event applies to.
128	pub item: crate::events::ObjectRef,
129}
130
131#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
132pub struct AttributesChangedEvent {
133	/// The [`ObjectRef`] which the event applies to.
134	pub item: crate::events::ObjectRef,
135}
136
137#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
138pub struct PageChangedEvent {
139	/// The [`ObjectRef`] which the event applies to.
140	pub item: crate::events::ObjectRef,
141}
142
143impl BusProperties for LoadCompleteEvent {
144	const DBUS_MEMBER: &'static str = "LoadComplete";
145	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
146	const MATCH_RULE_STRING: &'static str =
147		"type='signal',interface='org.a11y.atspi.Event.Document',member='LoadComplete'";
148	const REGISTRY_EVENT_STRING: &'static str = "Document:";
149
150	type Body = EventBodyOwned;
151
152	fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
153		Ok(Self { item })
154	}
155	fn body(&self) -> Self::Body {
156		let copy = self.clone();
157		copy.into()
158	}
159}
160
161impl BusProperties for ReloadEvent {
162	const DBUS_MEMBER: &'static str = "Reload";
163	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
164	const MATCH_RULE_STRING: &'static str =
165		"type='signal',interface='org.a11y.atspi.Event.Document',member='Reload'";
166	const REGISTRY_EVENT_STRING: &'static str = "Document:";
167
168	type Body = EventBodyOwned;
169
170	fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
171		Ok(Self { item })
172	}
173	fn body(&self) -> Self::Body {
174		let copy = self.clone();
175		copy.into()
176	}
177}
178
179impl BusProperties for LoadStoppedEvent {
180	const DBUS_MEMBER: &'static str = "LoadStopped";
181	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
182	const MATCH_RULE_STRING: &'static str =
183		"type='signal',interface='org.a11y.atspi.Event.Document',member='LoadStopped'";
184	const REGISTRY_EVENT_STRING: &'static str = "Document:";
185
186	type Body = EventBodyOwned;
187
188	fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
189		Ok(Self { item })
190	}
191	fn body(&self) -> Self::Body {
192		let copy = self.clone();
193		copy.into()
194	}
195}
196
197impl BusProperties for ContentChangedEvent {
198	const DBUS_MEMBER: &'static str = "ContentChanged";
199	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
200	const MATCH_RULE_STRING: &'static str =
201		"type='signal',interface='org.a11y.atspi.Event.Document',member='ContentChanged'";
202	const REGISTRY_EVENT_STRING: &'static str = "Document:";
203
204	type Body = EventBodyOwned;
205
206	fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
207		Ok(Self { item })
208	}
209	fn body(&self) -> Self::Body {
210		let copy = self.clone();
211		copy.into()
212	}
213}
214
215impl BusProperties for AttributesChangedEvent {
216	const DBUS_MEMBER: &'static str = "AttributesChanged";
217	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
218	const MATCH_RULE_STRING: &'static str =
219		"type='signal',interface='org.a11y.atspi.Event.Document',member='AttributesChanged'";
220	const REGISTRY_EVENT_STRING: &'static str = "Document:";
221
222	type Body = EventBodyOwned;
223
224	fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
225		Ok(Self { item })
226	}
227	fn body(&self) -> Self::Body {
228		let copy = self.clone();
229		copy.into()
230	}
231}
232
233impl BusProperties for PageChangedEvent {
234	const DBUS_MEMBER: &'static str = "PageChanged";
235	const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Document";
236	const MATCH_RULE_STRING: &'static str =
237		"type='signal',interface='org.a11y.atspi.Event.Document',member='PageChanged'";
238	const REGISTRY_EVENT_STRING: &'static str = "Document:";
239
240	type Body = EventBodyOwned;
241
242	fn from_message_parts(item: ObjectRef, _body: Self::Body) -> Result<Self, AtspiError> {
243		Ok(Self { item })
244	}
245	fn body(&self) -> Self::Body {
246		let copy = self.clone();
247		copy.into()
248	}
249}
250
251#[cfg(feature = "zbus")]
252impl TryFrom<&zbus::Message> for DocumentEvents {
253	type Error = AtspiError;
254	fn try_from(ev: &zbus::Message) -> Result<Self, Self::Error> {
255		let header = ev.header();
256		let member = header
257			.member()
258			.ok_or(AtspiError::MemberMatch("Event without member".into()))?;
259		match member.as_str() {
260			"LoadComplete" => Ok(DocumentEvents::LoadComplete(ev.try_into()?)),
261			"Reload" => Ok(DocumentEvents::Reload(ev.try_into()?)),
262			"LoadStopped" => Ok(DocumentEvents::LoadStopped(ev.try_into()?)),
263			"ContentChanged" => Ok(DocumentEvents::ContentChanged(ev.try_into()?)),
264			"AttributesChanged" => Ok(DocumentEvents::AttributesChanged(ev.try_into()?)),
265			"PageChanged" => Ok(DocumentEvents::PageChanged(ev.try_into()?)),
266			_ => Err(AtspiError::MemberMatch("No matching member for Document".into())),
267		}
268	}
269}
270
271impl_from_user_facing_event_for_interface_event_enum!(
272	LoadCompleteEvent,
273	DocumentEvents,
274	DocumentEvents::LoadComplete
275);
276impl_from_user_facing_type_for_event_enum!(LoadCompleteEvent, Event::Document);
277impl_try_from_event_for_user_facing_type!(
278	LoadCompleteEvent,
279	DocumentEvents::LoadComplete,
280	Event::Document
281);
282
283event_test_cases!(LoadCompleteEvent);
284impl_to_dbus_message!(LoadCompleteEvent);
285impl_from_dbus_message!(LoadCompleteEvent);
286impl_event_properties!(LoadCompleteEvent);
287impl From<LoadCompleteEvent> for EventBodyOwned {
288	fn from(_event: LoadCompleteEvent) -> Self {
289		EventBodyOwned {
290			properties: std::collections::HashMap::new(),
291			kind: String::default(),
292			detail1: i32::default(),
293			detail2: i32::default(),
294			any_data: OwnedValue::from(0u8),
295		}
296	}
297}
298
299impl_from_user_facing_event_for_interface_event_enum!(
300	ReloadEvent,
301	DocumentEvents,
302	DocumentEvents::Reload
303);
304impl_from_user_facing_type_for_event_enum!(ReloadEvent, Event::Document);
305impl_try_from_event_for_user_facing_type!(ReloadEvent, DocumentEvents::Reload, Event::Document);
306
307event_test_cases!(ReloadEvent);
308impl_to_dbus_message!(ReloadEvent);
309impl_from_dbus_message!(ReloadEvent);
310impl_event_properties!(ReloadEvent);
311impl From<ReloadEvent> for EventBodyOwned {
312	fn from(_event: ReloadEvent) -> Self {
313		EventBodyOwned {
314			properties: std::collections::HashMap::new(),
315			kind: String::default(),
316			detail1: i32::default(),
317			detail2: i32::default(),
318			any_data: OwnedValue::from(0u8),
319		}
320	}
321}
322
323impl_from_user_facing_event_for_interface_event_enum!(
324	LoadStoppedEvent,
325	DocumentEvents,
326	DocumentEvents::LoadStopped
327);
328impl_from_user_facing_type_for_event_enum!(LoadStoppedEvent, Event::Document);
329impl_try_from_event_for_user_facing_type!(
330	LoadStoppedEvent,
331	DocumentEvents::LoadStopped,
332	Event::Document
333);
334
335event_test_cases!(LoadStoppedEvent);
336impl_to_dbus_message!(LoadStoppedEvent);
337impl_from_dbus_message!(LoadStoppedEvent);
338impl_event_properties!(LoadStoppedEvent);
339impl From<LoadStoppedEvent> for EventBodyOwned {
340	fn from(_event: LoadStoppedEvent) -> Self {
341		EventBodyOwned {
342			properties: std::collections::HashMap::new(),
343			kind: String::default(),
344			detail1: i32::default(),
345			detail2: i32::default(),
346			any_data: OwnedValue::from(0u8),
347		}
348	}
349}
350
351impl_from_user_facing_event_for_interface_event_enum!(
352	ContentChangedEvent,
353	DocumentEvents,
354	DocumentEvents::ContentChanged
355);
356impl_from_user_facing_type_for_event_enum!(ContentChangedEvent, Event::Document);
357impl_try_from_event_for_user_facing_type!(
358	ContentChangedEvent,
359	DocumentEvents::ContentChanged,
360	Event::Document
361);
362
363event_test_cases!(ContentChangedEvent);
364impl_to_dbus_message!(ContentChangedEvent);
365impl_from_dbus_message!(ContentChangedEvent);
366impl_event_properties!(ContentChangedEvent);
367impl From<ContentChangedEvent> for EventBodyOwned {
368	fn from(_event: ContentChangedEvent) -> Self {
369		EventBodyOwned {
370			properties: std::collections::HashMap::new(),
371			kind: String::default(),
372			detail1: i32::default(),
373			detail2: i32::default(),
374			any_data: OwnedValue::from(0u8),
375		}
376	}
377}
378
379impl_from_user_facing_event_for_interface_event_enum!(
380	AttributesChangedEvent,
381	DocumentEvents,
382	DocumentEvents::AttributesChanged
383);
384impl_from_user_facing_type_for_event_enum!(AttributesChangedEvent, Event::Document);
385impl_try_from_event_for_user_facing_type!(
386	AttributesChangedEvent,
387	DocumentEvents::AttributesChanged,
388	Event::Document
389);
390
391event_test_cases!(AttributesChangedEvent);
392impl_to_dbus_message!(AttributesChangedEvent);
393impl_from_dbus_message!(AttributesChangedEvent);
394impl_event_properties!(AttributesChangedEvent);
395impl From<AttributesChangedEvent> for EventBodyOwned {
396	fn from(_event: AttributesChangedEvent) -> Self {
397		EventBodyOwned {
398			properties: std::collections::HashMap::new(),
399			kind: String::default(),
400			detail1: i32::default(),
401			detail2: i32::default(),
402			any_data: OwnedValue::from(0u8),
403		}
404	}
405}
406
407impl_from_user_facing_event_for_interface_event_enum!(
408	PageChangedEvent,
409	DocumentEvents,
410	DocumentEvents::PageChanged
411);
412impl_from_user_facing_type_for_event_enum!(PageChangedEvent, Event::Document);
413impl_try_from_event_for_user_facing_type!(
414	PageChangedEvent,
415	DocumentEvents::PageChanged,
416	Event::Document
417);
418
419event_test_cases!(PageChangedEvent);
420impl_to_dbus_message!(PageChangedEvent);
421impl_from_dbus_message!(PageChangedEvent);
422impl_event_properties!(PageChangedEvent);
423impl From<PageChangedEvent> for EventBodyOwned {
424	fn from(_event: PageChangedEvent) -> Self {
425		EventBodyOwned {
426			properties: std::collections::HashMap::new(),
427			kind: String::default(),
428			detail1: i32::default(),
429			detail2: i32::default(),
430			any_data: OwnedValue::from(0u8),
431		}
432	}
433}
434
435impl HasRegistryEventString for DocumentEvents {
436	const REGISTRY_EVENT_STRING: &'static str = "Document:";
437}