Flutter Linux Embedder
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)

References g_autoptr(), and get_pango_context().

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 588 of file fl_accessible_text_field.cc.

589  {
590  iface->set_text_contents = fl_accessible_text_field_set_text_contents;
591  iface->insert_text = fl_accessible_text_field_insert_text;
592  iface->delete_text = fl_accessible_node_delete_text;
593 
594  iface->copy_text = fl_accessible_text_field_copy_text;
595  iface->cut_text = fl_accessible_text_field_cut_text;
596  iface->paste_text = fl_accessible_text_field_paste_text;
597 }
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 509 of file fl_accessible_text_field.cc.

511  {
512  g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
513  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
514 
515  gtk_entry_buffer_delete_text(self->buffer, start_pos, end_pos - start_pos);
516 
517  perform_set_text_action(self, gtk_entry_buffer_get_text(self->buffer));
518  perform_set_selection_action(self, start_pos, start_pos);
519 }
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(), and perform_set_text_action().

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 438 of file fl_accessible_text_field.cc.

440  {
441  g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), false);
442  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
443 
444  if (self->selection_base != self->selection_extent) {
445  return FALSE;
446  }
447 
448  perform_set_selection_action(self, start_offset, end_offset);
449  return TRUE;
450 }
return TRUE

References perform_set_selection_action(), 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 559 of file fl_accessible_text_field.cc.

560  {
561  G_OBJECT_CLASS(klass)->dispose = fl_accessible_text_field_dispose;
562  FL_ACCESSIBLE_NODE_CLASS(klass)->set_value =
564  FL_ACCESSIBLE_NODE_CLASS(klass)->set_text_selection =
566  FL_ACCESSIBLE_NODE_CLASS(klass)->set_text_direction =
568  FL_ACCESSIBLE_NODE_CLASS(klass)->perform_action =
570 }
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 522 of file fl_accessible_text_field.cc.

524  {
525  g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
526  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
527 
528  perform_set_selection_action(self, start_pos, end_pos);
529 
530  fl_accessible_node_perform_action(FL_ACCESSIBLE_NODE(editable_text),
531  kFlutterSemanticsActionCopy, nullptr);
532 }
void fl_accessible_node_perform_action(FlAccessibleNode *self, FlutterSemanticsAction action, GBytes *data)

References fl_accessible_node_perform_action(), and perform_set_selection_action().

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 535 of file fl_accessible_text_field.cc.

537  {
538  g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
539  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
540 
541  perform_set_selection_action(self, start_pos, end_pos);
542 
543  fl_accessible_node_perform_action(FL_ACCESSIBLE_NODE(editable_text),
544  kFlutterSemanticsActionCut, nullptr);
545 }

References fl_accessible_node_perform_action(), and perform_set_selection_action().

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 222 of file fl_accessible_text_field.cc.

222  {
223  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(object);
224 
225  g_clear_object(&self->buffer);
226 
227  G_OBJECT_CLASS(fl_accessible_text_field_parent_class)->dispose(object);
228 }

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 383 of file fl_accessible_text_field.cc.

383  {
384  g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), -1);
385  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
386 
387  return self->selection_extent;
388 }

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 306 of file fl_accessible_text_field.cc.

306  {
307  g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), 0);
308  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
309 
310  return gtk_entry_buffer_get_length(self->buffer);
311 }

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 401 of file fl_accessible_text_field.cc.

401  {
402  g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), 0);
403  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
404 
405  if (self->selection_base == self->selection_extent) {
406  return 0;
407  }
408 
409  return 1;
410 }

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 413 of file fl_accessible_text_field.cc.

416  {
417  g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), nullptr);
418  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
419 
420  if (selection_num != 0 || self->selection_base == self->selection_extent) {
421  return nullptr;
422  }
423 
424  gint start = MIN(self->selection_base, self->selection_extent);
425  gint end = MAX(self->selection_base, self->selection_extent);
426 
427  if (start_offset != nullptr) {
428  *start_offset = start;
429  }
430  if (end_offset != nullptr) {
431  *end_offset = end;
432  }
433 
434  return get_substring(self, start, end);
435 }
glong glong end

References end, and start.

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 324 of file fl_accessible_text_field.cc.

329  {
330  g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), nullptr);
331  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
332 
333  switch (granularity) {
334  case ATK_TEXT_GRANULARITY_CHAR:
335  return get_char_at_offset(self, offset, start_offset, end_offset);
336  case ATK_TEXT_GRANULARITY_WORD:
337  return get_word_at_offset(self, offset, start_offset, end_offset);
338  case ATK_TEXT_GRANULARITY_SENTENCE:
339  return get_sentence_at_offset(self, offset, start_offset, end_offset);
340  case ATK_TEXT_GRANULARITY_LINE:
341  return get_line_at_offset(self, offset, start_offset, end_offset);
342  case ATK_TEXT_GRANULARITY_PARAGRAPH:
343  return get_paragraph_at_offset(self, offset, start_offset, end_offset);
344  default:
345  return nullptr;
346  }
347 }
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_word_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 gchar * get_line_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(), and get_word_at_offset().

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 314 of file fl_accessible_text_field.cc.

316  {
317  g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), nullptr);
318  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
319 
320  return get_substring(self, start_offset, end_offset);
321 }

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 350 of file fl_accessible_text_field.cc.

355  {
356  switch (boundary_type) {
357  case ATK_TEXT_BOUNDARY_CHAR:
359  text, offset, ATK_TEXT_GRANULARITY_CHAR, start_offset, end_offset);
360  break;
361  case ATK_TEXT_BOUNDARY_WORD_START:
362  case ATK_TEXT_BOUNDARY_WORD_END:
364  text, offset, ATK_TEXT_GRANULARITY_WORD, start_offset, end_offset);
365  break;
366  case ATK_TEXT_BOUNDARY_SENTENCE_START:
367  case ATK_TEXT_BOUNDARY_SENTENCE_END:
369  text, offset, ATK_TEXT_GRANULARITY_SENTENCE, start_offset,
370  end_offset);
371  break;
372  case ATK_TEXT_BOUNDARY_LINE_START:
373  case ATK_TEXT_BOUNDARY_LINE_END:
375  text, offset, ATK_TEXT_GRANULARITY_LINE, start_offset, end_offset);
376  break;
377  default:
378  return nullptr;
379  }
380 }
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().

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 599 of file fl_accessible_text_field.cc.

599  {
600  self->selection_base = -1;
601  self->selection_extent = -1;
602 
603  self->buffer = gtk_entry_buffer_new("", 0);
604 
605  g_signal_connect_object(
606  self->buffer, "inserted-text",
607  G_CALLBACK(+[](FlAccessibleTextField* self, guint position, gchar* chars,
608  guint n_chars) {
609  g_signal_emit_by_name(self, "text-insert", position, n_chars, chars,
610  nullptr);
611  }),
612  self, G_CONNECT_SWAPPED);
613 
614  g_signal_connect_object(self->buffer, "deleted-text",
615  G_CALLBACK(+[](FlAccessibleTextField* self,
616  guint position, guint n_chars) {
617  g_autofree gchar* chars = atk_text_get_text(
618  ATK_TEXT(self), position, position + n_chars);
619  g_signal_emit_by_name(self, "text-remove", position,
620  n_chars, chars, nullptr);
621  }),
622  self, G_CONNECT_SWAPPED);
623 }

◆ 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 494 of file fl_accessible_text_field.cc.

497  {
498  g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
499  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
500 
501  *position +=
502  gtk_entry_buffer_insert_text(self->buffer, *position, string, length);
503 
504  perform_set_text_action(self, gtk_entry_buffer_get_text(self->buffer));
505  perform_set_selection_action(self, *position, *position);
506 }
glong length

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

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 625 of file fl_accessible_text_field.cc.

627  {
628  return FL_ACCESSIBLE_NODE(g_object_new(fl_accessible_text_field_get_type(),
629  "engine", engine, "view-id", view_id,
630  "node-id", id, nullptr));
631 }
G_BEGIN_DECLS FlutterViewId view_id

References view_id.

Referenced by create_node(), and TEST().

◆ fl_accessible_text_field_paste_text()

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

Definition at line 548 of file fl_accessible_text_field.cc.

549  {
550  g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
551  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
552 
553  perform_set_selection_action(self, position, position);
554 
555  fl_accessible_node_perform_action(FL_ACCESSIBLE_NODE(editable_text),
556  kFlutterSemanticsActionPaste, nullptr);
557 }

References fl_accessible_node_perform_action(), and perform_set_selection_action().

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 279 of file fl_accessible_text_field.cc.

281  {
282  FlAccessibleNodeClass* parent_class =
283  FL_ACCESSIBLE_NODE_CLASS(fl_accessible_text_field_parent_class);
284 
285  switch (action) {
286  case kFlutterSemanticsActionMoveCursorForwardByCharacter:
287  case kFlutterSemanticsActionMoveCursorBackwardByCharacter:
288  case kFlutterSemanticsActionMoveCursorForwardByWord:
289  case kFlutterSemanticsActionMoveCursorBackwardByWord: {
290  // These actions require a boolean argument that indicates whether the
291  // selection should be extended or collapsed when moving the cursor.
292  g_autoptr(FlValue) extend_selection = fl_value_new_bool(false);
293  g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
295  FL_MESSAGE_CODEC(codec), extend_selection, nullptr);
296  parent_class->perform_action(self, action, message);
297  break;
298  }
299  default:
300  parent_class->perform_action(self, action, data);
301  break;
302  }
303 }
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 fl_message_codec_encode_message(), fl_standard_message_codec_new(), fl_value_new_bool(), g_autoptr(), and message.

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 453 of file fl_accessible_text_field.cc.

454  {
455  g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), false);
456  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
457 
458  if (selection_num != 0 || self->selection_base == self->selection_extent) {
459  return FALSE;
460  }
461 
462  perform_set_selection_action(self, self->selection_extent,
463  self->selection_extent);
464  return TRUE;
465 }

References perform_set_selection_action(), 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 391 of file fl_accessible_text_field.cc.

392  {
393  g_return_val_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(text), false);
394  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(text);
395 
396  perform_set_selection_action(self, offset, offset);
397  return TRUE;
398 }

References perform_set_selection_action(), 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 468 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) {
476  return FALSE;
477  }
478 
479  perform_set_selection_action(self, start_offset, end_offset);
480  return TRUE;
481 }

References perform_set_selection_action(), 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 484 of file fl_accessible_text_field.cc.

486  {
487  g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(editable_text));
488  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(editable_text);
489 
490  perform_set_text_action(self, string);
491 }

References perform_set_text_action().

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 269 of file fl_accessible_text_field.cc.

271  {
272  g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(node));
273  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(node);
274 
275  self->text_direction = direction;
276 }

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 244 of file fl_accessible_text_field.cc.

246  {
247  g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(node));
248  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(node);
249 
250  gboolean caret_moved = extent != self->selection_extent;
251  gboolean has_selection = base != extent;
252  gboolean had_selection = self->selection_base != self->selection_extent;
253  gboolean selection_changed = (has_selection || had_selection) &&
254  (caret_moved || base != self->selection_base);
255 
256  self->selection_base = base;
257  self->selection_extent = extent;
258 
259  if (selection_changed) {
260  g_signal_emit_by_name(self, "text-selection-changed", nullptr);
261  }
262 
263  if (caret_moved) {
264  g_signal_emit_by_name(self, "text-caret-moved", extent, nullptr);
265  }
266 }

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 231 of file fl_accessible_text_field.cc.

232  {
233  g_return_if_fail(FL_IS_ACCESSIBLE_TEXT_FIELD(node));
234  FlAccessibleTextField* self = FL_ACCESSIBLE_TEXT_FIELD(node);
235 
236  if (g_strcmp0(gtk_entry_buffer_get_text(self->buffer), value) == 0) {
237  return;
238  }
239 
240  gtk_entry_buffer_set_text(self->buffer, value, -1);
241 }
uint8_t value

References 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 572 of file fl_accessible_text_field.cc.

572  {
573  iface->get_character_count = fl_accessible_text_field_get_character_count;
574  iface->get_text = fl_accessible_text_field_get_text;
575  iface->get_text_at_offset = fl_accessible_text_field_get_text_at_offset;
576  iface->get_string_at_offset = fl_accessible_text_field_get_string_at_offset;
577 
578  iface->get_caret_offset = fl_accessible_text_field_get_caret_offset;
579  iface->set_caret_offset = fl_accessible_text_field_set_caret_offset;
580 
581  iface->get_n_selections = fl_accessible_text_field_get_n_selections;
582  iface->get_selection = fl_accessible_text_field_get_selection;
583  iface->add_selection = fl_accessible_text_field_add_selection;
584  iface->remove_selection = fl_accessible_text_field_remove_selection;
585  iface->set_selection = fl_accessible_text_field_set_selection;
586 }
static gint fl_accessible_text_field_get_n_selections(AtkText *text)
static gboolean fl_accessible_text_field_set_selection(AtkText *text, gint selection_num, 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 gboolean fl_accessible_text_field_remove_selection(AtkText *text, gint selection_num)
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_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 gchar * fl_accessible_text_field_get_text(AtkText *text, gint start_offset, gint end_offset)
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  {
107  return get_string_at_offset(
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().

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 136 of file fl_accessible_text_field.cc.

139  {
140  g_autoptr(PangoLayout) layout = create_pango_layout(self);
141 
142  GSList* lines = pango_layout_get_lines_readonly(layout);
143  while (lines != nullptr) {
144  PangoLayoutLine* line = static_cast<PangoLayoutLine*>(lines->data);
145  if (offset >= line->start_index &&
146  offset <= line->start_index + line->length) {
147  if (start_offset != nullptr) {
148  *start_offset = line->start_index;
149  }
150  if (end_offset != nullptr) {
151  *end_offset = line->start_index + line->length;
152  }
153  return get_substring(self, line->start_index,
154  line->start_index + line->length);
155  }
156  lines = lines->next;
157  }
158 
159  return nullptr;
160 }
static PangoLayout * create_pango_layout(FlAccessibleTextField *self)

References create_pango_layout(), and g_autoptr().

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 }

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 162 of file fl_accessible_text_field.cc.

165  {
166  g_autoptr(PangoLayout) layout = create_pango_layout(self);
167 
168  PangoLayoutLine* start = nullptr;
169  PangoLayoutLine* end = nullptr;
170  gint n_lines = pango_layout_get_line_count(layout);
171  for (gint i = 0; i < n_lines; ++i) {
172  PangoLayoutLine* line = pango_layout_get_line(layout, i);
173  if (line->is_paragraph_start) {
174  end = line;
175  }
176  if (start != nullptr && end != nullptr && offset >= start->start_index &&
177  offset <= end->start_index + end->length) {
178  if (start_offset != nullptr) {
179  *start_offset = start->start_index;
180  }
181  if (end_offset != nullptr) {
182  *end_offset = end->start_index + end->length;
183  }
184  return get_substring(self, start->start_index,
185  end->start_index + end->length);
186  }
187  if (line->is_paragraph_start) {
188  start = line;
189  }
190  }
191 
192  return nullptr;
193 }

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

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  {
129  return get_string_at_offset(
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().

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(), 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  {
118  return get_string_at_offset(
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().

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 206 of file fl_accessible_text_field.cc.

208  {
211  fl_value_set_string_take(value, "extent", fl_value_new_int(extent));
212 
213  g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
214  g_autoptr(GBytes) message =
215  fl_message_codec_encode_message(FL_MESSAGE_CODEC(codec), value, nullptr);
216 
218  FL_ACCESSIBLE_NODE(self), kFlutterSemanticsActionSetSelection, message);
219 }
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
G_MODULE_EXPORT FlValue * fl_value_new_map()
Definition: fl_value.cc:366

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(), message, 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 195 of file fl_accessible_text_field.cc.

196  {
198  g_autoptr(FlStandardMessageCodec) codec = fl_standard_message_codec_new();
199  g_autoptr(GBytes) message =
200  fl_message_codec_encode_message(FL_MESSAGE_CODEC(codec), value, nullptr);
201 
202  fl_accessible_node_perform_action(FL_ACCESSIBLE_NODE(self),
203  kFlutterSemanticsActionSetText, message);
204 }
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(), message, 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

◆ length

◆ start