Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion shell/platform/linux/fl_accessible_node.cc
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ struct _FlAccessibleNode {

int32_t id;
gchar* name;
gint index;
gint x, y, width, height;
GPtrArray* actions;
gsize actions_length;
Expand Down Expand Up @@ -164,6 +165,12 @@ static AtkObject* fl_accessible_node_get_parent(AtkObject* accessible) {
return self->parent;
}

// Implements AtkObject::get_index_in_parent.
static gint fl_accessible_node_get_index_in_parent(AtkObject* accessible) {
FlAccessibleNode* self = FL_ACCESSIBLE_NODE(accessible);
return self->index;
}

// Implements AtkObject::get_n_children.
static gint fl_accessible_node_get_n_children(AtkObject* accessible) {
FlAccessibleNode* self = FL_ACCESSIBLE_NODE(accessible);
Expand Down Expand Up @@ -309,6 +316,8 @@ static void fl_accessible_node_class_init(FlAccessibleNodeClass* klass) {
G_OBJECT_CLASS(klass)->dispose = fl_accessible_node_dispose;
ATK_OBJECT_CLASS(klass)->get_name = fl_accessible_node_get_name;
ATK_OBJECT_CLASS(klass)->get_parent = fl_accessible_node_get_parent;
ATK_OBJECT_CLASS(klass)->get_index_in_parent =
fl_accessible_node_get_index_in_parent;
ATK_OBJECT_CLASS(klass)->get_n_children = fl_accessible_node_get_n_children;
ATK_OBJECT_CLASS(klass)->ref_child = fl_accessible_node_ref_child;
ATK_OBJECT_CLASS(klass)->get_role = fl_accessible_node_get_role;
Expand Down Expand Up @@ -346,9 +355,12 @@ FlAccessibleNode* fl_accessible_node_new(FlEngine* engine, int32_t id) {
return self;
}

void fl_accessible_node_set_parent(FlAccessibleNode* self, AtkObject* parent) {
void fl_accessible_node_set_parent(FlAccessibleNode* self,
AtkObject* parent,
gint index) {
g_return_if_fail(FL_IS_ACCESSIBLE_NODE(self));
self->parent = parent;
self->index = index;
g_object_add_weak_pointer(G_OBJECT(self),
reinterpret_cast<gpointer*>(&(self->parent)));
}
Expand Down
5 changes: 4 additions & 1 deletion shell/platform/linux/fl_accessible_node.h
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,13 @@ FlAccessibleNode* fl_accessible_node_new(FlEngine* engine, int32_t id);
* fl_accessible_node_new:
* @node: an #FlAccessibleNode.
* @parent: an #AtkObject.
* @index: the index of this node in the parent.
*
* Sets the parent of this node. The parent can be changed at any time.
*/
void fl_accessible_node_set_parent(FlAccessibleNode* node, AtkObject* parent);
void fl_accessible_node_set_parent(FlAccessibleNode* node,
AtkObject* parent,
gint index);

/**
* fl_accessible_node_new:
Expand Down
7 changes: 5 additions & 2 deletions shell/platform/linux/fl_accessible_node_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,17 @@ TEST(FlAccessibleNodeTest, BuildTree) {

g_autoptr(FlAccessibleNode) root = fl_accessible_node_new(engine, 0);
g_autoptr(FlAccessibleNode) child1 = fl_accessible_node_new(engine, 1);
fl_accessible_node_set_parent(child1, ATK_OBJECT(root));
fl_accessible_node_set_parent(child1, ATK_OBJECT(root), 0);
g_autoptr(FlAccessibleNode) child2 = fl_accessible_node_new(engine, 1);
fl_accessible_node_set_parent(child2, ATK_OBJECT(root));
fl_accessible_node_set_parent(child2, ATK_OBJECT(root), 1);
g_autoptr(GPtrArray) children =
g_ptr_array_new_with_free_func(g_object_unref);
g_ptr_array_add(children, g_object_ref(child1));
g_ptr_array_add(children, g_object_ref(child2));
fl_accessible_node_set_children(root, children);

EXPECT_EQ(atk_object_get_n_accessible_children(ATK_OBJECT(root)), 2);
EXPECT_EQ(atk_object_get_index_in_parent(ATK_OBJECT(root)), 0);
g_autoptr(AtkObject) c1 =
atk_object_ref_accessible_child(ATK_OBJECT(root), 0);
EXPECT_EQ(ATK_OBJECT(child1), c1);
Expand All @@ -33,9 +34,11 @@ TEST(FlAccessibleNodeTest, BuildTree) {
EXPECT_EQ(atk_object_get_parent(ATK_OBJECT(root)), nullptr);

EXPECT_EQ(atk_object_get_parent(ATK_OBJECT(child1)), ATK_OBJECT(root));
EXPECT_EQ(atk_object_get_index_in_parent(ATK_OBJECT(child1)), 0);
EXPECT_EQ(atk_object_get_n_accessible_children(ATK_OBJECT(child1)), 0);

EXPECT_EQ(atk_object_get_parent(ATK_OBJECT(child2)), ATK_OBJECT(root));
EXPECT_EQ(atk_object_get_index_in_parent(ATK_OBJECT(child2)), 1);
EXPECT_EQ(atk_object_get_n_accessible_children(ATK_OBJECT(child2)), 0);
}

Expand Down
4 changes: 2 additions & 2 deletions shell/platform/linux/fl_view_accessible.cc
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ static FlAccessibleNode* get_node(FlViewAccessible* self, int32_t id) {
FlView* view = FL_VIEW(gtk_accessible_get_widget(GTK_ACCESSIBLE(self)));
node = fl_accessible_node_new(fl_view_get_engine(view), id);
if (id == 0) {
fl_accessible_node_set_parent(node, ATK_OBJECT(self));
fl_accessible_node_set_parent(node, ATK_OBJECT(self), 0);
}
g_hash_table_insert(self->semantics_nodes_by_id, GINT_TO_POINTER(id),
reinterpret_cast<gpointer>(node));
Expand Down Expand Up @@ -91,7 +91,7 @@ void fl_view_accessible_handle_update_semantics_node(
for (size_t i = 0; i < node->child_count; i++) {
FlAccessibleNode* child =
get_node(self, node->children_in_traversal_order[i]);
fl_accessible_node_set_parent(child, ATK_OBJECT(atk_node));
fl_accessible_node_set_parent(child, ATK_OBJECT(atk_node), i);
g_ptr_array_add(children, child);
}
fl_accessible_node_set_children(atk_node, children);
Expand Down