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

Go to the source code of this file.

Classes

struct  _FlTextInputHandler
 

Functions

static void update_editing_state_response_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
static void update_editing_state_with_deltas_response_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
static void update_editing_state (FlTextInputHandler *self)
 
static void update_editing_state_with_delta (FlTextInputHandler *self, flutter::TextEditingDelta *delta)
 
static void perform_action_response_cb (GObject *object, GAsyncResult *result, gpointer user_data)
 
static void perform_action (FlTextInputHandler *self)
 
static void im_preedit_start_cb (FlTextInputHandler *self)
 
static void im_preedit_changed_cb (FlTextInputHandler *self)
 
static void im_commit_cb (FlTextInputHandler *self, const gchar *text)
 
static void im_preedit_end_cb (FlTextInputHandler *self)
 
static gboolean im_retrieve_surrounding_cb (FlTextInputHandler *self)
 
static gboolean im_delete_surrounding_cb (FlTextInputHandler *self, gint offset, gint n_chars)
 
static void set_client (int64_t client_id, const gchar *input_action, gboolean enable_delta_model, FlTextInputType input_type, gpointer user_data)
 
static void hide (gpointer user_data)
 
static void show (gpointer user_data)
 
static void set_editing_state (const gchar *text, int64_t selection_base, int64_t selection_extent, int64_t composing_base, int64_t composing_extent, gpointer user_data)
 
static void clear_client (gpointer user_data)
 
static void update_im_cursor_position (FlTextInputHandler *self)
 
static void set_editable_size_and_transform (double *transform, gpointer user_data)
 
static void set_marked_text_rect (double x, double y, double width, double height, gpointer user_data)
 
static void fl_text_input_handler_dispose (GObject *object)
 
static void fl_text_input_handler_class_init (FlTextInputHandlerClass *klass)
 
static void fl_text_input_handler_init (FlTextInputHandler *self)
 
FlTextInputHandler * fl_text_input_handler_new (FlBinaryMessenger *messenger)
 
GtkIMContext * fl_text_input_handler_get_im_context (FlTextInputHandler *self)
 
void fl_text_input_handler_set_widget (FlTextInputHandler *self, GtkWidget *widget)
 
GtkWidget * fl_text_input_handler_get_widget (FlTextInputHandler *self)
 
gboolean fl_text_input_handler_filter_keypress (FlTextInputHandler *self, FlKeyEvent *event)
 

Variables

static constexpr char kNewlineInputAction [] = "TextInputAction.newline"
 
static constexpr int64_t kClientIdUnset = -1
 
static FlTextInputChannelVTable text_input_vtable
 

Function Documentation

◆ clear_client()

static void clear_client ( gpointer  user_data)
static

Definition at line 306 of file fl_text_input_handler.cc.

306 {
307 FlTextInputHandler* self = FL_TEXT_INPUT_HANDLER(user_data);
308 self->client_id = kClientIdUnset;
309}
static constexpr int64_t kClientIdUnset

References kClientIdUnset, self, and user_data.

◆ fl_text_input_handler_class_init()

static void fl_text_input_handler_class_init ( FlTextInputHandlerClass *  klass)
static

Definition at line 400 of file fl_text_input_handler.cc.

400 {
401 G_OBJECT_CLASS(klass)->dispose = fl_text_input_handler_dispose;
402}
static void fl_text_input_handler_dispose(GObject *object)

References fl_text_input_handler_dispose().

◆ fl_text_input_handler_dispose()

static void fl_text_input_handler_dispose ( GObject *  object)
static

Definition at line 382 of file fl_text_input_handler.cc.

382 {
383 FlTextInputHandler* self = FL_TEXT_INPUT_HANDLER(object);
384
385 g_cancellable_cancel(self->cancellable);
386
387 g_clear_object(&self->channel);
388 g_clear_pointer(&self->input_action, g_free);
389 g_clear_object(&self->im_context);
390 if (self->text_model != nullptr) {
391 delete self->text_model;
392 self->text_model = nullptr;
393 }
394 g_clear_object(&self->cancellable);
395
396 G_OBJECT_CLASS(fl_text_input_handler_parent_class)->dispose(object);
397}

References self.

Referenced by fl_text_input_handler_class_init().

◆ fl_text_input_handler_filter_keypress()

gboolean fl_text_input_handler_filter_keypress ( FlTextInputHandler *  handler,
FlKeyEvent *  event 
)

fl_text_input_handler_filter_keypress @handler: an #FlTextInputHandler. @event: a #FlKeyEvent

Process a key event.

Returns: TRUE if the event was used.

Definition at line 477 of file fl_text_input_handler.cc.

478 {
479 g_return_val_if_fail(FL_IS_TEXT_INPUT_HANDLER(self), FALSE);
480
481 if (self->client_id == kClientIdUnset) {
482 return FALSE;
483 }
484
486 self->im_context,
487 reinterpret_cast<GdkEventKey*>(fl_key_event_get_origin(event)))) {
488 return TRUE;
489 }
490
491 std::string text_before_change = self->text_model->GetText();
492 flutter::TextRange selection_before_change = self->text_model->selection();
493 std::string text = self->text_model->GetText();
494
495 // Handle the enter/return key.
496 gboolean do_action = FALSE;
497 // Handle navigation keys.
498 gboolean changed = FALSE;
499 if (fl_key_event_get_is_press(event)) {
500 switch (fl_key_event_get_keyval(event)) {
501 case GDK_KEY_End:
502 case GDK_KEY_KP_End:
503 if (fl_key_event_get_state(event) & GDK_SHIFT_MASK) {
504 changed = self->text_model->SelectToEnd();
505 } else {
506 changed = self->text_model->MoveCursorToEnd();
507 }
508 break;
509 case GDK_KEY_Return:
510 case GDK_KEY_KP_Enter:
511 case GDK_KEY_ISO_Enter:
512 if (self->input_type == FL_TEXT_INPUT_TYPE_MULTILINE &&
513 strcmp(self->input_action, kNewlineInputAction) == 0) {
514 self->text_model->AddCodePoint('\n');
515 text = "\n";
516 changed = TRUE;
517 }
518 do_action = TRUE;
519 break;
520 case GDK_KEY_Home:
521 case GDK_KEY_KP_Home:
522 if (fl_key_event_get_state(event) & GDK_SHIFT_MASK) {
523 changed = self->text_model->SelectToBeginning();
524 } else {
525 changed = self->text_model->MoveCursorToBeginning();
526 }
527 break;
528 case GDK_KEY_BackSpace:
529 case GDK_KEY_Delete:
530 case GDK_KEY_KP_Delete:
531 case GDK_KEY_Left:
532 case GDK_KEY_KP_Left:
533 case GDK_KEY_Right:
534 case GDK_KEY_KP_Right:
535 // Already handled inside the framework in RenderEditable.
536 break;
537 }
538 }
539
540 if (changed) {
541 if (self->enable_delta_model) {
543 text_before_change, selection_before_change, text);
545 } else {
547 }
548 }
549 if (do_action) {
551 }
552
553 return changed;
554}
return TRUE
gboolean fl_key_event_get_is_press(FlKeyEvent *self)
GdkEvent * fl_key_event_get_origin(FlKeyEvent *self)
GdkModifierType fl_key_event_get_state(FlKeyEvent *self)
guint fl_key_event_get_keyval(FlKeyEvent *self)
@ FL_TEXT_INPUT_TYPE_MULTILINE
static void update_editing_state(FlTextInputHandler *self)
static void update_editing_state_with_delta(FlTextInputHandler *self, flutter::TextEditingDelta *delta)
static constexpr char kNewlineInputAction[]
static void perform_action(FlTextInputHandler *self)
std::u16string text
gboolean gtk_im_context_filter_keypress(GtkIMContext *context, GdkEventKey *event)
Definition mock_gtk.cc:321
A change in the state of an input field.

References fl_key_event_get_is_press(), fl_key_event_get_keyval(), fl_key_event_get_origin(), fl_key_event_get_state(), FL_TEXT_INPUT_TYPE_MULTILINE, gtk_im_context_filter_keypress(), kClientIdUnset, kNewlineInputAction, perform_action(), self, text, TRUE, update_editing_state(), and update_editing_state_with_delta().

Referenced by handle_key_event(), and send_key_event().

◆ fl_text_input_handler_get_im_context()

GtkIMContext * fl_text_input_handler_get_im_context ( FlTextInputHandler *  handler)

fl_text_input_handler_get_im_context: @handler: an #FlTextInputHandler.

Get the IM context that is being used. Provided for testing purposes.

Returns: a #GtkIMContext.

Definition at line 459 of file fl_text_input_handler.cc.

459 {
460 g_return_val_if_fail(FL_IS_TEXT_INPUT_HANDLER(self), nullptr);
461 return self->im_context;
462}

References self.

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

◆ fl_text_input_handler_get_widget()

GtkWidget * fl_text_input_handler_get_widget ( FlTextInputHandler *  handler)

fl_text_input_handler_get_widget: @handler: an #FlTextInputHandler.

Get the widget that has input focus.

Returns: a #GtkWidget or NULL if none active.

Definition at line 472 of file fl_text_input_handler.cc.

472 {
473 g_return_val_if_fail(FL_IS_TEXT_INPUT_HANDLER(self), nullptr);
474 return self->widget;
475}

References self.

Referenced by setup_keyboard().

◆ fl_text_input_handler_init()

static void fl_text_input_handler_init ( FlTextInputHandler *  self)
static

Definition at line 405 of file fl_text_input_handler.cc.

405 {
406 self->client_id = kClientIdUnset;
407 self->input_type = FL_TEXT_INPUT_TYPE_TEXT;
408 self->text_model = new flutter::TextInputModel();
409 self->cancellable = g_cancellable_new();
410}
@ FL_TEXT_INPUT_TYPE_TEXT

References FL_TEXT_INPUT_TYPE_TEXT, kClientIdUnset, and self.

◆ fl_text_input_handler_new()

FlTextInputHandler * fl_text_input_handler_new ( FlBinaryMessenger *  messenger)

FlTextInputHandler:

#FlTextInputHandler is a handler that implements the shell side of SystemChannels.textInput from the Flutter services library. fl_text_input_handler_new: @messenger: an #FlBinaryMessenger.

Creates a new handler that implements SystemChannels.textInput from the Flutter services library.

Returns: a new #FlTextInputHandler.

Definition at line 422 of file fl_text_input_handler.cc.

422 {
423 g_return_val_if_fail(FL_IS_BINARY_MESSENGER(messenger), nullptr);
424
425 FlTextInputHandler* self = FL_TEXT_INPUT_HANDLER(
426 g_object_new(fl_text_input_handler_get_type(), nullptr));
427
428 self->channel =
430
431 self->im_context = GTK_IM_CONTEXT(gtk_im_multicontext_new());
432
433 // On Wayland, this call sets up the input method so it can be enabled
434 // immediately when required. Without it, on-screen keyboard's don't come up
435 // the first time a text field is focused.
436 gtk_im_context_focus_out(self->im_context);
437
438 g_signal_connect_object(self->im_context, "preedit-start",
439 G_CALLBACK(im_preedit_start_cb), self,
440 G_CONNECT_SWAPPED);
441 g_signal_connect_object(self->im_context, "preedit-end",
442 G_CALLBACK(im_preedit_end_cb), self,
443 G_CONNECT_SWAPPED);
444 g_signal_connect_object(self->im_context, "preedit-changed",
445 G_CALLBACK(im_preedit_changed_cb), self,
446 G_CONNECT_SWAPPED);
447 g_signal_connect_object(self->im_context, "commit", G_CALLBACK(im_commit_cb),
448 self, G_CONNECT_SWAPPED);
449 g_signal_connect_object(self->im_context, "retrieve-surrounding",
450 G_CALLBACK(im_retrieve_surrounding_cb), self,
451 G_CONNECT_SWAPPED);
452 g_signal_connect_object(self->im_context, "delete-surrounding",
453 G_CALLBACK(im_delete_surrounding_cb), self,
454 G_CONNECT_SWAPPED);
455
456 return self;
457}
FlTextInputChannel * fl_text_input_channel_new(FlBinaryMessenger *messenger, FlTextInputChannelVTable *vtable, gpointer user_data)
static gboolean im_delete_surrounding_cb(FlTextInputHandler *self, gint offset, gint n_chars)
static void im_preedit_end_cb(FlTextInputHandler *self)
static gboolean im_retrieve_surrounding_cb(FlTextInputHandler *self)
static void im_preedit_start_cb(FlTextInputHandler *self)
static FlTextInputChannelVTable text_input_vtable
static void im_commit_cb(FlTextInputHandler *self, const gchar *text)
static void im_preedit_changed_cb(FlTextInputHandler *self)
void gtk_im_context_focus_out(GtkIMContext *context)
Definition mock_gtk.cc:338

References fl_text_input_channel_new(), gtk_im_context_focus_out(), im_commit_cb(), im_delete_surrounding_cb(), im_preedit_changed_cb(), im_preedit_end_cb(), im_preedit_start_cb(), im_retrieve_surrounding_cb(), self, and text_input_vtable.

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

◆ fl_text_input_handler_set_widget()

void fl_text_input_handler_set_widget ( FlTextInputHandler *  handler,
GtkWidget *  widget 
)

fl_text_input_handler_set_widget: @handler: an #FlTextInputHandler. @widget: the widget with keyboard focus.

Set the widget that has input focus.

Definition at line 464 of file fl_text_input_handler.cc.

465 {
466 g_return_if_fail(FL_IS_TEXT_INPUT_HANDLER(self));
467 self->widget = widget;
469 gtk_widget_get_window(self->widget));
470}
void gtk_im_context_set_client_window(GtkIMContext *context, GdkWindow *window)
Definition mock_gtk.cc:303
GdkWindow * gtk_widget_get_window(GtkWidget *widget)
Definition mock_gtk.cc:298

References gtk_im_context_set_client_window(), gtk_widget_get_window(), and self.

Referenced by fl_view_focus_in_event(), and setup_keyboard().

◆ hide()

static void hide ( gpointer  user_data)
static

Definition at line 257 of file fl_text_input_handler.cc.

257 {
258 FlTextInputHandler* self = FL_TEXT_INPUT_HANDLER(user_data);
259
260 gtk_im_context_focus_out(self->im_context);
261}

References gtk_im_context_focus_out(), self, and user_data.

Referenced by show().

◆ im_commit_cb()

static void im_commit_cb ( FlTextInputHandler *  self,
const gchar *  text 
)
static

Definition at line 178 of file fl_text_input_handler.cc.

178 {
179 std::string text_before_change = self->text_model->GetText();
180 flutter::TextRange composing_before_change =
181 self->text_model->composing_range();
182 flutter::TextRange selection_before_change = self->text_model->selection();
183 gboolean was_composing = self->text_model->composing();
184
185 self->text_model->AddText(text);
186 if (self->text_model->composing()) {
187 self->text_model->CommitComposing();
188 }
189
190 if (self->enable_delta_model) {
191 flutter::TextRange replace_range =
192 was_composing ? composing_before_change : selection_before_change;
193 std::unique_ptr<flutter::TextEditingDelta> delta =
194 std::make_unique<flutter::TextEditingDelta>(text_before_change,
195 replace_range, text);
197 } else {
199 }
200}

References self, text, update_editing_state(), and update_editing_state_with_delta().

Referenced by fl_text_input_handler_new().

◆ im_delete_surrounding_cb()

static gboolean im_delete_surrounding_cb ( FlTextInputHandler *  self,
gint  offset,
gint  n_chars 
)
static

Definition at line 224 of file fl_text_input_handler.cc.

226 {
227 std::string text_before_change = self->text_model->GetText();
228 if (self->text_model->DeleteSurrounding(offset, n_chars)) {
229 if (self->enable_delta_model) {
231 text_before_change, self->text_model->composing_range(),
232 self->text_model->GetText());
234 } else {
236 }
237 }
238 return TRUE;
239}

References self, TRUE, update_editing_state(), and update_editing_state_with_delta().

Referenced by fl_text_input_handler_new().

◆ im_preedit_changed_cb()

static void im_preedit_changed_cb ( FlTextInputHandler *  self)
static

Definition at line 151 of file fl_text_input_handler.cc.

151 {
152 std::string text_before_change = self->text_model->GetText();
153 flutter::TextRange composing_before_change =
154 self->text_model->composing_range();
155 g_autofree gchar* buf = nullptr;
156 gint cursor_offset = 0;
157 gtk_im_context_get_preedit_string(self->im_context, &buf, nullptr,
158 &cursor_offset);
159 if (self->text_model->composing()) {
160 cursor_offset += self->text_model->composing_range().start();
161 } else {
162 cursor_offset += self->text_model->selection().start();
163 }
164 self->text_model->UpdateComposingText(buf);
165 self->text_model->SetSelection(flutter::TextRange(cursor_offset));
166
167 if (self->enable_delta_model) {
168 std::string text(buf);
170 text_before_change, composing_before_change, text);
172 } else {
174 }
175}
void gtk_im_context_get_preedit_string(GtkIMContext *context, gchar **str, PangoAttrList **attrs, gint *cursor_pos)
Definition mock_gtk.cc:311

References gtk_im_context_get_preedit_string(), self, text, update_editing_state(), and update_editing_state_with_delta().

Referenced by fl_text_input_handler_new().

◆ im_preedit_end_cb()

static void im_preedit_end_cb ( FlTextInputHandler *  self)
static

Definition at line 203 of file fl_text_input_handler.cc.

203 {
204 self->text_model->EndComposing();
205 if (self->enable_delta_model) {
207 flutter::TextEditingDelta(self->text_model->GetText());
209 } else {
211 }
212}

References self, update_editing_state(), and update_editing_state_with_delta().

Referenced by fl_text_input_handler_new().

◆ im_preedit_start_cb()

static void im_preedit_start_cb ( FlTextInputHandler *  self)
static

Definition at line 146 of file fl_text_input_handler.cc.

146 {
147 self->text_model->BeginComposing();
148}

References self.

Referenced by fl_text_input_handler_new().

◆ im_retrieve_surrounding_cb()

static gboolean im_retrieve_surrounding_cb ( FlTextInputHandler *  self)
static

Definition at line 215 of file fl_text_input_handler.cc.

215 {
216 auto text = self->text_model->GetText();
217 size_t cursor_offset = self->text_model->GetCursorOffset();
218 gtk_im_context_set_surrounding(self->im_context, text.c_str(), -1,
219 cursor_offset);
220 return TRUE;
221}
void gtk_im_context_set_surrounding(GtkIMContext *context, const gchar *text, gint len, gint cursor_index)
Definition mock_gtk.cc:353

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

Referenced by fl_text_input_handler_new().

◆ perform_action()

static void perform_action ( FlTextInputHandler *  self)
static

Definition at line 135 of file fl_text_input_handler.cc.

135 {
136 g_return_if_fail(FL_IS_TEXT_INPUT_HANDLER(self));
137 g_return_if_fail(self->client_id != 0);
138 g_return_if_fail(self->input_action != nullptr);
139
141 self->input_action, self->cancellable,
143}
void fl_text_input_channel_perform_action(FlTextInputChannel *self, int64_t client_id, const gchar *input_action, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
static void perform_action_response_cb(GObject *object, GAsyncResult *result, gpointer user_data)

References fl_text_input_channel_perform_action(), perform_action_response_cb(), and self.

Referenced by fl_text_input_handler_filter_keypress().

◆ perform_action_response_cb()

static void perform_action_response_cb ( GObject *  object,
GAsyncResult *  result,
gpointer  user_data 
)
static

Definition at line 123 of file fl_text_input_handler.cc.

125 {
126 g_autoptr(GError) error = nullptr;
127 if (!fl_text_input_channel_perform_action_finish(object, result, &error)) {
128 if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
129 g_warning("Failed to perform action: %s", error->message);
130 }
131 }
132}
g_autoptr(GMutexLocker) locker
const uint8_t uint32_t uint32_t GError ** error
gboolean fl_text_input_channel_perform_action_finish(GObject *object, GAsyncResult *result, GError **error)

References error, fl_text_input_channel_perform_action_finish(), and g_autoptr().

Referenced by perform_action().

◆ set_client()

static void set_client ( int64_t  client_id,
const gchar *  input_action,
gboolean  enable_delta_model,
FlTextInputType  input_type,
gpointer  user_data 
)
static

Definition at line 242 of file fl_text_input_handler.cc.

246 {
247 FlTextInputHandler* self = FL_TEXT_INPUT_HANDLER(user_data);
248
249 self->client_id = client_id;
250 g_free(self->input_action);
251 self->input_action = g_strdup(input_action);
252 self->enable_delta_model = enable_delta_model;
253 self->input_type = input_type;
254}

References self, and user_data.

◆ set_editable_size_and_transform()

static void set_editable_size_and_transform ( double *  transform,
gpointer  user_data 
)
static

Definition at line 351 of file fl_text_input_handler.cc.

352 {
353 FlTextInputHandler* self = FL_TEXT_INPUT_HANDLER(user_data);
354
355 for (size_t i = 0; i < 16; i++) {
356 self->editabletext_transform[i / 4][i % 4] = transform[i];
357 }
359}
static void update_im_cursor_position(FlTextInputHandler *self)

References i, self, transform, update_im_cursor_position(), and user_data.

◆ set_editing_state()

static void set_editing_state ( const gchar *  text,
int64_t  selection_base,
int64_t  selection_extent,
int64_t  composing_base,
int64_t  composing_extent,
gpointer  user_data 
)
static

Definition at line 276 of file fl_text_input_handler.cc.

281 {
282 FlTextInputHandler* self = FL_TEXT_INPUT_HANDLER(user_data);
283
284 self->text_model->SetText(text);
285
286 // Flutter uses -1/-1 for invalid; translate that to 0/0 for the model.
287 if (selection_base == -1 && selection_extent == -1) {
288 selection_base = selection_extent = 0;
289 }
290
291 self->text_model->SetText(text);
292 self->text_model->SetSelection(
293 flutter::TextRange(selection_base, selection_extent));
294
295 if (composing_base == -1 && composing_extent == -1) {
296 self->text_model->EndComposing();
297 } else {
298 size_t composing_start = std::min(composing_base, composing_extent);
299 size_t cursor_offset = selection_base - composing_start;
300 self->text_model->SetComposingRange(
301 flutter::TextRange(composing_base, composing_extent), cursor_offset);
302 }
303}

References self, text, and user_data.

◆ set_marked_text_rect()

static void set_marked_text_rect ( double  x,
double  y,
double  width,
double  height,
gpointer  user_data 
)
static

Definition at line 367 of file fl_text_input_handler.cc.

371 {
372 FlTextInputHandler* self = FL_TEXT_INPUT_HANDLER(user_data);
373
374 self->composing_rect.x = x;
375 self->composing_rect.y = y;
376 self->composing_rect.width = width;
377 self->composing_rect.height = height;
379}
int32_t x
double y
int32_t height
int32_t width

References height, self, update_im_cursor_position(), user_data, width, x, and y.

◆ show()

static void show ( gpointer  user_data)
static

Definition at line 264 of file fl_text_input_handler.cc.

264 {
265 FlTextInputHandler* self = FL_TEXT_INPUT_HANDLER(user_data);
266
267 if (self->input_type == FL_TEXT_INPUT_TYPE_NONE) {
269 return;
270 }
271
272 gtk_im_context_focus_in(self->im_context);
273}
@ FL_TEXT_INPUT_TYPE_NONE
static void hide(gpointer user_data)
void gtk_im_context_focus_in(GtkIMContext *context)
Definition mock_gtk.cc:331

References FL_TEXT_INPUT_TYPE_NONE, gtk_im_context_focus_in(), hide(), self, and user_data.

◆ update_editing_state()

static void update_editing_state ( FlTextInputHandler *  self)
static

Definition at line 89 of file fl_text_input_handler.cc.

89 {
90 int composing_base = -1;
91 int composing_extent = -1;
92 if (!self->text_model->composing_range().collapsed()) {
93 composing_base = self->text_model->composing_range().base();
94 composing_extent = self->text_model->composing_range().extent();
95 }
96 flutter::TextRange selection = self->text_model->selection();
98 self->channel, self->client_id, self->text_model->GetText().c_str(),
99 selection.base(), selection.extent(), FL_TEXT_AFFINITY_DOWNSTREAM, FALSE,
100 composing_base, composing_extent, self->cancellable,
102}
size_t base() const
Definition text_range.h:30
size_t extent() const
Definition text_range.h:36
void fl_text_input_channel_update_editing_state(FlTextInputChannel *self, int64_t client_id, const gchar *text, int64_t selection_base, int64_t selection_extent, FlTextAffinity selection_affinity, gboolean selection_is_directional, int64_t composing_base, int64_t composing_extent, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
@ FL_TEXT_AFFINITY_DOWNSTREAM
static void update_editing_state_response_cb(GObject *object, GAsyncResult *result, gpointer user_data)

References flutter::TextRange::base(), flutter::TextRange::extent(), FL_TEXT_AFFINITY_DOWNSTREAM, fl_text_input_channel_update_editing_state(), self, and update_editing_state_response_cb().

Referenced by fl_text_input_handler_filter_keypress(), im_commit_cb(), im_delete_surrounding_cb(), im_preedit_changed_cb(), and im_preedit_end_cb().

◆ update_editing_state_response_cb()

static void update_editing_state_response_cb ( GObject *  object,
GAsyncResult *  result,
gpointer  user_data 
)
static

Definition at line 61 of file fl_text_input_handler.cc.

63 {
64 g_autoptr(GError) error = nullptr;
66 &error)) {
67 if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
68 g_warning("Failed to update editing state: %s", error->message);
69 }
70 }
71}
gboolean fl_text_input_channel_update_editing_state_finish(GObject *object, GAsyncResult *result, GError **error)

References error, fl_text_input_channel_update_editing_state_finish(), and g_autoptr().

Referenced by update_editing_state().

◆ update_editing_state_with_delta()

static void update_editing_state_with_delta ( FlTextInputHandler *  self,
flutter::TextEditingDelta delta 
)
static

Definition at line 105 of file fl_text_input_handler.cc.

106 {
107 flutter::TextRange selection = self->text_model->selection();
108 int composing_base = -1;
109 int composing_extent = -1;
110 if (!self->text_model->composing_range().collapsed()) {
111 composing_base = self->text_model->composing_range().base();
112 composing_extent = self->text_model->composing_range().extent();
113 }
115 self->channel, self->client_id, delta->old_text().c_str(),
116 delta->delta_text().c_str(), delta->delta_start(), delta->delta_end(),
117 selection.base(), selection.extent(), FL_TEXT_AFFINITY_DOWNSTREAM, FALSE,
118 composing_base, composing_extent, self->cancellable,
120}
void fl_text_input_channel_update_editing_state_with_deltas(FlTextInputChannel *self, int64_t client_id, const gchar *old_text, const gchar *delta_text, int64_t delta_start, int64_t delta_end, int64_t selection_base, int64_t selection_extent, FlTextAffinity selection_affinity, gboolean selection_is_directional, int64_t composing_base, int64_t composing_extent, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
static void update_editing_state_with_deltas_response_cb(GObject *object, GAsyncResult *result, gpointer user_data)
std::string delta_text() const
int delta_start() const
Get the delta_start_ value.
int delta_end() const
Get the delta_end_ value.
std::string old_text() const

References flutter::TextRange::base(), flutter::TextEditingDelta::delta_end(), flutter::TextEditingDelta::delta_start(), flutter::TextEditingDelta::delta_text(), flutter::TextRange::extent(), FL_TEXT_AFFINITY_DOWNSTREAM, fl_text_input_channel_update_editing_state_with_deltas(), flutter::TextEditingDelta::old_text(), self, and update_editing_state_with_deltas_response_cb().

Referenced by fl_text_input_handler_filter_keypress(), im_commit_cb(), im_delete_surrounding_cb(), im_preedit_changed_cb(), and im_preedit_end_cb().

◆ update_editing_state_with_deltas_response_cb()

static void update_editing_state_with_deltas_response_cb ( GObject *  object,
GAsyncResult *  result,
gpointer  user_data 
)
static

Definition at line 75 of file fl_text_input_handler.cc.

77 {
78 g_autoptr(GError) error = nullptr;
80 object, result, &error)) {
81 if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
82 g_warning("Failed to update editing state with deltas: %s",
83 error->message);
84 }
85 }
86}
gboolean fl_text_input_channel_update_editing_state_with_deltas_finish(GObject *object, GAsyncResult *result, GError **error)

References error, fl_text_input_channel_update_editing_state_with_deltas_finish(), and g_autoptr().

Referenced by update_editing_state_with_delta().

◆ update_im_cursor_position()

static void update_im_cursor_position ( FlTextInputHandler *  self)
static

Definition at line 319 of file fl_text_input_handler.cc.

319 {
320 // Skip update if not composing to avoid setting to position 0.
321 if (!self->text_model->composing()) {
322 return;
323 }
324
325 // Transform the x, y positions of the cursor from local coordinates to
326 // Flutter view coordinates.
327 gint x = self->composing_rect.x * self->editabletext_transform[0][0] +
328 self->composing_rect.y * self->editabletext_transform[1][0] +
329 self->editabletext_transform[3][0] + self->composing_rect.width;
330 gint y = self->composing_rect.x * self->editabletext_transform[0][1] +
331 self->composing_rect.y * self->editabletext_transform[1][1] +
332 self->editabletext_transform[3][1] + self->composing_rect.height;
333
334 // Transform from Flutter view coordinates to GTK window coordinates.
335 GdkRectangle preedit_rect = {};
337 gtk_widget_get_toplevel(self->widget), x, y,
338 &preedit_rect.x, &preedit_rect.y);
339
340 // Set the cursor location in window coordinates so that GTK can position
341 // any system input method windows.
342 gtk_im_context_set_cursor_location(self->im_context, &preedit_rect);
343}
void gtk_im_context_set_cursor_location(GtkIMContext *context, const GdkRectangle *area)
Definition mock_gtk.cc:345
GtkWidget * gtk_widget_get_toplevel(GtkWidget *widget)
Definition mock_gtk.cc:293
gboolean gtk_widget_translate_coordinates(GtkWidget *src_widget, GtkWidget *dest_widget, gint src_x, gint src_y, gint *dest_x, gint *dest_y)
Definition mock_gtk.cc:276

References gtk_im_context_set_cursor_location(), gtk_widget_get_toplevel(), gtk_widget_translate_coordinates(), self, x, and y.

Referenced by set_editable_size_and_transform(), and set_marked_text_rect().

Variable Documentation

◆ kClientIdUnset

constexpr int64_t kClientIdUnset = -1
staticconstexpr

◆ kNewlineInputAction

constexpr char kNewlineInputAction[] = "TextInputAction.newline"
staticconstexpr

Definition at line 13 of file fl_text_input_handler.cc.

Referenced by fl_text_input_handler_filter_keypress().

◆ text_input_vtable

FlTextInputChannelVTable text_input_vtable
static
Initial value:
= {
.set_client = set_client,
.hide = hide,
.show = show,
.set_editing_state = set_editing_state,
.clear_client = clear_client,
.set_editable_size_and_transform = set_editable_size_and_transform,
.set_marked_text_rect = set_marked_text_rect,
}
static void show(gpointer user_data)
static void set_marked_text_rect(double x, double y, double width, double height, gpointer user_data)
static void clear_client(gpointer user_data)
static void set_editable_size_and_transform(double *transform, gpointer user_data)
static void set_editing_state(const gchar *text, int64_t selection_base, int64_t selection_extent, int64_t composing_base, int64_t composing_extent, gpointer user_data)
static void set_client(int64_t client_id, const gchar *input_action, gboolean enable_delta_model, FlTextInputType input_type, gpointer user_data)

Definition at line 412 of file fl_text_input_handler.cc.

412 {
413 .set_client = set_client,
414 .hide = hide,
415 .show = show,
416 .set_editing_state = set_editing_state,
417 .clear_client = clear_client,
418 .set_editable_size_and_transform = set_editable_size_and_transform,
419 .set_marked_text_rect = set_marked_text_rect,
420};

Referenced by fl_text_input_handler_new().