1 | use crate::{ |
2 | error::AtspiError, |
3 | events::{Accessible, EventBodyOwned, GenericEvent, HasMatchRule, HasRegistryEventString}, |
4 | Event, |
5 | }; |
6 | use zvariant::ObjectPath; |
7 | |
8 | #[derive (Clone, Debug, serde::Serialize, serde::Deserialize, PartialEq, Eq, Hash)] |
9 | pub enum KeyboardEvents { |
10 | /// See: [`ModifiersEvent`]. |
11 | Modifiers(ModifiersEvent), |
12 | } |
13 | |
14 | impl_from_interface_event_enum_for_event!(KeyboardEvents, Event::Keyboard); |
15 | impl_try_from_event_for_user_facing_event_type!(KeyboardEvents, Event::Keyboard); |
16 | |
17 | event_wrapper_test_cases!(KeyboardEvents, ModifiersEvent); |
18 | |
19 | impl HasMatchRule for KeyboardEvents { |
20 | const MATCH_RULE_STRING: &'static str = |
21 | "type='signal',interface='org.a11y.atspi.Event.Keyboard'" ; |
22 | } |
23 | |
24 | #[derive (Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)] |
25 | pub struct ModifiersEvent { |
26 | /// The [`Accessible`] which the event applies to. |
27 | pub item: crate::events::Accessible, |
28 | pub previous_modifiers: i32, |
29 | pub current_modifiers: i32, |
30 | } |
31 | |
32 | impl GenericEvent<'_> for ModifiersEvent { |
33 | const DBUS_MEMBER: &'static str = "Modifiers" ; |
34 | const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Keyboard" ; |
35 | const MATCH_RULE_STRING: &'static str = |
36 | "type='signal',interface='org.a11y.atspi.Event.Keyboard',member='Modifiers'" ; |
37 | const REGISTRY_EVENT_STRING: &'static str = "Keyboard:" ; |
38 | |
39 | type Body = EventBodyOwned; |
40 | |
41 | fn build(item: Accessible, body: Self::Body) -> Result<Self, AtspiError> { |
42 | Ok(Self { item, previous_modifiers: body.detail1, current_modifiers: body.detail2 }) |
43 | } |
44 | fn sender(&self) -> String { |
45 | self.item.name.clone() |
46 | } |
47 | fn path<'a>(&self) -> ObjectPath<'_> { |
48 | self.item.path.clone().into() |
49 | } |
50 | fn body(&self) -> Self::Body { |
51 | let copy: ModifiersEvent = self.clone(); |
52 | copy.into() |
53 | } |
54 | } |
55 | |
56 | #[cfg (feature = "zbus" )] |
57 | impl TryFrom<&zbus::Message> for KeyboardEvents { |
58 | type Error = AtspiError; |
59 | fn try_from(ev: &zbus::Message) -> Result<Self, Self::Error> { |
60 | let member: MemberName<'_> = ev |
61 | .member() |
62 | .ok_or(err:AtspiError::MemberMatch("Event without member" .into()))?; |
63 | match member.as_str() { |
64 | "Modifiers" => Ok(KeyboardEvents::Modifiers(ev.try_into()?)), |
65 | _ => Err(AtspiError::MemberMatch("No matching member for Keyboard" .into())), |
66 | } |
67 | } |
68 | } |
69 | |
70 | impl_from_user_facing_event_for_interface_event_enum!( |
71 | ModifiersEvent, |
72 | KeyboardEvents, |
73 | KeyboardEvents::Modifiers |
74 | ); |
75 | impl_from_user_facing_type_for_event_enum!(ModifiersEvent, Event::Keyboard); |
76 | impl_try_from_event_for_user_facing_type!( |
77 | ModifiersEvent, |
78 | KeyboardEvents::Modifiers, |
79 | Event::Keyboard |
80 | ); |
81 | |
82 | event_test_cases!(ModifiersEvent); |
83 | impl_to_dbus_message!(ModifiersEvent); |
84 | impl_from_dbus_message!(ModifiersEvent); |
85 | impl From<ModifiersEvent> for EventBodyOwned { |
86 | fn from(event: ModifiersEvent) -> Self { |
87 | EventBodyOwned { |
88 | properties: std::collections::HashMap::new(), |
89 | kind: String::default(), |
90 | detail1: event.previous_modifiers, |
91 | detail2: event.current_modifiers, |
92 | any_data: zvariant::Value::U8(0).into(), |
93 | } |
94 | } |
95 | } |
96 | |
97 | impl HasRegistryEventString for KeyboardEvents { |
98 | const REGISTRY_EVENT_STRING: &'static str = "Keyboard:" ; |
99 | } |
100 | |