#[cfg(feature = "zbus")]
use crate::events::MessageConversion;
#[cfg(feature = "wrappers")]
use crate::EventProperties;
use crate::{
error::AtspiError,
events::{
DBusInterface, DBusMatchRule, DBusMember, EventBody, EventBodyOwned, ObjectRef,
RegistryEventString,
},
State,
};
use std::hash::Hash;
#[cfg(feature = "zbus")]
use zbus::message::{Body as DbusBody, Header};
use zvariant::{OwnedValue, Value};
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
pub struct PropertyChangeEvent {
pub item: crate::events::ObjectRef,
pub property: String,
pub value: Property,
}
impl_event_type_properties_for_event!(PropertyChangeEvent);
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<EventBody<'_>> for Property {
type Error = AtspiError;
fn try_from(mut body: EventBody<'_>) -> Result<Self, Self::Error> {
let property = body.kind();
match property {
"accessible-name" => Ok(Self::Name(
body.take_any_data()
.try_into()
.map_err(|_| AtspiError::ParseError("accessible-name"))?,
)),
"accessible-description" => Ok(Self::Description(
body.take_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.take_any_data()
.try_into()
.map_err(|_| AtspiError::ParseError("accessible-parent"))?,
)),
"accessible-table-caption" => Ok(Self::TableCaption(
body.take_any_data()
.try_into()
.map_err(|_| AtspiError::ParseError("accessible-table-caption"))?,
)),
"table-column-description" => Ok(Self::TableColumnDescription(
body.take_any_data()
.try_into()
.map_err(|_| AtspiError::ParseError("table-column-description"))?,
)),
"table-column-header" => Ok(Self::TableColumnHeader(
body.take_any_data()
.try_into()
.map_err(|_| AtspiError::ParseError("table-column-header"))?,
)),
"table-row-description" => Ok(Self::TableRowDescription(
body.take_any_data()
.try_into()
.map_err(|_| AtspiError::ParseError("table-row-description"))?,
)),
"table-row-header" => Ok(Self::TableRowHeader(
body.take_any_data()
.try_into()
.map_err(|_| AtspiError::ParseError("table-row-header"))?,
)),
"table-summary" => Ok(Self::TableSummary(
body.take_any_data()
.try_into()
.map_err(|_| AtspiError::ParseError("table-summary"))?,
)),
_ => Ok(Self::Other((property.to_string(), body.take_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,
}
impl_event_type_properties_for_event!(BoundsChangedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct LinkSelectedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(LinkSelectedEvent);
#[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,
}
impl_event_type_properties_for_event!(StateChangedEvent);
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,
}
impl_event_type_properties_for_event!(ChildrenChangedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct VisibleDataChangedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(VisibleDataChangedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct SelectionChangedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(SelectionChangedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ModelChangedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(ModelChangedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ActiveDescendantChangedEvent {
pub item: crate::events::ObjectRef,
pub child: ObjectRef,
}
impl_event_type_properties_for_event!(ActiveDescendantChangedEvent);
#[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,
}
impl_event_type_properties_for_event!(AnnouncementEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct AttributesChangedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(AttributesChangedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct RowInsertedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(RowInsertedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct RowReorderedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(RowReorderedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct RowDeletedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(RowDeletedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ColumnInsertedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(ColumnInsertedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ColumnReorderedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(ColumnReorderedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct ColumnDeletedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(ColumnDeletedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct TextBoundsChangedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(TextBoundsChangedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct TextSelectionChangedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(TextSelectionChangedEvent);
#[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,
}
impl_event_type_properties_for_event!(TextChangedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct TextAttributesChangedEvent {
pub item: crate::events::ObjectRef,
}
impl_event_type_properties_for_event!(TextAttributesChangedEvent);
#[derive(Debug, PartialEq, Clone, serde::Serialize, serde::Deserialize, Eq, Hash, Default)]
pub struct TextCaretMovedEvent {
pub item: crate::events::ObjectRef,
pub position: i32,
}
impl_event_type_properties_for_event!(TextCaretMovedEvent);
impl_member_interface_registry_string_and_match_rule_for_event!(
PropertyChangeEvent,
"PropertyChange",
"org.a11y.atspi.Event.Object",
"object:property-change",
"type='signal',interface='org.a11y.atspi.Event.Object',member='PropertyChange'"
);
#[cfg(feature = "zbus")]
impl MessageConversion<'_> for PropertyChangeEvent {
type Body<'b> = EventBody<'b>;
fn from_message_unchecked_parts(item: ObjectRef, body: DbusBody) -> Result<Self, AtspiError> {
let mut body = body.deserialize_unchecked::<Self::Body<'_>>()?;
let property: String = body.take_kind();
let value: Property = body.try_into()?;
Ok(Self { item, property, value })
}
fn from_message_unchecked(msg: &zbus::Message, header: &Header) -> Result<Self, AtspiError> {
let item = header.try_into()?;
let body = msg.body();
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body<'_> {
let copy = self.clone();
EventBodyOwned::from(copy).into()
}
}
impl_member_interface_registry_string_and_match_rule_for_event!(
BoundsChangedEvent,
"BoundsChanged",
"org.a11y.atspi.Event.Object",
"object:bounds-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='BoundsChanged'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
LinkSelectedEvent,
"LinkSelected",
"org.a11y.atspi.Event.Object",
"object:link-selected",
"type='signal',interface='org.a11y.atspi.Event.Object',member='LinkSelected'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
StateChangedEvent,
"StateChanged",
"org.a11y.atspi.Event.Object",
"object:state-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='StateChanged'"
);
#[cfg(feature = "zbus")]
impl MessageConversion<'_> for StateChangedEvent {
type Body<'a> = EventBody<'a>;
fn from_message_unchecked_parts(item: ObjectRef, body: DbusBody) -> Result<Self, AtspiError> {
let body: Self::Body<'_> = body.deserialize_unchecked()?;
Ok(Self { item, state: body.kind().into(), enabled: body.detail1() > 0 })
}
fn from_message_unchecked(msg: &zbus::Message, header: &Header) -> Result<Self, AtspiError> {
let item = header.try_into()?;
let body = msg.body();
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body<'_> {
let copy = self.clone();
copy.into()
}
}
impl_member_interface_registry_string_and_match_rule_for_event!(
ChildrenChangedEvent,
"ChildrenChanged",
"org.a11y.atspi.Event.Object",
"object:children-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='ChildrenChanged'"
);
#[cfg(feature = "zbus")]
impl MessageConversion<'_> for ChildrenChangedEvent {
type Body<'a> = EventBody<'a>;
fn from_message_unchecked_parts(item: ObjectRef, body: DbusBody) -> Result<Self, AtspiError> {
let mut body = body.deserialize_unchecked::<Self::Body<'_>>()?;
Ok(Self {
item,
operation: body.kind().parse()?,
index_in_parent: body.detail1(),
child: body.take_any_data().try_into()?,
})
}
fn from_message_unchecked(msg: &zbus::Message, header: &Header) -> Result<Self, AtspiError> {
let item = header.try_into()?;
let body = msg.body();
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body<'_> {
EventBodyOwned::from(self.clone()).into()
}
}
impl_member_interface_registry_string_and_match_rule_for_event!(
VisibleDataChangedEvent,
"VisibleDataChanged",
"org.a11y.atspi.Event.Object",
"object:visible-data-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='VisibleDataChanged'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
SelectionChangedEvent,
"SelectionChanged",
"org.a11y.atspi.Event.Object",
"object:selection-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='SelectionChanged'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
ModelChangedEvent,
"ModelChanged",
"org.a11y.atspi.Event.Object",
"object:model-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='ModelChanged'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
ActiveDescendantChangedEvent,
"ActiveDescendantChanged",
"org.a11y.atspi.Event.Object",
"object:active-descendant-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='ActiveDescendantChanged'"
);
#[cfg(feature = "zbus")]
impl MessageConversion<'_> for ActiveDescendantChangedEvent {
type Body<'a> = EventBody<'a>;
fn from_message_unchecked_parts(item: ObjectRef, body: DbusBody) -> Result<Self, AtspiError> {
let mut body = body.deserialize_unchecked::<Self::Body<'_>>()?;
Ok(Self { item, child: body.take_any_data().try_into()? })
}
fn from_message_unchecked(msg: &zbus::Message, header: &Header) -> Result<Self, AtspiError> {
let item = header.try_into()?;
let body = msg.body();
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body<'_> {
EventBodyOwned::from(self.clone()).into()
}
}
impl_member_interface_registry_string_and_match_rule_for_event!(
AnnouncementEvent,
"Announcement",
"org.a11y.atspi.Event.Object",
"object:announcement",
"type='signal',interface='org.a11y.atspi.Event.Object',member='Announcement'"
);
#[cfg(feature = "zbus")]
impl MessageConversion<'_> for AnnouncementEvent {
type Body<'a> = EventBody<'a>;
fn from_message_unchecked_parts(item: ObjectRef, body: DbusBody) -> Result<Self, AtspiError> {
let mut body = body.deserialize_unchecked::<Self::Body<'_>>()?;
Ok(Self {
item,
text: body
.take_any_data()
.try_into()
.map_err(|_| AtspiError::Conversion("text"))?,
live: body.detail1().try_into()?,
})
}
fn from_message_unchecked(msg: &zbus::Message, header: &Header) -> Result<Self, AtspiError> {
let item = header.try_into()?;
let body = msg.body();
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body<'_> {
EventBodyOwned::from(self.clone()).into()
}
}
impl_member_interface_registry_string_and_match_rule_for_event!(
AttributesChangedEvent,
"AttributesChanged",
"org.a11y.atspi.Event.Object",
"object:attributes-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='AttributesChanged'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
RowInsertedEvent,
"RowInserted",
"org.a11y.atspi.Event.Object",
"object:row-inserted",
"type='signal',interface='org.a11y.atspi.Event.Object',member='RowInserted'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
RowReorderedEvent,
"RowReordered",
"org.a11y.atspi.Event.Object",
"object:row-reordered",
"type='signal',interface='org.a11y.atspi.Event.Object',member='RowReordered'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
RowDeletedEvent,
"RowDeleted",
"org.a11y.atspi.Event.Object",
"object:row-deleted",
"type='signal',interface='org.a11y.atspi.Event.Object',member='RowDeleted'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
ColumnInsertedEvent,
"ColumnInserted",
"org.a11y.atspi.Event.Object",
"object:column-inserted",
"type='signal',interface='org.a11y.atspi.Event.Object',member='ColumnInserted'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
ColumnReorderedEvent,
"ColumnReordered",
"org.a11y.atspi.Event.Object",
"object:column-reordered",
"type='signal',interface='org.a11y.atspi.Event.Object',member='ColumnReordered'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
ColumnDeletedEvent,
"ColumnDeleted",
"org.a11y.atspi.Event.Object",
"object:column-deleted",
"type='signal',interface='org.a11y.atspi.Event.Object',member='ColumnDeleted'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
TextBoundsChangedEvent,
"TextBoundsChanged",
"org.a11y.atspi.Event.Object",
"object:text-bounds-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='TextBoundsChanged'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
TextSelectionChangedEvent,
"TextSelectionChanged",
"org.a11y.atspi.Event.Object",
"object:text-selection-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='TextSelectionChanged'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
TextChangedEvent,
"TextChanged",
"org.a11y.atspi.Event.Object",
"object:text-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='TextChanged'"
);
#[cfg(feature = "zbus")]
impl MessageConversion<'_> for TextChangedEvent {
type Body<'a> = EventBody<'a>;
fn from_message_unchecked_parts(item: ObjectRef, body: DbusBody) -> Result<Self, AtspiError> {
let mut body = body.deserialize_unchecked::<Self::Body<'_>>()?;
Ok(Self {
item,
operation: body.kind().parse()?,
start_pos: body.detail1(),
length: body.detail2(),
text: body.take_any_data().try_into()?,
})
}
fn from_message_unchecked(msg: &zbus::Message, header: &Header) -> Result<Self, AtspiError> {
let item = header.try_into()?;
let body = msg.body();
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body<'_> {
EventBodyOwned::from(self.clone()).into()
}
}
impl_member_interface_registry_string_and_match_rule_for_event!(
TextAttributesChangedEvent,
"TextAttributesChanged",
"org.a11y.atspi.Event.Object",
"object:text-attributes-changed",
"type='signal',interface='org.a11y.atspi.Event.Object',member='TextAttributesChanged'"
);
impl_member_interface_registry_string_and_match_rule_for_event!(
TextCaretMovedEvent,
"TextCaretMoved",
"org.a11y.atspi.Event.Object",
"object:text-caret-moved",
"type='signal',interface='org.a11y.atspi.Event.Object',member='TextCaretMoved'"
);
#[cfg(feature = "zbus")]
impl MessageConversion<'_> for TextCaretMovedEvent {
type Body<'a> = EventBody<'a>;
fn from_message_unchecked_parts(item: ObjectRef, body: DbusBody) -> Result<Self, AtspiError> {
let body = body.deserialize_unchecked::<Self::Body<'_>>()?;
Ok(Self { item, position: body.detail1() })
}
fn from_message_unchecked(msg: &zbus::Message, header: &Header) -> Result<Self, AtspiError> {
let item = header.try_into()?;
let body = msg.body();
Self::from_message_unchecked_parts(item, body)
}
fn body(&self) -> Self::Body<'_> {
EventBodyOwned::from(self.clone()).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() }
}
}
impl From<&PropertyChangeEvent> for EventBodyOwned {
fn from(event: &PropertyChangeEvent) -> Self {
EventBodyOwned {
kind: event.property.to_string(),
any_data: event.value.clone().into(),
..Default::default()
}
}
}
impl From<PropertyChangeEvent> for EventBody<'_> {
fn from(event: PropertyChangeEvent) -> Self {
EventBodyOwned::from(event).into()
}
}
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()
}
}
}
impl From<&StateChangedEvent> for EventBodyOwned {
fn from(event: &StateChangedEvent) -> Self {
EventBodyOwned {
kind: event.state.to_string(),
detail1: event.enabled.into(),
..Default::default()
}
}
}
impl From<StateChangedEvent> for EventBody<'_> {
fn from(event: StateChangedEvent) -> Self {
EventBodyOwned::from(event).into()
}
}
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()
}
}
}
impl From<&ChildrenChangedEvent> for EventBodyOwned {
fn from(event: &ChildrenChangedEvent) -> Self {
EventBodyOwned {
kind: event.operation.to_string(),
detail1: event.index_in_parent,
detail2: i32::default(),
any_data: Value::from(event.child.clone())
.try_into()
.expect("ObjectRef should convert to OwnedValue without error"),
properties: super::event_body::Properties,
}
}
}
impl From<ChildrenChangedEvent> for EventBody<'_> {
fn from(event: ChildrenChangedEvent) -> Self {
EventBodyOwned::from(event).into()
}
}
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);
assert_impl_all!(TextChangedEvent:Clone,std::fmt::Debug,serde::Serialize,serde::Deserialize<'static>,Default,PartialEq,Eq,std::hash::Hash,crate::EventProperties,crate::EventTypeProperties);
#[cfg(feature = "zbus")]
assert_impl_all!(zbus::Message:TryFrom<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"),
..Default::default()
}
}
}
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() }
}
}
impl_msg_conversion_ext_for_target_type!(PropertyChangeEvent);
impl_msg_conversion_ext_for_target_type!(BoundsChangedEvent);
impl_msg_conversion_ext_for_target_type!(LinkSelectedEvent);
impl_msg_conversion_ext_for_target_type!(StateChangedEvent);
impl_msg_conversion_ext_for_target_type!(ChildrenChangedEvent);
impl_msg_conversion_ext_for_target_type!(VisibleDataChangedEvent);
impl_msg_conversion_ext_for_target_type!(SelectionChangedEvent);
impl_msg_conversion_ext_for_target_type!(ModelChangedEvent);
impl_msg_conversion_ext_for_target_type!(ActiveDescendantChangedEvent);
impl_msg_conversion_ext_for_target_type!(AnnouncementEvent);
impl_msg_conversion_ext_for_target_type!(AttributesChangedEvent);
impl_msg_conversion_ext_for_target_type!(RowInsertedEvent);
impl_msg_conversion_ext_for_target_type!(RowReorderedEvent);
impl_msg_conversion_ext_for_target_type!(RowDeletedEvent);
impl_msg_conversion_ext_for_target_type!(ColumnInsertedEvent);
impl_msg_conversion_ext_for_target_type!(ColumnReorderedEvent);
impl_msg_conversion_ext_for_target_type!(ColumnDeletedEvent);
impl_msg_conversion_ext_for_target_type!(TextBoundsChangedEvent);
impl_msg_conversion_ext_for_target_type!(TextSelectionChangedEvent);
impl_msg_conversion_ext_for_target_type!(TextChangedEvent);
impl_msg_conversion_ext_for_target_type!(TextAttributesChangedEvent);
impl_msg_conversion_ext_for_target_type!(TextCaretMovedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(BoundsChangedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(LinkSelectedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(VisibleDataChangedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(SelectionChangedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(ModelChangedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(AttributesChangedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(RowInsertedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(RowReorderedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(RowDeletedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(ColumnInsertedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(ColumnReorderedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(ColumnDeletedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(TextBoundsChangedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(TextSelectionChangedEvent);
impl_msg_conversion_for_types_built_from_object_ref!(TextAttributesChangedEvent);