use std::hash::Hash;
#[cfg(feature = "zbus")]
use crate::events::{MessageConversion, MessageConversionExt};
use crate::{
error::AtspiError,
events::{BusProperties, EventBodyOwned, ObjectRef},
EventProperties, State,
};
use zbus_names::UniqueName;
use zvariant::{ObjectPath, OwnedValue, Value};
use super::{event_body::Properties, EventBodyQtOwned};
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct PropertyChangeEvent {
pub item: crate::events::ObjectRef,
pub property: String,
pub value: Property,
}
impl Hash for PropertyChangeEvent {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
self.item.hash(state);
self.property.hash(state);
}
}
impl Eq for PropertyChangeEvent {}
#[allow(clippy::derivable_impls)]
impl Default for PropertyChangeEvent {
fn default() -> Self {
Self { item: ObjectRef::default(), property: String::default(), value: Property::default() }
}
}
#[derive(Debug, PartialEq, serde::Serialize, serde::Deserialize)]
#[non_exhaustive]
pub enum Property {
Name(String),
Description(String),
Role(crate::Role),
Parent(ObjectRef),
TableCaption(String),
TableColumnDescription(String),
TableColumnHeader(String),
TableRowDescription(String),
TableRowHeader(String),
TableSummary(String),
Other((String, OwnedValue)),
}
impl Clone for Property {
fn clone(&self) -> Self {
match self {
Property::Name(name) => Self::Name(name.clone()),
Property::Description(description) => Self::Description(description.clone()),
Property::Role(role) => Self::Role(*role),
Property::Parent(parent) => Self::Parent(parent.clone()),
Property::TableCaption(table_caption) => Self::TableCaption(table_caption.clone()),
Property::TableColumnDescription(table_column_description) => {
Self::TableColumnDescription(table_column_description.clone())
}
Property::TableColumnHeader(table_column_header) => {
Self::TableColumnHeader(table_column_header.clone())
}
Property::TableRowDescription(table_row_description) => {
Self::TableRowDescription(table_row_description.clone())
}
Property::TableRowHeader(table_row_header) => {
Self::TableRowHeader(table_row_header.clone())
}
Property::TableSummary(table_summary) => Self::TableSummary(table_summary.clone()),
Property::Other((property, value)) => Self::Other((
property.clone(),
value
.try_clone()
.expect("Could not clone 'value'. Since properties are not known to carry files, we do not expect to exceed open file limit."),
)),
}
}
}
impl Default for Property {
fn default() -> Self {
Self::Other((String::default(), u64::default().into()))
}
}
impl TryFrom<EventBodyOwned> for Property {
type Error = AtspiError;
fn try_from(body: EventBodyOwned) -> Result<Self, Self::Error> {
let property = body.kind;
match property.as_str() {
"accessible-name" => Ok(Self::Name(
body.any_data
.try_into()
.map_err(|_| AtspiError::ParseError("accessible-name"))?,
)),
"accessible-description" => Ok(Self::Description(
body.any_data
.try_into()
.map_err(|_| AtspiError::ParseError("accessible-description"))?,
)),
"accessible-role" => Ok(Self::Role({
let role_int: u32 = body
.any_data
.try_into()
.map_err(|_| AtspiError::ParseError("accessible-role"))?;
let role: crate::Role = crate::Role::try_from(role_int)
.map_err(|_| AtspiError::ParseError("accessible-role"))?;
role
})),
"accessible-parent" => Ok(Self::Parent(
body.any_data
.try_into()
.map_err(|_| AtspiError::ParseError("accessible-parent"))?,
)),
"accessible-table-caption" => Ok(Self::TableCaption(
body.any_data
.try_into()
.map_err(|_| AtspiError::ParseError("accessible-table-caption"))?,
)),
"table-column-description" => Ok(Self::TableColumnDescription(
body.any_data
.try_into()
.map_err(|_| AtspiError::ParseError("table-column-description"))?,
)),
"table-column-header" => Ok(Self::TableColumnHeader(
body.any_data
.try_into()
.map_err(|_| AtspiError::ParseError("table-column-header"))?,
)),
"table-row-description" => Ok(Self::TableRowDescription(
body.any_data
.try_into()
.map_err(|_| AtspiError::ParseError("table-row-description"))?,
)),
"table-row-header" => Ok(Self::TableRowHeader(
body.any_data
.try_into()
.map_err(|_| AtspiError::ParseError("table-row-header"))?,
)),
"table-summary" => Ok(Self::TableSummary(
body.any_data
.try_into()
.map_err(|_| AtspiError::ParseError("table-summary"))?,
)),
_ => Ok(Self::Other((property, body.any_data))),
}
}
}
impl From<Property> for OwnedValue {
fn from(property: Property) -> Self {
let value = match property {
Property::Name(name) => Value::from(name),
Property::Description(description) => Value::from(description),
Property::Role(role) => Value::from(role as u32),
Property::Parent(parent) => Value::from(parent),
Property::TableCaption(table_caption) => Value::from(table_caption),
Property::TableColumnDescription(table_column_description) => {
Value::from(table_column_description)
}
Property::TableColumnHeader(table_column_header) => Value::from(table_column_header),
Property::TableRowDescription(table_row_description) => {
Value::from(table_row_description)
}
Property::TableRowHeader(table_row_header) => Value::from(table_row_header),
Property::TableSummary(table_summary) => Value::from(table_summary),
Property::Other((_, value)) => value.into(),
};
value.try_into().expect("Should succeed as there are no borrowed file descriptors involved that could, potentially, exceed the open file limit when converted to OwnedValue")
}
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct BoundsChangedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct LinkSelectedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct StateChangedEvent {
pub item: crate::events::ObjectRef,
pub state: State,
#[serde(with = "i32_bool_conversion")]
pub enabled: bool,
}
mod i32_bool_conversion {
use serde::{Deserialize, Deserializer, Serializer};
pub fn deserialize<'de, D>(de: D) -> Result<bool, D::Error>
where
D: Deserializer<'de>,
{
let int: i32 = Deserialize::deserialize(de)?;
Ok(int > 0)
}
#[allow(clippy::trivially_copy_pass_by_ref)]
pub fn serialize<S>(b: &bool, ser: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let val: i32 = (*b).into();
ser.serialize_i32(val)
}
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ChildrenChangedEvent {
pub item: crate::events::ObjectRef,
pub operation: crate::Operation,
pub index_in_parent: i32,
pub child: ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct VisibleDataChangedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct SelectionChangedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ModelChangedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ActiveDescendantChangedEvent {
pub item: crate::events::ObjectRef,
pub child: ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct AnnouncementEvent {
pub item: crate::events::ObjectRef,
pub text: String,
pub live: crate::Politeness,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct AttributesChangedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct RowInsertedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct RowReorderedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct RowDeletedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ColumnInsertedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ColumnReorderedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ColumnDeletedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct TextBoundsChangedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct TextSelectionChangedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct TextChangedEvent {
pub item: crate::events::ObjectRef,
pub operation: crate::Operation,
pub start_pos: i32,
pub length: i32,
pub text: String,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct TextAttributesChangedEvent {
pub item: crate::events::ObjectRef,
}
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct TextCaretMovedEvent {
pub item: crate::events::ObjectRef,
pub position: i32,
}
impl BusProperties for PropertyChangeEvent {
const DBUS_MEMBER: &'static str = "PropertyChange";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='PropertyChange'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
#[cfg(feature = "zbus")]
impl MessageConversion for PropertyChangeEvent {
type Body = EventBodyOwned;
fn from_message_unchecked_parts(item: ObjectRef, body: Self::Body) -> Result<Self, AtspiError> {
let property = body.kind.to_string();
let value: Property = body.try_into()?;
Ok(Self { item, property, value })
}
fn from_message_unchecked(msg: &zbus::Message) -> Result<Self, AtspiError> {
let item = msg.try_into()?;
let body = if msg.body().signature() == crate::events::QSPI_EVENT_SIGNATURE {
msg.body().deserialize::<crate::events::EventBodyQtOwned>()?.into()
} else {
msg.body().deserialize()?
};
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body {
let copy = self.clone();
copy.into()
}
}
impl BusProperties for BoundsChangedEvent {
const DBUS_MEMBER: &'static str = "BoundsChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='BoundsChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for LinkSelectedEvent {
const DBUS_MEMBER: &'static str = "LinkSelected";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='LinkSelected'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for StateChangedEvent {
const DBUS_MEMBER: &'static str = "StateChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='StateChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
#[cfg(feature = "zbus")]
impl MessageConversion for StateChangedEvent {
type Body = EventBodyOwned;
fn from_message_unchecked_parts(item: ObjectRef, body: Self::Body) -> Result<Self, AtspiError> {
Ok(Self { item, state: body.kind.into(), enabled: body.detail1 > 0 })
}
fn from_message_unchecked(msg: &zbus::Message) -> Result<Self, AtspiError> {
let item = msg.try_into()?;
let body = if msg.body().signature() == crate::events::QSPI_EVENT_SIGNATURE {
msg.body().deserialize::<crate::events::EventBodyQtOwned>()?.into()
} else {
msg.body().deserialize()?
};
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body {
let copy = self.clone();
copy.into()
}
}
impl BusProperties for ChildrenChangedEvent {
const DBUS_MEMBER: &'static str = "ChildrenChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='ChildrenChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
#[cfg(feature = "zbus")]
impl MessageConversion for ChildrenChangedEvent {
type Body = EventBodyOwned;
fn from_message_unchecked_parts(item: ObjectRef, body: Self::Body) -> Result<Self, AtspiError> {
Ok(Self {
item,
operation: body.kind.as_str().parse()?,
index_in_parent: body.detail1,
child: body.any_data.try_into()?,
})
}
fn from_message_unchecked(msg: &zbus::Message) -> Result<Self, AtspiError> {
let item = msg.try_into()?;
let body = if msg.body().signature() == crate::events::QSPI_EVENT_SIGNATURE {
msg.body().deserialize::<crate::events::EventBodyQtOwned>()?.into()
} else {
msg.body().deserialize()?
};
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body {
let copy = self.clone();
copy.into()
}
}
impl BusProperties for VisibleDataChangedEvent {
const DBUS_MEMBER: &'static str = "VisibleDataChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='VisibleDataChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for SelectionChangedEvent {
const DBUS_MEMBER: &'static str = "SelectionChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='SelectionChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for ModelChangedEvent {
const DBUS_MEMBER: &'static str = "ModelChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='ModelChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for ActiveDescendantChangedEvent {
const DBUS_MEMBER: &'static str = "ActiveDescendantChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='ActiveDescendantChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
#[cfg(feature = "zbus")]
impl MessageConversion for ActiveDescendantChangedEvent {
type Body = EventBodyOwned;
fn from_message_unchecked_parts(item: ObjectRef, body: Self::Body) -> Result<Self, AtspiError> {
Ok(Self { item, child: body.any_data.try_into()? })
}
fn from_message_unchecked(msg: &zbus::Message) -> Result<Self, AtspiError> {
let item = msg.try_into()?;
let body = if msg.body().signature() == crate::events::QSPI_EVENT_SIGNATURE {
msg.body().deserialize::<crate::events::EventBodyQtOwned>()?.into()
} else {
msg.body().deserialize()?
};
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body {
let copy = self.clone();
copy.into()
}
}
impl BusProperties for AnnouncementEvent {
const DBUS_MEMBER: &'static str = "Announcement";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='Announcement'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
#[cfg(feature = "zbus")]
impl MessageConversion for AnnouncementEvent {
type Body = EventBodyOwned;
fn from_message_unchecked_parts(item: ObjectRef, body: Self::Body) -> Result<Self, AtspiError> {
Ok(Self {
item,
text: body.any_data.try_into().map_err(|_| AtspiError::Conversion("text"))?,
live: body.detail1.try_into()?,
})
}
fn from_message_unchecked(msg: &zbus::Message) -> Result<Self, AtspiError> {
let item = msg.try_into()?;
let body = if msg.body().signature() == crate::events::QSPI_EVENT_SIGNATURE {
msg.body().deserialize::<crate::events::EventBodyQtOwned>()?.into()
} else {
msg.body().deserialize()?
};
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body {
let copy = self.clone();
copy.into()
}
}
impl BusProperties for AttributesChangedEvent {
const DBUS_MEMBER: &'static str = "AttributesChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='AttributesChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for RowInsertedEvent {
const DBUS_MEMBER: &'static str = "RowInserted";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='RowInserted'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for RowReorderedEvent {
const DBUS_MEMBER: &'static str = "RowReordered";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='RowReordered'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for RowDeletedEvent {
const DBUS_MEMBER: &'static str = "RowDeleted";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='RowDeleted'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for ColumnInsertedEvent {
const DBUS_MEMBER: &'static str = "ColumnInserted";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='ColumnInserted'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for ColumnReorderedEvent {
const DBUS_MEMBER: &'static str = "ColumnReordered";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='ColumnReordered'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for ColumnDeletedEvent {
const DBUS_MEMBER: &'static str = "ColumnDeleted";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='ColumnDeleted'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for TextBoundsChangedEvent {
const DBUS_MEMBER: &'static str = "TextBoundsChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='TextBoundsChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for TextSelectionChangedEvent {
const DBUS_MEMBER: &'static str = "TextSelectionChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='TextSelectionChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for TextChangedEvent {
const DBUS_MEMBER: &'static str = "TextChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='TextChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
#[cfg(feature = "zbus")]
impl MessageConversion for TextChangedEvent {
type Body = EventBodyOwned;
fn from_message_unchecked_parts(item: ObjectRef, body: Self::Body) -> Result<Self, AtspiError> {
Ok(Self {
item,
operation: body.kind.as_str().parse()?,
start_pos: body.detail1,
length: body.detail2,
text: body.any_data.try_into()?,
})
}
fn from_message_unchecked(msg: &zbus::Message) -> Result<Self, AtspiError> {
let item = msg.try_into()?;
let body = if msg.body().signature() == crate::events::QSPI_EVENT_SIGNATURE {
msg.body().deserialize::<EventBodyQtOwned>()?.into()
} else {
msg.body().deserialize()?
};
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body {
let copy = self.clone();
copy.into()
}
}
impl BusProperties for TextAttributesChangedEvent {
const DBUS_MEMBER: &'static str = "TextAttributesChanged";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='TextAttributesChanged'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
impl BusProperties for TextCaretMovedEvent {
const DBUS_MEMBER: &'static str = "TextCaretMoved";
const DBUS_INTERFACE: &'static str = "org.a11y.atspi.Event.Object";
const MATCH_RULE_STRING: &'static str =
"type='signal',interface='org.a11y.atspi.Event.Object',member='TextCaretMoved'";
const REGISTRY_EVENT_STRING: &'static str = "Object:";
}
#[cfg(feature = "zbus")]
impl MessageConversion for TextCaretMovedEvent {
type Body = EventBodyOwned;
fn from_message_unchecked_parts(item: ObjectRef, body: Self::Body) -> Result<Self, AtspiError> {
Ok(Self { item, position: body.detail1 })
}
fn from_message_unchecked(msg: &zbus::Message) -> Result<Self, AtspiError> {
let item = msg.try_into()?;
let body = if msg.body().signature() == crate::events::QSPI_EVENT_SIGNATURE {
msg.body().deserialize::<EventBodyQtOwned>()?.into()
} else {
msg.body().deserialize()?
};
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body {
let copy = self.clone();
copy.into()
}
}
event_test_cases!(PropertyChangeEvent);
impl_to_dbus_message!(PropertyChangeEvent);
impl_from_dbus_message!(PropertyChangeEvent);
impl_event_properties!(PropertyChangeEvent);
impl From<PropertyChangeEvent> for EventBodyOwned {
fn from(event: PropertyChangeEvent) -> Self {
EventBodyOwned { kind: event.property, any_data: event.value.into(), ..Default::default() }
}
}
event_test_cases!(BoundsChangedEvent);
impl_to_dbus_message!(BoundsChangedEvent);
impl_from_dbus_message!(BoundsChangedEvent);
impl_event_properties!(BoundsChangedEvent);
impl_from_object_ref!(BoundsChangedEvent);
event_test_cases!(LinkSelectedEvent);
impl_to_dbus_message!(LinkSelectedEvent);
impl_from_dbus_message!(LinkSelectedEvent);
impl_event_properties!(LinkSelectedEvent);
impl_from_object_ref!(LinkSelectedEvent);
event_test_cases!(StateChangedEvent);
impl_to_dbus_message!(StateChangedEvent);
impl_from_dbus_message!(StateChangedEvent);
impl_event_properties!(StateChangedEvent);
impl From<StateChangedEvent> for EventBodyOwned {
fn from(event: StateChangedEvent) -> Self {
EventBodyOwned {
kind: event.state.to_string(),
detail1: event.enabled.into(),
..Default::default()
}
}
}
event_test_cases!(ChildrenChangedEvent);
impl_to_dbus_message!(ChildrenChangedEvent);
impl_from_dbus_message!(ChildrenChangedEvent);
impl_event_properties!(ChildrenChangedEvent);
impl From<ChildrenChangedEvent> for EventBodyOwned {
fn from(event: ChildrenChangedEvent) -> Self {
EventBodyOwned {
kind: event.operation.to_string(),
detail1: event.index_in_parent,
any_data: Value::from(event.child)
.try_into()
.expect("Failed to convert child to OwnedValue"),
..Default::default()
}
}
}
event_test_cases!(VisibleDataChangedEvent);
impl_to_dbus_message!(VisibleDataChangedEvent);
impl_from_dbus_message!(VisibleDataChangedEvent);
impl_event_properties!(VisibleDataChangedEvent);
impl_from_object_ref!(VisibleDataChangedEvent);
event_test_cases!(SelectionChangedEvent);
impl_to_dbus_message!(SelectionChangedEvent);
impl_from_dbus_message!(SelectionChangedEvent);
impl_event_properties!(SelectionChangedEvent);
impl_from_object_ref!(SelectionChangedEvent);
event_test_cases!(ModelChangedEvent);
impl_to_dbus_message!(ModelChangedEvent);
impl_from_dbus_message!(ModelChangedEvent);
impl_event_properties!(ModelChangedEvent);
impl_from_object_ref!(ModelChangedEvent);
event_test_cases!(ActiveDescendantChangedEvent);
impl_to_dbus_message!(ActiveDescendantChangedEvent);
impl_from_dbus_message!(ActiveDescendantChangedEvent);
impl_event_properties!(ActiveDescendantChangedEvent);
impl From<ActiveDescendantChangedEvent> for EventBodyOwned {
fn from(event: ActiveDescendantChangedEvent) -> Self {
EventBodyOwned {
any_data: Value::from(event.child)
.try_to_owned()
.expect("Failed to convert child to OwnedValue"),
..Default::default()
}
}
}
event_test_cases!(AnnouncementEvent);
impl_to_dbus_message!(AnnouncementEvent);
impl_from_dbus_message!(AnnouncementEvent);
impl_event_properties!(AnnouncementEvent);
impl From<AnnouncementEvent> for EventBodyOwned {
fn from(event: AnnouncementEvent) -> Self {
EventBodyOwned {
detail1: event.live as i32,
any_data: Value::from(event.text)
.try_to_owned()
.expect("Failed to convert text to OwnedValue"),
..Default::default()
}
}
}
event_test_cases!(AttributesChangedEvent);
impl_to_dbus_message!(AttributesChangedEvent);
impl_from_dbus_message!(AttributesChangedEvent);
impl_event_properties!(AttributesChangedEvent);
impl_from_object_ref!(AttributesChangedEvent);
event_test_cases!(RowInsertedEvent);
impl_to_dbus_message!(RowInsertedEvent);
impl_from_dbus_message!(RowInsertedEvent);
impl_event_properties!(RowInsertedEvent);
impl_from_object_ref!(RowInsertedEvent);
event_test_cases!(RowReorderedEvent);
impl_to_dbus_message!(RowReorderedEvent);
impl_from_dbus_message!(RowReorderedEvent);
impl_event_properties!(RowReorderedEvent);
impl_from_object_ref!(RowReorderedEvent);
event_test_cases!(RowDeletedEvent);
impl_to_dbus_message!(RowDeletedEvent);
impl_from_dbus_message!(RowDeletedEvent);
impl_event_properties!(RowDeletedEvent);
impl_from_object_ref!(RowDeletedEvent);
event_test_cases!(ColumnInsertedEvent);
impl_to_dbus_message!(ColumnInsertedEvent);
impl_from_dbus_message!(ColumnInsertedEvent);
impl_event_properties!(ColumnInsertedEvent);
impl_from_object_ref!(ColumnInsertedEvent);
event_test_cases!(ColumnReorderedEvent);
impl_to_dbus_message!(ColumnReorderedEvent);
impl_from_dbus_message!(ColumnReorderedEvent);
impl_event_properties!(ColumnReorderedEvent);
impl_from_object_ref!(ColumnReorderedEvent);
event_test_cases!(ColumnDeletedEvent);
impl_to_dbus_message!(ColumnDeletedEvent);
impl_from_dbus_message!(ColumnDeletedEvent);
impl_event_properties!(ColumnDeletedEvent);
impl_from_object_ref!(ColumnDeletedEvent);
event_test_cases!(TextBoundsChangedEvent);
impl_to_dbus_message!(TextBoundsChangedEvent);
impl_from_dbus_message!(TextBoundsChangedEvent);
impl_event_properties!(TextBoundsChangedEvent);
impl_from_object_ref!(TextBoundsChangedEvent);
event_test_cases!(TextSelectionChangedEvent);
impl_to_dbus_message!(TextSelectionChangedEvent);
impl_from_dbus_message!(TextSelectionChangedEvent);
impl_event_properties!(TextSelectionChangedEvent);
impl_from_object_ref!(TextSelectionChangedEvent);
event_test_cases!(TextChangedEvent);
impl_to_dbus_message!(TextChangedEvent);
impl_from_dbus_message!(TextChangedEvent);
impl_event_properties!(TextChangedEvent);
impl From<TextChangedEvent> for EventBodyOwned {
fn from(event: TextChangedEvent) -> Self {
EventBodyOwned {
kind: event.operation.to_string(),
detail1: event.start_pos,
detail2: event.length,
any_data: Value::from(event.text)
.try_to_owned()
.expect("Failed to convert child to OwnedValue"),
properties: Properties,
}
}
}
event_test_cases!(TextAttributesChangedEvent);
impl_to_dbus_message!(TextAttributesChangedEvent);
impl_from_dbus_message!(TextAttributesChangedEvent);
impl_event_properties!(TextAttributesChangedEvent);
impl_from_object_ref!(TextAttributesChangedEvent);
event_test_cases!(TextCaretMovedEvent);
impl_to_dbus_message!(TextCaretMovedEvent);
impl_from_dbus_message!(TextCaretMovedEvent);
impl_event_properties!(TextCaretMovedEvent);
impl From<TextCaretMovedEvent> for EventBodyOwned {
fn from(event: TextCaretMovedEvent) -> Self {
EventBodyOwned { detail1: event.position, ..Default::default() }
}
}