Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
fl_accessible_text_field.cc File Reference

Go to the source code of this file.

Classes

struct  _FlAccessibleTextField
 

Typedefs

typedef bool(* FlTextBoundaryCallback) (const PangoLogAttr *attr)
 

Functions

static void fl_accessible_text_iface_init (AtkTextIface *iface)
 
static void fl_accessible_editable_text_iface_init (AtkEditableTextIface *iface)
 
 G_DEFINE_TYPE_WITH_CODE (FlAccessibleTextField, fl_accessible_text_field, fl_accessible_node_get_type(), G_IMPLEMENT_INTERFACE(ATK_TYPE_EDITABLE_TEXT, fl_accessible_editable_text_iface_init)) static gchar *get_substring(FlAccessibleTextField *self
 
 if (end==-1)
 
return g_utf8_substring (value, start, end)
 
static PangoContext * get_pango_context (FlAccessibleTextField *self)
 
static PangoLayout * create_pango_layout (FlAccessibleTextField *self)
 
static gchar * get_string_at_offset (FlAccessibleTextField *self, gint start, gint end, FlTextBoundaryCallback is_start, FlTextBoundaryCallback is_end, gint *start_offset, gint *end_offset)
 
static gchar * get_char_at_offset (FlAccessibleTextField *self, gint offset, gint *start_offset, gint *end_offset)
 
static gchar * get_word_at_offset (FlAccessibleTextField *self, gint offset, gint *start_offset, gint *end_offset)
 
static gchar * get_sentence_at_offset (FlAccessibleTextField *self, gint offset, gint *start_offset, gint *end_offset)
 
static gchar * get_line_at_offset (FlAccessibleTextField *self, gint offset, gint *start_offset, gint *end_offset)
 
static gchar * get_paragraph_at_offset (FlAccessibleTextField *self, gint offset, gint *start_offset, gint *end_offset)
 
static void perform_set_text_action (FlAccessibleTextField *self, const char *text)
 
static void perform_set_selection_action (FlAccessibleTextField *self, gint base, gint extent)
 
static void fl_accessible_text_field_dispose (GObject *object)
 
static void fl_accessible_text_field_set_value (FlAccessibleNode *node, const gchar *value)
 
static void fl_accessible_text_field_set_text_selection (FlAccessibleNode *node, gint base, gint extent)
 
static void fl_accessible_text_field_set_text_direction (FlAccessibleNode *node, FlutterTextDirection direction)
 
void fl_accessible_text_field_perform_action (FlAccessibleNode *self, FlutterSemanticsAction action, GBytes *data)
 
static gint fl_accessible_text_field_get_character_count (AtkText *text)
 
static gchar * fl_accessible_text_field_get_text (AtkText *text, gint start_offset, gint end_offset)
 
static gchar * fl_accessible_text_field_get_string_at_offset (AtkText *text, gint offset, AtkTextGranularity granularity, gint *start_offset, gint *end_offset)
 
static gchar * fl_accessible_text_field_get_text_at_offset (AtkText *text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset)
 
static gint fl_accessible_text_field_get_caret_offset (AtkText *text)
 
static gboolean fl_accessible_text_field_set_caret_offset (AtkText *text, gint offset)
 
static gint fl_accessible_text_field_get_n_selections (AtkText *text)
 
static gchar * fl_accessible_text_field_get_selection (AtkText *text, gint selection_num, gint *start_offset, gint *end_offset)
 
static gboolean fl_accessible_text_field_add_selection (AtkText *text, gint start_offset, gint end_offset)
 
static gboolean fl_accessible_text_field_remove_selection (AtkText *text, gint selection_num)
 
static gboolean fl_accessible_text_field_set_selection (AtkText *text, gint selection_num, gint start_offset, gint end_offset)
 
static void fl_accessible_text_field_set_text_contents (AtkEditableText *editable_text, const gchar *string)
 
static void fl_accessible_text_field_insert_text (AtkEditableText *editable_text, const gchar *string, gint length, gint *position)
 
static void fl_accessible_node_delete_text (AtkEditableText *editable_text, gint start_pos, gint end_pos)
 
static void fl_accessible_text_field_copy_text (AtkEditableText *editable_text, gint start_pos, gint end_pos)
 
static void fl_accessible_text_field_cut_text (AtkEditableText *editable_text, gint start_pos, gint end_pos)
 
static void fl_accessible_text_field_paste_text (AtkEditableText *editable_text, gint position)
 
static void fl_accessible_text_field_class_init (FlAccessibleTextFieldClass *klass)
 
static void fl_accessible_text_field_init (FlAccessibleTextField *self)
 
FlAccessibleNode * fl_accessible_text_field_new (FlEngine *engine, FlutterViewId view_id, int32_t id)
 

Variables

glong start = CLAMP(start, 0, length)
 
glong glong end
 
glong length = g_utf8_strlen(value, -1)
 

Typedef Documentation

◆ FlTextBoundaryCallback

typedef bool(* FlTextBoundaryCallback) (const PangoLogAttr *attr)

Definition at line 16 of file fl_accessible_text_field.cc.

Function Documentation

◆ create_pango_layout()

static PangoLayout * create_pango_layout ( FlAccessibleTextField *  self)
static

Definition at line 62 of file fl_accessible_text_field.cc.

62 {
63 g_autoptr(PangoContext) context = get_pango_context(self);
64 PangoLayout* layout = pango_layout_new(context);
65 pango_layout_set_text(layout, gtk_entry_buffer_get_text(self->buffer), -1);
66 return layout;
67}
g_autoptr(FlEngine) engine
static PangoContext * get_pango_context(FlAccessibleTextField *self)
std::shared_ptr< ContextGLES > context

References context, g_autoptr(), get_pango_context(), and self.

Referenced by get_line_at_offset(), get_paragraph_at_offset(), and get_string_at_offset().

◆ fl_accessible_editable_text_iface_init()

static void fl_accessible_editable_text_iface_init ( AtkEditableTextIface *  iface)
static

Definition at line 605 of file fl_accessible_text_field.cc.

606 {
607 iface->set_text_contents = fl_accessible_text_field_set_text_contents;
608 iface->insert_text = fl_accessible_text_field_insert_text;
609 iface->delete_text = fl_accessible_node_delete_text;
610
611 iface->copy_text = fl_accessible_text_field_copy_text;
612 iface->cut_text = fl_accessible_text_field_cut_text;
613 iface->paste_text = fl_accessible_text_field_paste_text;
614}
static void fl_accessible_text_field_insert_text(AtkEditableText *editable_text, const gchar *string, gint length, gint *position)
static void fl_accessible_text_field_paste_text(AtkEditableText *editable_text, gint position)
static void fl_accessible_text_field_set_text_contents(AtkEditableText *editable_text, const gchar *string)
static void fl_accessible_text_field_copy_text(AtkEditableText *editable_text, gint start_pos, gint end_pos)
static void fl_accessible_node_delete_text(AtkEditableText *editable_text, gint start_pos, gint end_pos)
static void fl_accessible_text_field_cut_text(AtkEditableText *editable_text, gint start_pos, gint end_pos)

References fl_accessible_node_delete_text(), fl_accessible_text_field_copy_text(), fl_accessible_text_field_cut_text(), fl_accessible_text_field_insert_text(), fl_accessible_text_field_paste_text(), and fl_accessible_text_field_set_text_contents().

◆ fl_accessible_node_delete_text()

static void fl_accessible_node_delete_text ( AtkEditableText *  editable_text,
gint  start_pos,
gint  end_pos 
)
static

Definition at line 526 of file fl_accessible_text_field.cc.

528 {
529 g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
530 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
531
532 gtk_entry_buffer_delete_text(self->buffer, start_pos, end_pos - start_pos);
533
534 perform_set_text_action(self, gtk_entry_buffer_get_text(self->buffer));
535 perform_set_selection_action(self, start_pos, start_pos);
536}
static void perform_set_selection_action(FlAccessibleTextField *self, gint base, gint extent)
static void perform_set_text_action(FlAccessibleTextField *self, const char *text)

References perform_set_selection_action(), perform_set_text_action(), and self.

Referenced by fl_accessible_editable_text_iface_init().

◆ fl_accessible_text_field_add_selection()

static gboolean fl_accessible_text_field_add_selection ( AtkText *  text,
gint  start_offset,
gint  end_offset 
)
static

Definition at line 455 of file fl_accessible_text_field.cc.

457 {
458 g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), false);
459 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
460
461 if (self->selection_base != self->selection_extent) {
462 return FALSE;
463 }
464
465 perform_set_selection_action(self, start_offset, end_offset);
466 return TRUE;
467}
return TRUE
std::u16string text

References perform_set_selection_action(), self, text, and TRUE.

Referenced by fl_accessible_text_iface_init().

◆ fl_accessible_text_field_class_init()

static void fl_accessible_text_field_class_init ( FlAccessibleTextFieldClass *  klass)
static

Definition at line 576 of file fl_accessible_text_field.cc.

577 {
578 G_OBJECT_CLASS(klass)->dispose = fl_accessible_text_field_dispose;
579 FL_ACCESSIBLE_NODE_CLASS(klass)->set_value =
581 FL_ACCESSIBLE_NODE_CLASS(klass)->set_text_selection =
583 FL_ACCESSIBLE_NODE_CLASS(klass)->set_text_direction =
585 FL_ACCESSIBLE_NODE_CLASS(klass)->perform_action =
587}
static void fl_accessible_text_field_dispose(GObject *object)
static void fl_accessible_text_field_set_text_direction(FlAccessibleNode *node, FlutterTextDirection direction)
static void fl_accessible_text_field_set_text_selection(FlAccessibleNode *node, gint base, gint extent)
static void fl_accessible_text_field_set_value(FlAccessibleNode *node, const gchar *value)
void fl_accessible_text_field_perform_action(FlAccessibleNode *self, FlutterSemanticsAction action, GBytes *data)

References fl_accessible_text_field_dispose(), fl_accessible_text_field_perform_action(), fl_accessible_text_field_set_text_direction(), fl_accessible_text_field_set_text_selection(), and fl_accessible_text_field_set_value().

◆ fl_accessible_text_field_copy_text()

static void fl_accessible_text_field_copy_text ( AtkEditableText *  editable_text,
gint  start_pos,
gint  end_pos 
)
static

Definition at line 539 of file fl_accessible_text_field.cc.

541 {
542 g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
543 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
544
545 perform_set_selection_action(self, start_pos, end_pos);
546
547 fl_accessible_node_perform_action(FL_ACCESSIBLE_NODE(editable_text),
549}
@ kFlutterSemanticsActionCopy
Copy the current selection to the clipboard.
Definition embedder.h:155
void fl_accessible_node_perform_action(FlAccessibleNode *self, FlutterSemanticsAction action, GBytes *data)

References fl_accessible_node_perform_action(), kFlutterSemanticsActionCopy, perform_set_selection_action(), and self.

Referenced by fl_accessible_editable_text_iface_init().

◆ fl_accessible_text_field_cut_text()

static void fl_accessible_text_field_cut_text ( AtkEditableText *  editable_text,
gint  start_pos,
gint  end_pos 
)
static

Definition at line 552 of file fl_accessible_text_field.cc.

554 {
555 g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
556 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
557
558 perform_set_selection_action(self, start_pos, end_pos);
559
560 fl_accessible_node_perform_action(FL_ACCESSIBLE_NODE(editable_text),
562}
@ kFlutterSemanticsActionCut
Cut the current selection and place it in the clipboard.
Definition embedder.h:157

References fl_accessible_node_perform_action(), kFlutterSemanticsActionCut, perform_set_selection_action(), and self.

Referenced by fl_accessible_editable_text_iface_init().

◆ fl_accessible_text_field_dispose()

static void fl_accessible_text_field_dispose ( GObject *  object)
static

Definition at line 239 of file fl_accessible_text_field.cc.

239 {
240 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(object);
241
242 g_clear_object(&self->buffer);
243
244 G_OBJECT_CLASS(fl_accessible_text_field_parent_class)->dispose(object);
245}

References self.

Referenced by fl_accessible_text_field_class_init().

◆ fl_accessible_text_field_get_caret_offset()

static gint fl_accessible_text_field_get_caret_offset ( AtkText *  text)
static

Definition at line 400 of file fl_accessible_text_field.cc.

400 {
401 g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), -1);
402 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
403
404 return self->selection_extent;
405}

References self, and text.

Referenced by fl_accessible_text_iface_init().

◆ fl_accessible_text_field_get_character_count()

static gint fl_accessible_text_field_get_character_count ( AtkText *  text)
static

Definition at line 323 of file fl_accessible_text_field.cc.

323 {
324 g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), 0);
325 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
326
327 return gtk_entry_buffer_get_length(self->buffer);
328}

References self, and text.

Referenced by fl_accessible_text_iface_init().

◆ fl_accessible_text_field_get_n_selections()

static gint fl_accessible_text_field_get_n_selections ( AtkText *  text)
static

Definition at line 418 of file fl_accessible_text_field.cc.

418 {
419 g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), 0);
420 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
421
422 if (self->selection_base == self->selection_extent) {
423 return 0;
424 }
425
426 return 1;
427}

References self, and text.

Referenced by fl_accessible_text_iface_init().

◆ fl_accessible_text_field_get_selection()

static gchar * fl_accessible_text_field_get_selection ( AtkText *  text,
gint  selection_num,
gint *  start_offset,
gint *  end_offset 
)
static

Definition at line 430 of file fl_accessible_text_field.cc.

433 {
434 g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), nullptr);
435 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
436
437 if (selection_num != 0 || self->selection_base == self->selection_extent) {
438 return nullptr;
439 }
440
441 gint start = MIN(self->selection_base, self->selection_extent);
442 gint end = MAX(self->selection_base, self->selection_extent);
443
444 if (start_offset != nullptr) {
445 *start_offset = start;
446 }
447 if (end_offset != nullptr) {
448 *end_offset = end;
449 }
450
451 return get_substring(self, start, end);
452}
glong glong end

References end, self, start, and text.

Referenced by fl_accessible_text_iface_init().

◆ fl_accessible_text_field_get_string_at_offset()

static gchar * fl_accessible_text_field_get_string_at_offset ( AtkText *  text,
gint  offset,
AtkTextGranularity  granularity,
gint *  start_offset,
gint *  end_offset 
)
static

Definition at line 341 of file fl_accessible_text_field.cc.

346 {
347 g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), nullptr);
348 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
349
350 switch (granularity) {
351 case ATK_TEXT_GRANULARITY_CHAR:
352 return get_char_at_offset(self, offset, start_offset, end_offset);
353 case ATK_TEXT_GRANULARITY_WORD:
354 return get_word_at_offset(self, offset, start_offset, end_offset);
355 case ATK_TEXT_GRANULARITY_SENTENCE:
356 return get_sentence_at_offset(self, offset, start_offset, end_offset);
357 case ATK_TEXT_GRANULARITY_LINE:
358 return get_line_at_offset(self, offset, start_offset, end_offset);
359 case ATK_TEXT_GRANULARITY_PARAGRAPH:
360 return get_paragraph_at_offset(self, offset, start_offset, end_offset);
361 default:
362 return nullptr;
363 }
364}
static gchar * get_line_at_offset(FlAccessibleTextField *self, gint offset, gint *start_offset, gint *end_offset)
static gchar * get_word_at_offset(FlAccessibleTextField *self, gint offset, gint *start_offset, gint *end_offset)
static gchar * get_sentence_at_offset(FlAccessibleTextField *self, gint offset, gint *start_offset, gint *end_offset)
static gchar * get_char_at_offset(FlAccessibleTextField *self, gint offset, gint *start_offset, gint *end_offset)
static gchar * get_paragraph_at_offset(FlAccessibleTextField *self, gint offset, gint *start_offset, gint *end_offset)

References get_char_at_offset(), get_line_at_offset(), get_paragraph_at_offset(), get_sentence_at_offset(), get_word_at_offset(), self, and text.

Referenced by fl_accessible_text_field_get_text_at_offset(), and fl_accessible_text_iface_init().

◆ fl_accessible_text_field_get_text()

static gchar * fl_accessible_text_field_get_text ( AtkText *  text,
gint  start_offset,
gint  end_offset 
)
static

Definition at line 331 of file fl_accessible_text_field.cc.

333 {
334 g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), nullptr);
335 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
336
337 return get_substring(self, start_offset, end_offset);
338}

References self, and text.

Referenced by fl_accessible_text_iface_init().

◆ fl_accessible_text_field_get_text_at_offset()

static gchar * fl_accessible_text_field_get_text_at_offset ( AtkText *  text,
gint  offset,
AtkTextBoundary  boundary_type,
gint *  start_offset,
gint *  end_offset 
)
static

Definition at line 367 of file fl_accessible_text_field.cc.

372 {
373 switch (boundary_type) {
374 case ATK_TEXT_BOUNDARY_CHAR:
376 text, offset, ATK_TEXT_GRANULARITY_CHAR, start_offset, end_offset);
377 break;
378 case ATK_TEXT_BOUNDARY_WORD_START:
379 case ATK_TEXT_BOUNDARY_WORD_END:
381 text, offset, ATK_TEXT_GRANULARITY_WORD, start_offset, end_offset);
382 break;
383 case ATK_TEXT_BOUNDARY_SENTENCE_START:
384 case ATK_TEXT_BOUNDARY_SENTENCE_END:
386 text, offset, ATK_TEXT_GRANULARITY_SENTENCE, start_offset,
387 end_offset);
388 break;
389 case ATK_TEXT_BOUNDARY_LINE_START:
390 case ATK_TEXT_BOUNDARY_LINE_END:
392 text, offset, ATK_TEXT_GRANULARITY_LINE, start_offset, end_offset);
393 break;
394 default:
395 return nullptr;
396 }
397}
static gchar * fl_accessible_text_field_get_string_at_offset(AtkText *text, gint offset, AtkTextGranularity granularity, gint *start_offset, gint *end_offset)

References fl_accessible_text_field_get_string_at_offset(), and text.

Referenced by fl_accessible_text_iface_init().

◆ fl_accessible_text_field_init()

static void fl_accessible_text_field_init ( FlAccessibleTextField *  self)
static

Definition at line 616 of file fl_accessible_text_field.cc.

616 {
617 self->selection_base = -1;
618 self->selection_extent = -1;
619
620 self->buffer = gtk_entry_buffer_new("", 0);
621
622 g_signal_connect_object(
623 self->buffer, "inserted-text",
624 G_CALLBACK(+[](FlAccessibleTextField* self, guint position, gchar* chars,
625 guint n_chars) {
626 g_signal_emit_by_name(self, "text-insert", position, n_chars, chars,
627 nullptr);
628 }),
629 self, G_CONNECT_SWAPPED);
630
631 g_signal_connect_object(self->buffer, "deleted-text",
632 G_CALLBACK(+[](FlAccessibleTextField* self,
633 guint position, guint n_chars) {
634 g_autofree gchar* chars = atk_text_get_text(
635 ATK_TEXT(self), position, position + n_chars);
636 g_signal_emit_by_name(self, "text-remove", position,
637 n_chars, chars, nullptr);
638 }),
639 self, G_CONNECT_SWAPPED);
640}

References self.

◆ fl_accessible_text_field_insert_text()

static void fl_accessible_text_field_insert_text ( AtkEditableText *  editable_text,
const gchar *  string,
gint  length,
gint *  position 
)
static

Definition at line 511 of file fl_accessible_text_field.cc.

514 {
515 g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
516 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
517
518 *position +=
519 gtk_entry_buffer_insert_text(self->buffer, *position, string, length);
520
521 perform_set_text_action(self, gtk_entry_buffer_get_text(self->buffer));
522 perform_set_selection_action(self, *position, *position);
523}

References length, perform_set_selection_action(), perform_set_text_action(), and self.

Referenced by fl_accessible_editable_text_iface_init().

◆ fl_accessible_text_field_new()

FlAccessibleNode * fl_accessible_text_field_new ( FlEngine *  engine,
FlutterViewId  view_id,
int32_t  id 
)

fl_accessible_text_field_new: @engine: the #FlEngine this node came from. @view_id: the ID of the view that contains this semantics node. @id: the semantics node ID this object represents.

Creates a new accessibility object that exposes an editable Flutter text field to ATK.

Returns: a new #FlAccessibleNode.

Definition at line 642 of file fl_accessible_text_field.cc.

644 {
645 return FL_ACCESSIBLE_NODE(g_object_new(fl_accessible_text_field_get_type(),
646 "engine", engine, "view-id", view_id,
647 "node-id", id, nullptr));
648}
FlutterEngine engine
Definition main.cc:84
G_BEGIN_DECLS FlutterViewId view_id

References engine, and view_id.

Referenced by create_node(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), TEST_F(), and TEST_F().

◆ fl_accessible_text_field_paste_text()

static void fl_accessible_text_field_paste_text ( AtkEditableText *  editable_text,
gint  position 
)
static

Definition at line 565 of file fl_accessible_text_field.cc.

566 {
567 g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
568 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
569
570 perform_set_selection_action(self, position, position);
571
572 fl_accessible_node_perform_action(FL_ACCESSIBLE_NODE(editable_text),
574}
@ kFlutterSemanticsActionPaste
Paste the current content of the clipboard.
Definition embedder.h:159

References fl_accessible_node_perform_action(), kFlutterSemanticsActionPaste, perform_set_selection_action(), and self.

Referenced by fl_accessible_editable_text_iface_init().

◆ fl_accessible_text_field_perform_action()

void fl_accessible_text_field_perform_action ( FlAccessibleNode *  self,
FlutterSemanticsAction  action,
GBytes *  data 
)

Definition at line 296 of file fl_accessible_text_field.cc.

298 {
299 FlAccessibleNodeClass* parent_class =
300 FL_ACCESSIBLE_NODE_CLASS(fl_accessible_text_field_parent_class);
301
302 switch (action) {
307 // These actions require a boolean argument that indicates whether the
308 // selection should be extended or collapsed when moving the cursor.
309 g_autoptr(FlValue) extend_selection = fl_value_new_bool(false);
310 g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
312 FL_MESSAGE_CODEC(codec), extend_selection, nullptr);
313 parent_class->perform_action(self, action, message);
314 break;
315 }
316 default:
317 parent_class->perform_action(self, action, data);
318 break;
319 }
320}
@ kFlutterSemanticsActionMoveCursorForwardByCharacter
Move the cursor forward by one character.
Definition embedder.h:149
@ kFlutterSemanticsActionMoveCursorBackwardByCharacter
Move the cursor backward by one character.
Definition embedder.h:151
@ kFlutterSemanticsActionMoveCursorForwardByWord
Move the cursor forward by one word.
Definition embedder.h:169
@ kFlutterSemanticsActionMoveCursorBackwardByWord
Move the cursor backward by one word.
Definition embedder.h:171
const char * message
G_MODULE_EXPORT GBytes * fl_message_codec_encode_message(FlMessageCodec *self, FlValue *message, GError **error)
G_MODULE_EXPORT FlStandardMessageCodec * fl_standard_message_codec_new()
G_MODULE_EXPORT FlValue * fl_value_new_bool(bool value)
Definition fl_value.cc:255
typedefG_BEGIN_DECLS struct _FlValue FlValue
Definition fl_value.h:42

References action, fl_message_codec_encode_message(), fl_standard_message_codec_new(), fl_value_new_bool(), g_autoptr(), kFlutterSemanticsActionMoveCursorBackwardByCharacter, kFlutterSemanticsActionMoveCursorBackwardByWord, kFlutterSemanticsActionMoveCursorForwardByCharacter, kFlutterSemanticsActionMoveCursorForwardByWord, message, and self.

Referenced by fl_accessible_text_field_class_init().

◆ fl_accessible_text_field_remove_selection()

static gboolean fl_accessible_text_field_remove_selection ( AtkText *  text,
gint  selection_num 
)
static

Definition at line 470 of file fl_accessible_text_field.cc.

471 {
472 g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), false);
473 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
474
475 if (selection_num != 0 || self->selection_base == self->selection_extent) {
476 return FALSE;
477 }
478
479 perform_set_selection_action(self, self->selection_extent,
480 self->selection_extent);
481 return TRUE;
482}

References perform_set_selection_action(), self, text, and TRUE.

Referenced by fl_accessible_text_iface_init().

◆ fl_accessible_text_field_set_caret_offset()

static gboolean fl_accessible_text_field_set_caret_offset ( AtkText *  text,
gint  offset 
)
static

Definition at line 408 of file fl_accessible_text_field.cc.

409 {
410 g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), false);
411 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
412
413 perform_set_selection_action(self, offset, offset);
414 return TRUE;
415}

References perform_set_selection_action(), self, text, and TRUE.

Referenced by fl_accessible_text_iface_init().

◆ fl_accessible_text_field_set_selection()

static gboolean fl_accessible_text_field_set_selection ( AtkText *  text,
gint  selection_num,
gint  start_offset,
gint  end_offset 
)
static

Definition at line 485 of file fl_accessible_text_field.cc.

488 {
489 g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), false);
490 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
491
492 if (selection_num != 0) {
493 return FALSE;
494 }
495
496 perform_set_selection_action(self, start_offset, end_offset);
497 return TRUE;
498}

References perform_set_selection_action(), self, text, and TRUE.

Referenced by fl_accessible_text_iface_init().

◆ fl_accessible_text_field_set_text_contents()

static void fl_accessible_text_field_set_text_contents ( AtkEditableText *  editable_text,
const gchar *  string 
)
static

Definition at line 501 of file fl_accessible_text_field.cc.

503 {
504 g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
505 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
506
508}

References perform_set_text_action(), and self.

Referenced by fl_accessible_editable_text_iface_init().

◆ fl_accessible_text_field_set_text_direction()

static void fl_accessible_text_field_set_text_direction ( FlAccessibleNode *  node,
FlutterTextDirection  direction 
)
static

Definition at line 286 of file fl_accessible_text_field.cc.

288 {
289 g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(node));
290 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(node);
291
292 self->text_direction = direction;
293}

References self.

Referenced by fl_accessible_text_field_class_init().

◆ fl_accessible_text_field_set_text_selection()

static void fl_accessible_text_field_set_text_selection ( FlAccessibleNode *  node,
gint  base,
gint  extent 
)
static

Definition at line 261 of file fl_accessible_text_field.cc.

263 {
264 g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(node));
265 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(node);
266
267 gboolean caret_moved = extent != self->selection_extent;
268 gboolean has_selection = base != extent;
269 gboolean had_selection = self->selection_base != self->selection_extent;
270 gboolean selection_changed = (has_selection || had_selection) &&
271 (caret_moved || base != self->selection_base);
272
273 self->selection_base = base;
274 self->selection_extent = extent;
275
276 if (selection_changed) {
277 g_signal_emit_by_name(self, "text-selection-changed", nullptr);
278 }
279
280 if (caret_moved) {
281 g_signal_emit_by_name(self, "text-caret-moved", extent, nullptr);
282 }
283}

References self.

Referenced by fl_accessible_text_field_class_init().

◆ fl_accessible_text_field_set_value()

static void fl_accessible_text_field_set_value ( FlAccessibleNode *  node,
const gchar *  value 
)
static

Definition at line 248 of file fl_accessible_text_field.cc.

249 {
250 g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(node));
251 FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(node);
252
253 if (g_strcmp0(gtk_entry_buffer_get_text(self->buffer), value) == 0) {
254 return;
255 }
256
257 gtk_entry_buffer_set_text(self->buffer, value, -1);
258}

References self, and value.

Referenced by fl_accessible_text_field_class_init().

◆ fl_accessible_text_iface_init()

static void fl_accessible_text_iface_init ( AtkTextIface *  iface)
static

Definition at line 589 of file fl_accessible_text_field.cc.

589 {
590 iface->get_character_count = fl_accessible_text_field_get_character_count;
591 iface->get_text = fl_accessible_text_field_get_text;
592 iface->get_text_at_offset = fl_accessible_text_field_get_text_at_offset;
593 iface->get_string_at_offset = fl_accessible_text_field_get_string_at_offset;
594
595 iface->get_caret_offset = fl_accessible_text_field_get_caret_offset;
596 iface->set_caret_offset = fl_accessible_text_field_set_caret_offset;
597
598 iface->get_n_selections = fl_accessible_text_field_get_n_selections;
599 iface->get_selection = fl_accessible_text_field_get_selection;
600 iface->add_selection = fl_accessible_text_field_add_selection;
601 iface->remove_selection = fl_accessible_text_field_remove_selection;
602 iface->set_selection = fl_accessible_text_field_set_selection;
603}
static gint fl_accessible_text_field_get_n_selections(AtkText *text)
static gchar * fl_accessible_text_field_get_text(AtkText *text, gint start_offset, gint end_offset)
static gchar * fl_accessible_text_field_get_selection(AtkText *text, gint selection_num, gint *start_offset, gint *end_offset)
static gboolean fl_accessible_text_field_set_selection(AtkText *text, gint selection_num, gint start_offset, gint end_offset)
static gboolean fl_accessible_text_field_remove_selection(AtkText *text, gint selection_num)
static gchar * fl_accessible_text_field_get_text_at_offset(AtkText *text, gint offset, AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset)
static gboolean fl_accessible_text_field_set_caret_offset(AtkText *text, gint offset)
static gboolean fl_accessible_text_field_add_selection(AtkText *text, gint start_offset, gint end_offset)
static gint fl_accessible_text_field_get_character_count(AtkText *text)
static gint fl_accessible_text_field_get_caret_offset(AtkText *text)

References fl_accessible_text_field_add_selection(), fl_accessible_text_field_get_caret_offset(), fl_accessible_text_field_get_character_count(), fl_accessible_text_field_get_n_selections(), fl_accessible_text_field_get_selection(), fl_accessible_text_field_get_string_at_offset(), fl_accessible_text_field_get_text(), fl_accessible_text_field_get_text_at_offset(), fl_accessible_text_field_remove_selection(), fl_accessible_text_field_set_caret_offset(), and fl_accessible_text_field_set_selection().

◆ G_DEFINE_TYPE_WITH_CODE()

G_DEFINE_TYPE_WITH_CODE ( FlAccessibleTextField  ,
fl_accessible_text_field  ,
fl_accessible_node_get_type()  ,
G_IMPLEMENT_INTERFACE(ATK_TYPE_EDITABLE_TEXT, fl_accessible_editable_text_iface_init  
)

◆ g_utf8_substring()

return g_utf8_substring ( value  ,
start  ,
end   
)

◆ get_char_at_offset()

static gchar * get_char_at_offset ( FlAccessibleTextField *  self,
gint  offset,
gint *  start_offset,
gint *  end_offset 
)
static

Definition at line 103 of file fl_accessible_text_field.cc.

106 {
108 self, offset, offset + 1,
109 [](const PangoLogAttr* attr) -> bool { return attr->is_char_break; },
110 [](const PangoLogAttr* attr) -> bool { return attr->is_char_break; },
111 start_offset, end_offset);
112}
static gchar * get_string_at_offset(FlAccessibleTextField *self, gint start, gint end, FlTextBoundaryCallback is_start, FlTextBoundaryCallback is_end, gint *start_offset, gint *end_offset)

References get_string_at_offset(), and self.

Referenced by fl_accessible_text_field_get_string_at_offset().

◆ get_line_at_offset()

static gchar * get_line_at_offset ( FlAccessibleTextField *  self,
gint  offset,
gint *  start_offset,
gint *  end_offset 
)
static

Definition at line 139 of file fl_accessible_text_field.cc.

142 {
143 g_autoptr(PangoLayout) layout = create_pango_layout(self);
144 const gchar* text = gtk_entry_buffer_get_text(self->buffer);
145
146 for (GSList* node = pango_layout_get_lines_readonly(layout); node != nullptr;
147 node = node->next) {
148 PangoLayoutLine* line = static_cast<PangoLayoutLine*>(node->data);
149 // PangoLayoutLine uses byte indices, but ATK offsets are character
150 // offsets, so convert before comparing.
151 gint line_start = g_utf8_pointer_to_offset(text, text + line->start_index);
152 gint line_end =
153 g_utf8_pointer_to_offset(text, text + line->start_index + line->length);
154 if (offset >= line_start && offset <= line_end) {
155 if (start_offset != nullptr) {
156 *start_offset = line_start;
157 }
158 if (end_offset != nullptr) {
159 *end_offset = line_end;
160 }
161 return get_substring(self, line_start, line_end);
162 }
163 }
164
165 return nullptr;
166}
static PangoLayout * create_pango_layout(FlAccessibleTextField *self)

References create_pango_layout(), g_autoptr(), self, and text.

Referenced by fl_accessible_text_field_get_string_at_offset().

◆ get_pango_context()

static PangoContext * get_pango_context ( FlAccessibleTextField *  self)
static

Definition at line 52 of file fl_accessible_text_field.cc.

52 {
53 PangoFontMap* font_map = pango_cairo_font_map_get_default();
54 PangoContext* context = pango_font_map_create_context(font_map);
55 pango_context_set_base_dir(context,
56 self->text_direction == kFlutterTextDirectionRTL
57 ? PANGO_DIRECTION_RTL
58 : PANGO_DIRECTION_LTR);
59 return context;
60}
@ kFlutterTextDirectionRTL
Text is read from right to left.
Definition embedder.h:370

References context, kFlutterTextDirectionRTL, and self.

Referenced by create_pango_layout().

◆ get_paragraph_at_offset()

static gchar * get_paragraph_at_offset ( FlAccessibleTextField *  self,
gint  offset,
gint *  start_offset,
gint *  end_offset 
)
static

Definition at line 172 of file fl_accessible_text_field.cc.

175 {
176 g_autoptr(PangoLayout) layout = create_pango_layout(self);
177 const gchar* text = gtk_entry_buffer_get_text(self->buffer);
178
179 PangoLayoutLine* start = nullptr;
180 PangoLayoutLine* end = nullptr;
181 gint n_lines = pango_layout_get_line_count(layout);
182 for (gint i = 0; i < n_lines; ++i) {
183 PangoLayoutLine* line = pango_layout_get_line(layout, i);
184 if (line->is_paragraph_start) {
185 end = line;
186 }
187 if (start != nullptr && end != nullptr) {
188 // PangoLayoutLine uses byte indices, but ATK offsets are character
189 // offsets, so convert before comparing.
190 gint para_start =
191 g_utf8_pointer_to_offset(text, text + start->start_index);
192 gint para_end =
193 g_utf8_pointer_to_offset(text, text + end->start_index + end->length);
194 if (offset >= para_start && offset <= para_end) {
195 if (start_offset != nullptr) {
196 *start_offset = para_start;
197 }
198 if (end_offset != nullptr) {
199 *end_offset = para_end;
200 }
201 return get_substring(self, para_start, para_end);
202 }
203 }
204 if (line->is_paragraph_start) {
205 start = line;
206 }
207 }
208
209 return nullptr;
210}

References create_pango_layout(), end, g_autoptr(), i, self, start, and text.

Referenced by fl_accessible_text_field_get_string_at_offset().

◆ get_sentence_at_offset()

static gchar * get_sentence_at_offset ( FlAccessibleTextField *  self,
gint  offset,
gint *  start_offset,
gint *  end_offset 
)
static

Definition at line 125 of file fl_accessible_text_field.cc.

128 {
130 self, offset, offset,
131 [](const PangoLogAttr* attr) -> bool { return attr->is_sentence_start; },
132 [](const PangoLogAttr* attr) -> bool { return attr->is_sentence_end; },
133 start_offset, end_offset);
134}

References get_string_at_offset(), and self.

Referenced by fl_accessible_text_field_get_string_at_offset().

◆ get_string_at_offset()

static gchar * get_string_at_offset ( FlAccessibleTextField *  self,
gint  start,
gint  end,
FlTextBoundaryCallback  is_start,
FlTextBoundaryCallback  is_end,
gint *  start_offset,
gint *  end_offset 
)
static

Definition at line 69 of file fl_accessible_text_field.cc.

75 {
76 g_autoptr(PangoLayout) layout = create_pango_layout(self);
77
78 gint n_attrs = 0;
79 const PangoLogAttr* attrs =
80 pango_layout_get_log_attrs_readonly(layout, &n_attrs);
81
82 start = CLAMP(start, 0, MAX(n_attrs - 1, 0));
83 end = CLAMP(end, 0, MAX(n_attrs - 1, 0));
84
85 while (start > 0 && !is_start(&attrs[start])) {
86 --start;
87 }
88
89 while (end < n_attrs && !is_end(&attrs[end])) {
90 ++end;
91 }
92
93 if (start_offset != nullptr) {
94 *start_offset = start;
95 }
96 if (end_offset != nullptr) {
97 *end_offset = end;
98 }
99
100 return get_substring(self, start, end);
101}

References create_pango_layout(), end, g_autoptr(), self, and start.

Referenced by get_char_at_offset(), get_sentence_at_offset(), and get_word_at_offset().

◆ get_word_at_offset()

static gchar * get_word_at_offset ( FlAccessibleTextField *  self,
gint  offset,
gint *  start_offset,
gint *  end_offset 
)
static

Definition at line 114 of file fl_accessible_text_field.cc.

117 {
119 self, offset, offset,
120 [](const PangoLogAttr* attr) -> bool { return attr->is_word_start; },
121 [](const PangoLogAttr* attr) -> bool { return attr->is_word_end; },
122 start_offset, end_offset);
123}

References get_string_at_offset(), and self.

Referenced by fl_accessible_text_field_get_string_at_offset().

◆ if()

if ( end  = = -1)

Definition at line 43 of file fl_accessible_text_field.cc.

43 {
44 // g_utf8_substring() accepts -1 since 2.72
45 end = length;
46 }

References end, and length.

◆ perform_set_selection_action()

static void perform_set_selection_action ( FlAccessibleTextField *  self,
gint  base,
gint  extent 
)
static

Definition at line 223 of file fl_accessible_text_field.cc.

225 {
228 fl_value_set_string_take(value, "extent", fl_value_new_int(extent));
229
230 g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
231 g_autoptr(GBytes) message =
232 fl_message_codec_encode_message(FL_MESSAGE_CODEC(codec), value, nullptr);
233
235 FL_ACCESSIBLE_NODE(self), kFlutterSemanticsActionSetSelection, message);
236}
int32_t value
@ kFlutterSemanticsActionSetSelection
Set the text selection to the given range.
Definition embedder.h:153
G_MODULE_EXPORT FlValue * fl_value_new_map()
Definition fl_value.cc:366
G_MODULE_EXPORT void fl_value_set_string_take(FlValue *self, const gchar *key, FlValue *value)
Definition fl_value.cc:650
G_MODULE_EXPORT FlValue * fl_value_new_int(int64_t value)
Definition fl_value.cc:262

References fl_accessible_node_perform_action(), fl_message_codec_encode_message(), fl_standard_message_codec_new(), fl_value_new_int(), fl_value_new_map(), fl_value_set_string_take(), g_autoptr(), kFlutterSemanticsActionSetSelection, message, self, and value.

Referenced by fl_accessible_node_delete_text(), fl_accessible_text_field_add_selection(), fl_accessible_text_field_copy_text(), fl_accessible_text_field_cut_text(), fl_accessible_text_field_insert_text(), fl_accessible_text_field_paste_text(), fl_accessible_text_field_remove_selection(), fl_accessible_text_field_set_caret_offset(), and fl_accessible_text_field_set_selection().

◆ perform_set_text_action()

static void perform_set_text_action ( FlAccessibleTextField *  self,
const char *  text 
)
static

Definition at line 212 of file fl_accessible_text_field.cc.

213 {
215 g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
216 g_autoptr(GBytes) message =
217 fl_message_codec_encode_message(FL_MESSAGE_CODEC(codec), value, nullptr);
218
219 fl_accessible_node_perform_action(FL_ACCESSIBLE_NODE(self),
221}
@ kFlutterSemanticsActionSetText
Replace the current text in the text field.
Definition embedder.h:173
G_MODULE_EXPORT FlValue * fl_value_new_string(const gchar *value)
Definition fl_value.cc:276

References fl_accessible_node_perform_action(), fl_message_codec_encode_message(), fl_standard_message_codec_new(), fl_value_new_string(), g_autoptr(), kFlutterSemanticsActionSetText, message, self, text, and value.

Referenced by fl_accessible_node_delete_text(), fl_accessible_text_field_insert_text(), and fl_accessible_text_field_set_text_contents().

Variable Documentation

◆ end

end
Initial value:
{
const gchar* value = gtk_entry_buffer_get_text(self->buffer)

Definition at line 40 of file fl_accessible_text_field.cc.

Referenced by fl_accessible_text_field_get_selection(), get_paragraph_at_offset(), get_string_at_offset(), and if().

◆ length

glong length = g_utf8_strlen(value, -1)

Definition at line 42 of file fl_accessible_text_field.cc.

Referenced by fl_accessible_text_field_insert_text(), and if().

◆ start