1 #include "AccessibleNode.h"
8 std::map<AtspiAccessible *, AccessibleNode *> AccessibleNode::mNodeMap{};
10 AccessibleNode::~AccessibleNode()
15 AccessibleNode::AccessibleNode() : AccessibleNode(nullptr)
17 // No meaning without AtspiAccessbile object
18 // prohibited to create this object with this constructor
21 AccessibleNode::AccessibleNode(AtspiAccessible *node)
22 : mNode(make_gobj_ref_unique(node)), mBoundingBox{0,0,0,0}, mSupportingIfaces(0), mFeatureProperty(0), mIsAlive(true)
24 // prohibited to create this object this constructor
25 // better to use AccessibleNode::get factory method.
27 LOG_SCOPE_F(1, "AccessibleNode constructor %p", mNode.get());
28 GArray *ifaces = atspi_accessible_get_interfaces(mNode.get());
30 for (unsigned int i = 0; i < ifaces->len; i++) {
31 char *iface = g_array_index(ifaces, char *, i);
32 if (!strcmp(iface, "Action"))
34 static_cast<int>(AccessibleNodeInterface::ACTION);
35 else if (!strcmp(iface, "Collection"))
37 static_cast<int>(AccessibleNodeInterface::COLLECTION);
38 else if (!strcmp(iface, "Component"))
40 static_cast<int>(AccessibleNodeInterface::COMPONENT);
41 else if (!strcmp(iface, "Document"))
43 static_cast<int>(AccessibleNodeInterface::DOCUMENT);
44 else if (!strcmp(iface, "EditableText"))
46 static_cast<int>(AccessibleNodeInterface::EDITABLETEXT);
47 else if (!strcmp(iface, "Hypertext"))
49 static_cast<int>(AccessibleNodeInterface::HYPERTEXT);
50 else if (!strcmp(iface, "Image"))
52 static_cast<int>(AccessibleNodeInterface::IMAGE);
53 else if (!strcmp(iface, "Selection"))
55 static_cast<int>(AccessibleNodeInterface::SELECTION);
56 else if (!strcmp(iface, "Text"))
58 static_cast<int>(AccessibleNodeInterface::TEXT);
59 else if (!strcmp(iface, "Value"))
61 static_cast<int>(AccessibleNodeInterface::VALUE);
62 else if (!strcmp(iface, "Accessible"))
64 static_cast<int>(AccessibleNodeInterface::ACCESSIBLE);
65 else if (!strcmp(iface, "Table"))
67 static_cast<int>(AccessibleNodeInterface::TABLE);
68 else if (!strcmp(iface, "TableCell"))
70 static_cast<int>(AccessibleNodeInterface::TABLECELL);
72 LOG_F(WARNING, "Not Supported interface found %s", iface);
78 std::unique_ptr<AccessibleNode> AccessibleNode::get(AtspiAccessible *node)
80 return std::make_unique<AccessibleNode>(node);
83 void AccessibleNode::refresh() const
85 gchar *rolename = atspi_accessible_get_role_name(mNode.get(), NULL);
92 gchar *uID = atspi_accessible_get_unique_id(mNode.get(), NULL);
98 mRes = "Not_Supported";
102 GHashTable *attributes = atspi_accessible_get_attributes(mNode, NULL);
103 char *t = (char*)g_hash_table_lookup(attributes, "type");
104 char *s = (char*)g_hash_table_lookup(attributes, "style");
106 //LOG_F(INFO, "%s %s", t, s);
108 if (t) mType = std::string(t);
109 if (s) mStyle = std::string(s);
114 g_hash_table_unref(attributes);
118 int AccessibleNode::getChildCount() const
120 return atspi_accessible_get_child_count(mNode.get(), NULL);
123 std::unique_ptr<AccessibleNode> AccessibleNode::getChildAt(int index) const
125 AtspiAccessible *child =
126 atspi_accessible_get_child_at_index(mNode.get(), index, NULL);
128 auto node = AccessibleNode::get(child);
129 g_object_unref(child);
132 return AccessibleNode::get(nullptr);
135 std::unique_ptr<AccessibleNode> AccessibleNode::getParent() const
137 AtspiAccessible *parent = atspi_accessible_get_parent(mNode.get(), NULL);
138 auto node = AccessibleNode::get(parent);
139 if (parent) g_object_unref(parent);
143 void AccessibleNode::print(int d, int m) const
145 if (m <= 0 || d > m) return;
151 for (int i = 0; i < n; i++) {
152 auto child = getChildAt(i);
153 if (child) child->print(d + 1, m);
157 void AccessibleNode::print(int d) const
159 char *name = atspi_accessible_get_name(mNode.get(), NULL);
160 char *role = atspi_accessible_get_role_name(mNode.get(), NULL);
161 LOG_F(INFO, "%s - %p(%s) / role:%s, pkg:%s, text:%s",
162 std::string(d, ' ').c_str(), mNode.get(), name, role, getPkg().c_str(),
168 bool AccessibleNode::isSupporting(AccessibleNodeInterface thisIface) const
170 return (mSupportingIfaces & static_cast<int>(thisIface)) != 0;
173 bool AccessibleNode::hasFeatureProperty(NodeFeatureProperties prop) const
175 return (mFeatureProperty & static_cast<int>(prop)) != 0;
178 void AccessibleNode::setFeatureProperty(NodeFeatureProperties prop, bool has)
181 mFeatureProperty |= static_cast<int>(prop);
183 mFeatureProperty &= ~static_cast<int>(prop);
186 std::string AccessibleNode::getDesc() const
191 std::string AccessibleNode::getText() const
193 gchar *name = atspi_accessible_get_name(mNode.get(), NULL);
201 std::string AccessibleNode::getPkg() const
206 std::string AccessibleNode::getRes() const
210 std::string AccessibleNode::getType() const
214 Rect<int> AccessibleNode::getBoundingBox() const
216 AtspiComponent *component = atspi_accessible_get_component_iface(mNode.get());
218 AtspiRect *extent = atspi_component_get_extents(
219 component, ATSPI_COORD_TYPE_SCREEN, NULL);
222 Rect<int>{extent->x, extent->y, extent->x + extent->width,
223 extent->y + extent->height};
226 g_object_unref(component);
232 bool AccessibleNode::isCheckable() const
234 return hasFeatureProperty(NodeFeatureProperties::CHECKABLE);
237 bool AccessibleNode::isChecked() const
239 return hasFeatureProperty(NodeFeatureProperties::CHECKED);
242 bool AccessibleNode::isClickable() const
244 return hasFeatureProperty(NodeFeatureProperties::CLICKABLE);
247 bool AccessibleNode::isEnabled() const
249 return hasFeatureProperty(NodeFeatureProperties::ENABLED);
252 bool AccessibleNode::isFocusable() const
254 return hasFeatureProperty(NodeFeatureProperties::FOCUSABLE);
257 bool AccessibleNode::isFocused() const
259 return hasFeatureProperty(NodeFeatureProperties::FOCUSED);
262 bool AccessibleNode::isLongClickable() const
264 return hasFeatureProperty(NodeFeatureProperties::LONGCLICKABLE);
267 bool AccessibleNode::isScrollable() const
269 return hasFeatureProperty(NodeFeatureProperties::SCROLLABLE);
272 bool AccessibleNode::isSelectable() const
274 return hasFeatureProperty(NodeFeatureProperties::SELECTABLE);
277 bool AccessibleNode::isSelected() const
279 return hasFeatureProperty(NodeFeatureProperties::SELECTED);
282 bool AccessibleNode::isVisible() const
284 return hasFeatureProperty(NodeFeatureProperties::VISIBILITY);
287 AtspiAccessible *AccessibleNode::getAccessible() const
292 void AccessibleNode::setValue(std::string &text) const
294 AtspiEditableText *iface = atspi_accessible_get_editable_text(mNode.get());
296 atspi_editable_text_insert_text(iface, 0, text.c_str(), text.length(),