Flutter Engine
The Flutter Engine
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Classes | Enumerations | Functions | Variables
fl_view_accessible.cc File Reference
#include "flutter/shell/platform/linux/fl_view_accessible.h"
#include "flutter/shell/platform/linux/fl_accessible_node.h"
#include "flutter/shell/platform/linux/fl_accessible_text_field.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_value.h"
#include "flutter/shell/platform/linux/public/flutter_linux/fl_view.h"

Go to the source code of this file.

Classes

struct  _FlViewAccessible
 

Enumerations

enum  { kProp0 , kPropEngine , kPropLast }
 

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)
 
void fl_view_accessible_handle_update_semantics (FlViewAccessible *self, const FlutterSemanticsUpdate2 *update)
 

Variables

static constexpr int32_t kRootSemanticsNodeId = 0
 

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
kProp0 
kPropEngine 
kPropLast 

Definition at line 25 of file fl_view_accessible.cc.

@ kPropEngine
@ kPropLast
@ kProp0

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 if (semantics->flags & kFlutterSemanticsFlagIsTextField) {
32 return fl_accessible_text_field_new(self->engine, semantics->id);
33 }
34
35 return fl_accessible_node_new(self->engine, semantics->id);
36}
@ kFlutterSemanticsFlagIsTextField
Whether the semantic node represents a text field.
Definition: embedder.h:183
FlAccessibleNode * fl_accessible_node_new(FlEngine *engine, int32_t id)
FlAccessibleNode * fl_accessible_text_field_new(FlEngine *engine, int32_t id)
int32_t id
The unique identifier for this node.
Definition: embedder.h:1337
FlutterSemanticsFlag flags
The set of semantics flags associated with this node.
Definition: embedder.h:1339

◆ fl_view_accessible_class_init()

static void fl_view_accessible_class_init ( FlViewAccessibleClass *  klass)
static

Definition at line 119 of file fl_view_accessible.cc.

119 {
120 ATK_OBJECT_CLASS(klass)->get_n_children = fl_view_accessible_get_n_children;
121 ATK_OBJECT_CLASS(klass)->ref_child = fl_view_accessible_ref_child;
122 ATK_OBJECT_CLASS(klass)->get_role = fl_view_accessible_get_role;
123 ATK_OBJECT_CLASS(klass)->ref_state_set = fl_view_accessible_ref_state_set;
124
125 G_OBJECT_CLASS(klass)->dispose = fl_view_accessible_dispose;
126}
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)

◆ fl_view_accessible_dispose()

static void fl_view_accessible_dispose ( GObject *  object)
static

Definition at line 105 of file fl_view_accessible.cc.

105 {
106 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(object);
107
108 g_clear_pointer(&self->semantics_nodes_by_id, g_hash_table_unref);
109
110 if (self->engine != nullptr) {
111 g_object_remove_weak_pointer(object,
112 reinterpret_cast<gpointer*>(&self->engine));
113 self->engine = nullptr;
114 }
115
116 G_OBJECT_CLASS(fl_view_accessible_parent_class)->dispose(object);
117}

◆ fl_view_accessible_get_n_children()

static gint fl_view_accessible_get_n_children ( AtkObject *  accessible)
static

Definition at line 70 of file fl_view_accessible.cc.

70 {
71 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(accessible);
72 FlAccessibleNode* node = lookup_node(self, 0);
73
74 if (node == nullptr) {
75 return 0;
76 }
77
78 return 1;
79}
static FlAccessibleNode * lookup_node(FlViewAccessible *self, int32_t id)

◆ fl_view_accessible_get_role()

static AtkRole fl_view_accessible_get_role ( AtkObject *  accessible)
static

Definition at line 94 of file fl_view_accessible.cc.

94 {
95 return ATK_ROLE_PANEL;
96}

◆ 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 142 of file fl_view_accessible.cc.

144 {
145 g_autoptr(GHashTable) pending_children =
146 g_hash_table_new_full(g_direct_hash, g_direct_equal, nullptr,
147 reinterpret_cast<GDestroyNotify>(fl_value_unref));
148 for (size_t i = 0; i < update->node_count; i++) {
149 FlutterSemanticsNode2* node = update->nodes[i];
150 FlAccessibleNode* atk_node = get_node(self, node);
151
152 fl_accessible_node_set_flags(atk_node, node->flags);
154 fl_accessible_node_set_name(atk_node, node->label);
156 atk_node, node->rect.left + node->transform.transX,
157 node->rect.top + node->transform.transY,
158 node->rect.right - node->rect.left, node->rect.bottom - node->rect.top);
159 fl_accessible_node_set_value(atk_node, node->value);
163
166 g_hash_table_insert(pending_children, atk_node, children);
167 }
168
169 g_hash_table_foreach_remove(
170 pending_children,
171 [](gpointer key, gpointer value, gpointer user_data) -> gboolean {
172 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(user_data);
173
174 FlAccessibleNode* parent = FL_ACCESSIBLE_NODE(key);
175
176 size_t child_count = fl_value_get_length(static_cast<FlValue*>(value));
177 const int32_t* children_in_traversal_order =
178 fl_value_get_int32_list(static_cast<FlValue*>(value));
179
180 g_autoptr(GPtrArray) children = g_ptr_array_new();
181 for (size_t i = 0; i < child_count; i++) {
182 FlAccessibleNode* child =
183 lookup_node(self, children_in_traversal_order[i]);
184 g_assert(child != nullptr);
185 fl_accessible_node_set_parent(child, ATK_OBJECT(parent), i);
186 g_ptr_array_add(children, child);
187 }
188 fl_accessible_node_set_children(parent, children);
189
190 return true;
191 },
192 self);
193}
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_flags(FlAccessibleNode *self, FlutterSemanticsFlag flags)
void fl_accessible_node_set_parent(FlAccessibleNode *self, AtkObject *parent, gint index)
uint8_t value
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)
Definition: update.py:1
double bottom
Definition: embedder.h:441
double top
Definition: embedder.h:439
double left
Definition: embedder.h:438
double right
Definition: embedder.h:440
const int32_t * children_in_traversal_order
Array of child node IDs in traversal order. Has length child_count.
Definition: embedder.h:1385
int32_t text_selection_extent
The position at which the text selection terminates.
Definition: embedder.h:1345
FlutterTextDirection text_direction
Definition: embedder.h:1376
FlutterSemanticsAction actions
The set of semantics actions applicable to this node.
Definition: embedder.h:1341
FlutterRect rect
The bounding box for this node in its coordinate system.
Definition: embedder.h:1378
FlutterTransformation transform
Definition: embedder.h:1381
size_t child_count
The number of children this node has.
Definition: embedder.h:1383
const char * label
A textual description of the node.
Definition: embedder.h:1363
int32_t text_selection_base
The position at which the text selection originates.
Definition: embedder.h:1343
const char * value
A textual description of the current value of the node.
Definition: embedder.h:1367
double transY
vertical translation
Definition: embedder.h:289
double transX
horizontal translation
Definition: embedder.h:283
void * user_data

◆ fl_view_accessible_init()

static void fl_view_accessible_init ( FlViewAccessible *  self)
static

Definition at line 128 of file fl_view_accessible.cc.

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

◆ fl_view_accessible_new()

FlViewAccessible * fl_view_accessible_new ( FlEngine *  engine)

Definition at line 133 of file fl_view_accessible.cc.

133 {
134 FlViewAccessible* self =
135 FL_VIEW_ACCESSIBLE(g_object_new(fl_view_accessible_get_type(), nullptr));
136 self->engine = engine;
137 g_object_add_weak_pointer(G_OBJECT(self),
138 reinterpret_cast<gpointer*>(&self->engine));
139 return self;
140}
FlutterEngine engine
Definition: main.cc:68

◆ fl_view_accessible_ref_child()

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

Definition at line 82 of file fl_view_accessible.cc.

82 {
83 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(accessible);
84 FlAccessibleNode* node = lookup_node(self, 0);
85
86 if (i != 0 || node == nullptr) {
87 return nullptr;
88 }
89
90 return ATK_OBJECT(g_object_ref(node));
91}

◆ fl_view_accessible_ref_state_set()

static AtkStateSet * fl_view_accessible_ref_state_set ( AtkObject *  accessible)
static

Definition at line 99 of file fl_view_accessible.cc.

99 {
100 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(accessible);
101 FlAccessibleNode* node = lookup_node(self, 0);
102 return node != nullptr ? atk_object_ref_state_set(ATK_OBJECT(node)) : nullptr;
103}

◆ get_node()

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

Definition at line 45 of file fl_view_accessible.cc.

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

◆ lookup_node()

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

Definition at line 38 of file fl_view_accessible.cc.

38 {
39 return FL_ACCESSIBLE_NODE(
40 g_hash_table_lookup(self->semantics_nodes_by_id, GINT_TO_POINTER(id)));
41}

Variable Documentation

◆ kRootSemanticsNodeId

constexpr int32_t kRootSemanticsNodeId = 0
staticconstexpr

Definition at line 11 of file fl_view_accessible.cc.