accesskit_unix/atspi/interfaces/
component.rs

1// Copyright 2022 The AccessKit Authors. All rights reserved.
2// Licensed under the Apache License, Version 2.0 (found in
3// the LICENSE-APACHE file) or the MIT license (found in
4// the LICENSE-MIT file), at your option.
5
6use accesskit_atspi_common::{PlatformNode, Rect};
7use atspi::{CoordType, Layer};
8use zbus::{fdo, interface, names::OwnedUniqueName};
9
10use crate::atspi::{ObjectId, OwnedObjectAddress};
11
12pub(crate) struct ComponentInterface {
13    bus_name: OwnedUniqueName,
14    node: PlatformNode,
15}
16
17impl ComponentInterface {
18    pub fn new(bus_name: OwnedUniqueName, node: PlatformNode) -> Self {
19        Self { bus_name, node }
20    }
21
22    fn map_error(&self) -> impl '_ + FnOnce(accesskit_atspi_common::Error) -> fdo::Error {
23        |error| crate::util::map_error_from_node(&self.node, error)
24    }
25}
26
27#[interface(name = "org.a11y.atspi.Component")]
28impl ComponentInterface {
29    fn contains(&self, x: i32, y: i32, coord_type: CoordType) -> fdo::Result<bool> {
30        self.node
31            .contains(x, y, coord_type)
32            .map_err(self.map_error())
33    }
34
35    fn get_accessible_at_point(
36        &self,
37        x: i32,
38        y: i32,
39        coord_type: CoordType,
40    ) -> fdo::Result<(OwnedObjectAddress,)> {
41        let accessible = self
42            .node
43            .accessible_at_point(x, y, coord_type)
44            .map_err(self.map_error())?
45            .map(|node| ObjectId::Node {
46                adapter: self.node.adapter_id(),
47                node,
48            });
49        Ok(super::optional_object_address(&self.bus_name, accessible))
50    }
51
52    fn get_extents(&self, coord_type: CoordType) -> fdo::Result<(Rect,)> {
53        self.node
54            .extents(coord_type)
55            .map(|rect| (rect,))
56            .map_err(self.map_error())
57    }
58
59    fn get_layer(&self) -> fdo::Result<Layer> {
60        self.node.layer().map_err(self.map_error())
61    }
62
63    fn grab_focus(&self) -> fdo::Result<bool> {
64        self.node.grab_focus().map_err(self.map_error())
65    }
66
67    fn scroll_to_point(&self, coord_type: CoordType, x: i32, y: i32) -> fdo::Result<bool> {
68        self.node
69            .scroll_to_point(coord_type, x, y)
70            .map_err(self.map_error())
71    }
72}