atspi_common/events/
keyboard.rs

1#[cfg(feature = "zbus")]
2use super::event_body::EventBody;
3#[cfg(feature = "zbus")]
4use crate::error::AtspiError;
5use crate::{
6	events::{DBusInterface, DBusMatchRule, DBusMember, EventBodyOwned, RegistryEventString},
7	object_ref::ObjectRefOwned,
8};
9
10#[cfg(feature = "zbus")]
11use crate::{events::MessageConversion, EventProperties, ObjectRef};
12#[cfg(feature = "zbus")]
13use zbus::message::{Body as DbusBody, Header};
14
15#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
16pub struct ModifiersEvent {
17	/// The [`crate::ObjectRef`] which the event applies to.
18	pub item: ObjectRefOwned,
19	pub previous_modifiers: i32,
20	pub current_modifiers: i32,
21}
22
23impl_event_type_properties_for_event!(ModifiersEvent);
24
25impl_member_interface_registry_string_and_match_rule_for_event! {
26	ModifiersEvent,
27	"Modifiers",
28	"org.a11y.atspi.Event.Keyboard",
29	"keyboard:modifiers",
30	"type='signal',interface='org.a11y.atspi.Event.Keyboard',member='Modifiers'"
31}
32
33#[cfg(feature = "zbus")]
34impl MessageConversion<'_> for ModifiersEvent {
35	type Body<'msg> = EventBody<'msg>;
36
37	fn from_message_unchecked_parts(item: ObjectRef, body: DbusBody) -> Result<Self, AtspiError> {
38		let body = body.deserialize_unchecked::<Self::Body<'_>>()?;
39		Ok(Self {
40			item: item.into(),
41			previous_modifiers: body.detail1(),
42			current_modifiers: body.detail2(),
43		})
44	}
45
46	fn from_message_unchecked(msg: &zbus::Message, header: &Header) -> Result<Self, AtspiError> {
47		let item = header.try_into()?;
48		let body = msg.body();
49		Self::from_message_unchecked_parts(item, body)
50	}
51
52	fn body(&self) -> Self::Body<'_> {
53		EventBodyOwned {
54			detail1: self.previous_modifiers,
55			detail2: self.current_modifiers,
56			..Default::default()
57		}
58		.into()
59	}
60}
61
62impl_msg_conversion_ext_for_target_type!(ModifiersEvent);
63
64event_test_cases!(ModifiersEvent);
65impl_to_dbus_message!(ModifiersEvent);
66impl_from_dbus_message!(ModifiersEvent);
67impl_event_properties!(ModifiersEvent);
68
69impl From<ModifiersEvent> for EventBodyOwned {
70	fn from(event: ModifiersEvent) -> Self {
71		EventBodyOwned {
72			detail1: event.previous_modifiers,
73			detail2: event.current_modifiers,
74			..Default::default()
75		}
76	}
77}