Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
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

 G_DEFINE_TYPE (FlViewAccessible, fl_view_accessible, GTK_TYPE_CONTAINER_ACCESSIBLE) static void init_engine(FlViewAccessible *self
 
 g_object_add_weak_pointer (G_OBJECT(self), reinterpret_cast< gpointer * >(&self->engine))
 
static FlEngine * get_engine (FlViewAccessible *self)
 
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 void fl_view_accessible_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
 
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)
 
void fl_view_accessible_handle_update_semantics (FlViewAccessible *self, const FlutterSemanticsUpdate2 *update)
 

Variables

FlEngine * engine
 

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
kProp0 
kPropEngine 
kPropLast 

Definition at line 20 of file fl_view_accessible.cc.

Function Documentation

◆ create_node()

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

Definition at line 41 of file fl_view_accessible.cc.

42 {
43 FlEngine* engine = get_engine(self);
44
45 if (semantics->flags & kFlutterSemanticsFlagIsTextField) {
46 return fl_accessible_text_field_new(engine, semantics->id);
47 }
48
49 return fl_accessible_node_new(engine, semantics->id);
50}
@ kFlutterSemanticsFlagIsTextField
Whether the semantic node represents a text field.
Definition embedder.h:181
FlAccessibleNode * fl_accessible_node_new(FlEngine *engine, int32_t id)
FlAccessibleNode * fl_accessible_text_field_new(FlEngine *engine, int32_t id)
static FlEngine * get_engine(FlViewAccessible *self)
FlEngine * engine
int32_t id
The unique identifier for this node.
Definition embedder.h:1335
FlutterSemanticsFlag flags
The set of semantics flags associated with this node.
Definition embedder.h:1337

◆ fl_view_accessible_class_init()

static void fl_view_accessible_class_init ( FlViewAccessibleClass *  klass)
static

Definition at line 137 of file fl_view_accessible.cc.

137 {
138 ATK_OBJECT_CLASS(klass)->get_n_children = fl_view_accessible_get_n_children;
139 ATK_OBJECT_CLASS(klass)->ref_child = fl_view_accessible_ref_child;
140 ATK_OBJECT_CLASS(klass)->get_role = fl_view_accessible_get_role;
141
142 G_OBJECT_CLASS(klass)->dispose = fl_view_accessible_dispose;
143 G_OBJECT_CLASS(klass)->set_property = fl_view_accessible_set_property;
144
145 g_object_class_install_property(
146 G_OBJECT_CLASS(klass), kPropEngine,
147 g_param_spec_object(
148 "engine", "engine", "Flutter engine", fl_engine_get_type(),
149 static_cast<GParamFlags>(G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
150 G_PARAM_STATIC_STRINGS)));
151}
static void fl_view_accessible_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
static void fl_view_accessible_dispose(GObject *object)
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 123 of file fl_view_accessible.cc.

123 {
124 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(object);
125
126 g_clear_pointer(&self->semantics_nodes_by_id, g_hash_table_unref);
127
128 if (self->engine != nullptr) {
129 g_object_remove_weak_pointer(object,
130 reinterpret_cast<gpointer*>(&self->engine));
131 self->engine = nullptr;
132 }
133
134 G_OBJECT_CLASS(fl_view_accessible_parent_class)->dispose(object);
135}

◆ fl_view_accessible_get_n_children()

static gint fl_view_accessible_get_n_children ( AtkObject *  accessible)
static

Definition at line 79 of file fl_view_accessible.cc.

79 {
80 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(accessible);
81 FlAccessibleNode* node = lookup_node(self, 0);
82
83 if (node == nullptr) {
84 return 0;
85 }
86
87 return 1;
88}
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 103 of file fl_view_accessible.cc.

103 {
104 return ATK_ROLE_PANEL;
105}

◆ fl_view_accessible_handle_update_semantics()

void fl_view_accessible_handle_update_semantics ( FlViewAccessible *  self,
const FlutterSemanticsUpdate2 update 
)

Definition at line 158 of file fl_view_accessible.cc.

160 {
161 g_autoptr(GHashTable) pending_children =
162 g_hash_table_new_full(g_direct_hash, g_direct_equal, nullptr,
163 reinterpret_cast<GDestroyNotify>(fl_value_unref));
164
165 for (size_t i = 0; i < update->node_count; i++) {
166 FlutterSemanticsNode2* node = update->nodes[i];
167 FlAccessibleNode* atk_node = get_node(self, node);
168
169 fl_accessible_node_set_flags(atk_node, node->flags);
171 fl_accessible_node_set_name(atk_node, node->label);
173 atk_node, node->rect.left + node->transform.transX,
174 node->rect.top + node->transform.transY,
175 node->rect.right - node->rect.left, node->rect.bottom - node->rect.top);
176 fl_accessible_node_set_value(atk_node, node->value);
180
183 g_hash_table_insert(pending_children, atk_node, children);
184 }
185
186 g_hash_table_foreach_remove(
187 pending_children,
188 [](gpointer key, gpointer value, gpointer user_data) -> gboolean {
189 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(user_data);
190
191 FlAccessibleNode* parent = FL_ACCESSIBLE_NODE(key);
192
193 size_t child_count = fl_value_get_length(static_cast<FlValue*>(value));
194 const int32_t* children_in_traversal_order =
195 fl_value_get_int32_list(static_cast<FlValue*>(value));
196
197 g_autoptr(GPtrArray) children = g_ptr_array_new();
198 for (size_t i = 0; i < child_count; i++) {
199 FlAccessibleNode* child =
200 lookup_node(self, children_in_traversal_order[i]);
201 g_assert(child != nullptr);
202 fl_accessible_node_set_parent(child, ATK_OBJECT(parent), i);
203 g_ptr_array_add(children, child);
204 }
205 fl_accessible_node_set_children(parent, children);
206
207 return true;
208 },
209 self);
210}
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)
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:439
double top
Definition embedder.h:437
double left
Definition embedder.h:436
double right
Definition embedder.h:438
const int32_t * children_in_traversal_order
Array of child node IDs in traversal order. Has length child_count.
Definition embedder.h:1383
int32_t text_selection_extent
The position at which the text selection terminates.
Definition embedder.h:1343
FlutterTextDirection text_direction
Definition embedder.h:1374
FlutterSemanticsAction actions
The set of semantics actions applicable to this node.
Definition embedder.h:1339
FlutterRect rect
The bounding box for this node in its coordinate system.
Definition embedder.h:1376
FlutterTransformation transform
Definition embedder.h:1379
size_t child_count
The number of children this node has.
Definition embedder.h:1381
const char * label
A textual description of the node.
Definition embedder.h:1361
int32_t text_selection_base
The position at which the text selection originates.
Definition embedder.h:1341
const char * value
A textual description of the current value of the node.
Definition embedder.h:1365
double transY
vertical translation
Definition embedder.h:287
double transX
horizontal translation
Definition embedder.h:281

◆ fl_view_accessible_init()

static void fl_view_accessible_init ( FlViewAccessible *  self)
static

Definition at line 153 of file fl_view_accessible.cc.

153 {
154 self->semantics_nodes_by_id = g_hash_table_new_full(
155 g_direct_hash, g_direct_equal, nullptr, g_object_unref);
156}

◆ fl_view_accessible_ref_child()

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

Definition at line 91 of file fl_view_accessible.cc.

91 {
92 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(accessible);
93 FlAccessibleNode* node = lookup_node(self, 0);
94
95 if (i != 0 || node == nullptr) {
96 return nullptr;
97 }
98
99 return ATK_OBJECT(g_object_ref(node));
100}

◆ fl_view_accessible_set_property()

static void fl_view_accessible_set_property ( GObject *  object,
guint  prop_id,
const GValue *  value,
GParamSpec *  pspec 
)
static

Definition at line 108 of file fl_view_accessible.cc.

111 {
112 FlViewAccessible* self = FL_VIEW_ACCESSIBLE(object);
113 switch (prop_id) {
114 case kPropEngine:
115 init_engine(self, FL_ENGINE(g_value_get_object(value)));
116 break;
117 default:
118 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
119 break;
120 }
121}
guint const GValue GParamSpec * pspec

◆ G_DEFINE_TYPE()

G_DEFINE_TYPE ( FlViewAccessible  ,
fl_view_accessible  ,
GTK_TYPE_CONTAINER_ACCESSIBLE   
)

◆ g_object_add_weak_pointer()

g_object_add_weak_pointer ( G_OBJECT(self ,
reinterpret_cast< gpointer * > &->  engine 
)

◆ get_engine()

static FlEngine * get_engine ( FlViewAccessible *  self)
static

Definition at line 33 of file fl_view_accessible.cc.

33 {
34 if (self->engine == nullptr) {
35 FlView* view = FL_VIEW(gtk_accessible_get_widget(GTK_ACCESSIBLE(self)));
36 init_engine(self, fl_view_get_engine(view));
37 }
38 return self->engine;
39}
G_MODULE_EXPORT FlEngine * fl_view_get_engine(FlView *self)
Definition fl_view.cc:800

◆ get_node()

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

Definition at line 59 of file fl_view_accessible.cc.

60 {
61 FlAccessibleNode* node = lookup_node(self, semantics->id);
62 if (node != nullptr) {
63 return node;
64 }
65
66 node = create_node(self, semantics);
67 if (semantics->id == 0) {
68 fl_accessible_node_set_parent(node, ATK_OBJECT(self), 0);
69 g_signal_emit_by_name(self, "children-changed::add", 0, node, nullptr);
70 }
71 g_hash_table_insert(self->semantics_nodes_by_id,
72 GINT_TO_POINTER(semantics->id),
73 reinterpret_cast<gpointer>(node));
74
75 return node;
76}
static FlAccessibleNode * create_node(FlViewAccessible *self, FlutterSemanticsNode2 *semantics)

◆ lookup_node()

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

Definition at line 52 of file fl_view_accessible.cc.

52 {
53 return FL_ACCESSIBLE_NODE(
54 g_hash_table_lookup(self->semantics_nodes_by_id, GINT_TO_POINTER(id)));
55}

Variable Documentation

◆ engine

self engine
Initial value:
{
g_assert(self->engine == nullptr)

Definition at line 26 of file fl_view_accessible.cc.