Flutter Engine
 
Loading...
Searching...
No Matches
fl_view_accessible.cc File Reference

Go to the source code of this file.

Classes

struct  _FlViewAccessible
 

Functions

static FlAccessibleNode * create_node (FlViewAccessible *self, FlutterSemanticsNode2 *semantics)
 
static FlAccessibleNode * lookup_node (FlViewAccessible *self, int32_t id)
 
static FlAccessibleNode * get_node (FlViewAccessible *self, FlutterSemanticsNode2 *semantics)
 
static gint fl_view_accessible_get_n_children (AtkObject *accessible)
 
static AtkObject * fl_view_accessible_ref_child (AtkObject *accessible, gint i)
 
static AtkRole fl_view_accessible_get_role (AtkObject *accessible)
 
static AtkStateSet * fl_view_accessible_ref_state_set (AtkObject *accessible)
 
static void fl_view_accessible_dispose (GObject *object)
 
static void fl_view_accessible_class_init (FlViewAccessibleClass *klass)
 
static void fl_view_accessible_init (FlViewAccessible *self)
 
FlViewAccessible * fl_view_accessible_new (FlEngine *engine, FlutterViewId view_id)
 
void fl_view_accessible_handle_update_semantics (FlViewAccessible *self, const FlutterSemanticsUpdate2 *update)
 

Variables

static constexpr int32_t kRootSemanticsNodeId = 0
 

Function Documentation

◆ create_node()

static FlAccessibleNode * create_node ( FlViewAccessible *  self,
FlutterSemanticsNode2 semantics 
)
static

Definition at line 29 of file fl_view_accessible.cc.

30 {
31 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
32 if (engine == nullptr) {
33 return nullptr;
34 }
35
36 if (semantics->flags2->is_text_field) {
37 return fl_accessible_text_field_new(engine, self->view_id, semantics->id);
38 }
39
40 return fl_accessible_node_new(engine, self->view_id, semantics->id);
41}
FlutterEngine engine
Definition main.cc:84
FlAccessibleNode * fl_accessible_node_new(FlEngine *engine, FlutterViewId view_id, int32_t node_id)
FlAccessibleNode * fl_accessible_text_field_new(FlEngine *engine, FlutterViewId view_id, int32_t id)
g_autoptr(GMutexLocker) locker
bool is_text_field
Whether the semantic node represents a text field.
Definition embedder.h:313
int32_t id
The unique identifier for this node.
Definition embedder.h:1613
FlutterSemanticsFlags * flags2
Definition embedder.h:1705

References engine, fl_accessible_node_new(), fl_accessible_text_field_new(), g_autoptr(), and self.

Referenced by get_node().

◆ fl_view_accessible_class_init()

static void fl_view_accessible_class_init ( FlViewAccessibleClass *  klass)
static

Definition at line 120 of file fl_view_accessible.cc.

120 {
121 ATK_OBJECT_CLASS(klass)->get_n_children = fl_view_accessible_get_n_children;
122 ATK_OBJECT_CLASS(klass)->ref_child = fl_view_accessible_ref_child;
123 ATK_OBJECT_CLASS(klass)->get_role = fl_view_accessible_get_role;
124 ATK_OBJECT_CLASS(klass)->ref_state_set = fl_view_accessible_ref_state_set;
125
126 G_OBJECT_CLASS(klass)->dispose = fl_view_accessible_dispose;
127}
static void fl_view_accessible_dispose(GObject *object)
static AtkStateSet * fl_view_accessible_ref_state_set(AtkObject *accessible)
static AtkRole fl_view_accessible_get_role(AtkObject *accessible)
static AtkObject * fl_view_accessible_ref_child(AtkObject *accessible, gint i)
static gint fl_view_accessible_get_n_children(AtkObject *accessible)

References fl_view_accessible_dispose(), fl_view_accessible_get_n_children(), fl_view_accessible_get_role(), fl_view_accessible_ref_child(), and fl_view_accessible_ref_state_set().

◆ fl_view_accessible_dispose()

static void fl_view_accessible_dispose ( GObject *  object)
static

Definition at line 110 of file fl_view_accessible.cc.

110 {
111 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(object);
112
113 g_clear_pointer(&self->semantics_nodes_by_id, g_hash_table_unref);
114
115 g_weak_ref_clear(&self->engine);
116
117 G_OBJECT_CLASS(fl_view_accessible_parent_class)->dispose(object);
118}

References self.

Referenced by fl_view_accessible_class_init().

◆ fl_view_accessible_get_n_children()

static gint fl_view_accessible_get_n_children ( AtkObject *  accessible)
static

Definition at line 75 of file fl_view_accessible.cc.

75 {
76 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(accessible);
77 FlAccessibleNode* node = lookup_node(self, 0);
78
79 if (node == nullptr) {
80 return 0;
81 }
82
83 return 1;
84}
static FlAccessibleNode * lookup_node(FlViewAccessible *self, int32_t id)

References lookup_node(), and self.

Referenced by fl_view_accessible_class_init().

◆ fl_view_accessible_get_role()

static AtkRole fl_view_accessible_get_role ( AtkObject *  accessible)
static

Definition at line 99 of file fl_view_accessible.cc.

99 {
100 return ATK_ROLE_PANEL;
101}

Referenced by fl_view_accessible_class_init().

◆ fl_view_accessible_handle_update_semantics()

void fl_view_accessible_handle_update_semantics ( FlViewAccessible *  accessible,
const FlutterSemanticsUpdate2 update 
)

fl_view_accessible_handle_update_semantics: @accessible: an #FlViewAccessible. @update: semantic update information.

Handle a semantics update from Flutter.

Definition at line 143 of file fl_view_accessible.cc.

145 {
146 g_return_if_fail(FL_IS_VIEW_ACCESSIBLE(self));
147
148 g_autoptr(GHashTable) pending_children =
149 g_hash_table_new_full(g_direct_hash, g_direct_equal, nullptr,
150 reinterpret_cast<GDestroyNotify>(fl_value_unref));
151 for (size_t i = 0; i < update->node_count; i++) {
152 FlutterSemanticsNode2* node = update->nodes[i];
153 FlAccessibleNode* atk_node = get_node(self, node);
154
155 fl_accessible_node_set_flags(atk_node, node->flags2);
157 fl_accessible_node_set_name(atk_node, node->label);
159 atk_node, node->rect.left + node->transform.transX,
160 node->rect.top + node->transform.transY,
161 node->rect.right - node->rect.left, node->rect.bottom - node->rect.top);
162 fl_accessible_node_set_value(atk_node, node->value);
166
169 g_hash_table_insert(pending_children, atk_node, children);
170 }
171
172 g_hash_table_foreach_remove(
173 pending_children,
174 [](gpointer key, gpointer value, gpointer user_data) -> gboolean {
175 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(user_data);
176
177 FlAccessibleNode* parent = FL_ACCESSIBLE_NODE(key);
178
179 size_t child_count = fl_value_get_length(static_cast<FlValue*>(value));
180 const int32_t* children_in_traversal_order =
181 fl_value_get_int32_list(static_cast<FlValue*>(value));
182
183 g_autoptr(GPtrArray) children = g_ptr_array_new();
184 for (size_t i = 0; i < child_count; i++) {
185 FlAccessibleNode* child =
186 lookup_node(self, children_in_traversal_order[i]);
187 g_assert(child != nullptr);
188 fl_accessible_node_set_parent(child, ATK_OBJECT(parent), i);
189 g_ptr_array_add(children, child);
190 }
191 fl_accessible_node_set_children(parent, children);
192
193 return TRUE;
194 },
195 self);
196}
void fl_accessible_node_set_name(FlAccessibleNode *self, const gchar *name)
void fl_accessible_node_set_text_direction(FlAccessibleNode *self, FlutterTextDirection direction)
void fl_accessible_node_set_text_selection(FlAccessibleNode *self, gint base, gint extent)
void fl_accessible_node_set_actions(FlAccessibleNode *self, FlutterSemanticsAction actions)
void fl_accessible_node_set_children(FlAccessibleNode *self, GPtrArray *children)
void fl_accessible_node_set_extents(FlAccessibleNode *self, gint x, gint y, gint width, gint height)
void fl_accessible_node_set_value(FlAccessibleNode *self, const gchar *value)
void fl_accessible_node_set_parent(FlAccessibleNode *self, AtkObject *parent, gint index)
void fl_accessible_node_set_flags(FlAccessibleNode *self, FlutterSemanticsFlags *flags)
return TRUE
g_hash_table_insert(self->handlers, g_strdup(channel), handler_new(handler, user_data, destroy_notify))
G_MODULE_EXPORT void fl_value_unref(FlValue *self)
Definition fl_value.cc:400
G_MODULE_EXPORT FlValue * fl_value_new_int32_list(const int32_t *data, size_t data_length)
Definition fl_value.cc:309
G_MODULE_EXPORT size_t fl_value_get_length(FlValue *self)
Definition fl_value.cc:724
G_MODULE_EXPORT const int32_t * fl_value_get_int32_list(FlValue *self)
Definition fl_value.cc:696
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition fl_value.h:42
static FlAccessibleNode * get_node(FlViewAccessible *self, FlutterSemanticsNode2 *semantics)
double bottom
Definition embedder.h:645
double top
Definition embedder.h:643
double left
Definition embedder.h:642
double right
Definition embedder.h:644
const int32_t * children_in_traversal_order
Array of child node IDs in traversal order. Has length child_count.
Definition embedder.h:1665
int32_t text_selection_extent
The position at which the text selection terminates.
Definition embedder.h:1625
FlutterTextDirection text_direction
Definition embedder.h:1656
FlutterSemanticsAction actions
The set of semantics actions applicable to this node.
Definition embedder.h:1621
FlutterRect rect
The bounding box for this node in its coordinate system.
Definition embedder.h:1658
FlutterTransformation transform
Definition embedder.h:1661
size_t child_count
The number of children this node has.
Definition embedder.h:1663
const char * label
A textual description of the node.
Definition embedder.h:1643
int32_t text_selection_base
The position at which the text selection originates.
Definition embedder.h:1623
const char * value
A textual description of the current value of the node.
Definition embedder.h:1647
size_t node_count
The number of semantics node updates.
Definition embedder.h:1800
FlutterSemanticsNode2 ** nodes
Definition embedder.h:1802
double transY
vertical translation
Definition embedder.h:400
double transX
horizontal translation
Definition embedder.h:394

References FlutterSemanticsNode2::actions, FlutterRect::bottom, FlutterSemanticsNode2::child_count, FlutterSemanticsNode2::children_in_traversal_order, fl_accessible_node_set_actions(), fl_accessible_node_set_children(), fl_accessible_node_set_extents(), fl_accessible_node_set_flags(), fl_accessible_node_set_name(), fl_accessible_node_set_parent(), fl_accessible_node_set_text_direction(), fl_accessible_node_set_text_selection(), fl_accessible_node_set_value(), fl_value_get_int32_list(), fl_value_get_length(), fl_value_new_int32_list(), fl_value_unref(), FlutterSemanticsNode2::flags2, g_autoptr(), g_hash_table_insert(), get_node(), i, key, FlutterSemanticsNode2::label, FlutterRect::left, lookup_node(), FlutterSemanticsUpdate2::node_count, FlutterSemanticsUpdate2::nodes, FlutterSemanticsNode2::rect, FlutterRect::right, self, FlutterSemanticsNode2::text_direction, FlutterSemanticsNode2::text_selection_base, FlutterSemanticsNode2::text_selection_extent, FlutterRect::top, FlutterSemanticsNode2::transform, FlutterTransformation::transX, FlutterTransformation::transY, TRUE, user_data, value, and FlutterSemanticsNode2::value.

Referenced by TEST(), TEST(), and update_semantics_cb().

◆ fl_view_accessible_init()

static void fl_view_accessible_init ( FlViewAccessible *  self)
static

Definition at line 129 of file fl_view_accessible.cc.

129 {
130 self->semantics_nodes_by_id = g_hash_table_new_full(
131 g_direct_hash, g_direct_equal, nullptr, g_object_unref);
132}

References self.

◆ fl_view_accessible_new()

FlViewAccessible * fl_view_accessible_new ( FlEngine *  engine,
FlutterViewId  view_id 
)

Definition at line 134 of file fl_view_accessible.cc.

135 {
136 FlViewAccessible* self =
137 FL_VIEW_ACCESSIBLE(g_object_new(fl_view_accessible_get_type(), nullptr));
138 g_weak_ref_init(&self->engine, engine);
139 self->view_id = view_id;
140 return self;
141}
G_BEGIN_DECLS FlutterViewId view_id

References engine, self, and view_id.

Referenced by setup_engine(), TEST(), and TEST().

◆ fl_view_accessible_ref_child()

static AtkObject * fl_view_accessible_ref_child ( AtkObject *  accessible,
gint  i 
)
static

Definition at line 87 of file fl_view_accessible.cc.

87 {
88 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(accessible);
89 FlAccessibleNode* node = lookup_node(self, 0);
90
91 if (i != 0 || node == nullptr) {
92 return nullptr;
93 }
94
95 return ATK_OBJECT(g_object_ref(node));
96}

References i, lookup_node(), and self.

Referenced by fl_view_accessible_class_init().

◆ fl_view_accessible_ref_state_set()

static AtkStateSet * fl_view_accessible_ref_state_set ( AtkObject *  accessible)
static

Definition at line 104 of file fl_view_accessible.cc.

104 {
105 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(accessible);
106 FlAccessibleNode* node = lookup_node(self, 0);
107 return node != nullptr ? atk_object_ref_state_set(ATK_OBJECT(node)) : nullptr;
108}

References lookup_node(), and self.

Referenced by fl_view_accessible_class_init().

◆ get_node()

static FlAccessibleNode * get_node ( FlViewAccessible *  self,
FlutterSemanticsNode2 semantics 
)
static

Definition at line 50 of file fl_view_accessible.cc.

51 {
52 FlAccessibleNode* node = lookup_node(self, semantics->id);
53 if (node != nullptr) {
54 return node;
55 }
56
57 node = create_node(self, semantics);
58 if (semantics->id == kRootSemanticsNodeId) {
59 fl_accessible_node_set_parent(node, ATK_OBJECT(self), 0);
60 }
61 g_hash_table_insert(self->semantics_nodes_by_id,
62 GINT_TO_POINTER(semantics->id),
63 reinterpret_cast<gpointer>(node));
64
65 // Update when root node is created.
66 if (!self->root_node_created && semantics->id == kRootSemanticsNodeId) {
67 g_signal_emit_by_name(self, "children-changed::add", 0, node, nullptr);
68 self->root_node_created = true;
69 }
70
71 return node;
72}
static FlAccessibleNode * create_node(FlViewAccessible *self, FlutterSemanticsNode2 *semantics)
static constexpr int32_t kRootSemanticsNodeId

References create_node(), fl_accessible_node_set_parent(), g_hash_table_insert(), FlutterSemanticsNode2::id, kRootSemanticsNodeId, lookup_node(), and self.

Referenced by fl_view_accessible_handle_update_semantics().

◆ lookup_node()

static FlAccessibleNode * lookup_node ( FlViewAccessible *  self,
int32_t  id 
)
static

Definition at line 43 of file fl_view_accessible.cc.

43 {
44 return FL_ACCESSIBLE_NODE(
45 g_hash_table_lookup(self->semantics_nodes_by_id, GINT_TO_POINTER(id)));
46}

References self.

Referenced by fl_view_accessible_get_n_children(), fl_view_accessible_handle_update_semantics(), fl_view_accessible_ref_child(), fl_view_accessible_ref_state_set(), and get_node().

Variable Documentation

◆ kRootSemanticsNodeId

constexpr int32_t kRootSemanticsNodeId = 0
staticconstexpr

Definition at line 11 of file fl_view_accessible.cc.

Referenced by get_node().