diff --git a/atspi-common/src/events/object.rs b/atspi-common/src/events/object.rs index 1bbf0551..70d44023 100644 --- a/atspi-common/src/events/object.rs +++ b/atspi-common/src/events/object.rs @@ -420,12 +420,33 @@ pub struct StateChangedEvent { pub item: crate::events::ObjectRef, /// The state to be enabled/disabled. pub state: State, - /// Enabled or disabled the state. - /// - /// 1 == enabled - /// - /// 0 == disabled - pub enabled: i32, + /// Whether the state was enabled or disabled. + #[serde(with = "i32_bool_conversion")] + pub enabled: bool, +} + +mod i32_bool_conversion { + use serde::{Deserialize, Deserializer, Serializer}; + /// Convert an integer flag to a boolean. + /// returns true if value is more than 0, otherwise false + pub fn deserialize<'de, D>(de: D) -> Result + where + D: Deserializer<'de>, + { + let int: i32 = Deserialize::deserialize(de)?; + Ok(int > 0) + } + + /// Convert a boolean flag to an integer. + /// returns 0 if false and 1 if true + #[allow(clippy::trivially_copy_pass_by_ref)] + pub fn serialize(b: &bool, ser: S) -> Result + where + S: Serializer, + { + let val: i32 = (*b).into(); + ser.serialize_i32(val) + } } /// A child of an [`ObjectRef`] has been added or removed. @@ -651,7 +672,7 @@ impl BusProperties for StateChangedEvent { type Body = EventBodyOwned; fn from_message_parts(item: ObjectRef, body: Self::Body) -> Result { - Ok(Self { item, state: body.kind.into(), enabled: body.detail1 }) + Ok(Self { item, state: body.kind.into(), enabled: body.detail1 > 0 }) } fn body(&self) -> Self::Body { let copy = self.clone(); @@ -1137,7 +1158,7 @@ impl From for EventBodyOwned { EventBodyOwned { properties: std::collections::HashMap::new(), kind: event.state.into(), - detail1: event.enabled, + detail1: event.enabled.into(), detail2: i32::default(), any_data: u8::default().into(), } diff --git a/atspi/examples/focused-async-std.rs b/atspi/examples/focused-async-std.rs index ac7d9f6b..ed1f5517 100644 --- a/atspi/examples/focused-async-std.rs +++ b/atspi/examples/focused-async-std.rs @@ -13,7 +13,7 @@ async fn main() -> Result<(), Box> { while let Some(Ok(ev)) = events.next().await { let Ok(change) = ::try_from(ev) else { continue }; - if change.state == "focused".into() && change.enabled == 1 { + if change.state == "focused".into() && change.enabled { let bus_name = change.item.name.clone(); println!("Accessible belonging to {bus_name} focused!"); } diff --git a/atspi/examples/focused-tokio.rs b/atspi/examples/focused-tokio.rs index c5cb494a..b677693a 100644 --- a/atspi/examples/focused-tokio.rs +++ b/atspi/examples/focused-tokio.rs @@ -13,7 +13,7 @@ async fn main() -> Result<(), Box> { while let Some(Ok(ev)) = events.next().await { let Ok(change) = ::try_from(ev) else { continue }; - if change.state == "focused".into() && change.enabled == 1 { + if change.state == "focused".into() && change.enabled { let bus_name = change.item.name.clone(); println!("Accessible belonging to {bus_name} focused!"); }