[Linux] Remove the usage of std::function in FlKeyEmbedderResponder (#49293)

Fixes https://github.com/flutter/flutter/issues/140183

[C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
diff --git a/shell/platform/linux/fl_key_embedder_responder.cc b/shell/platform/linux/fl_key_embedder_responder.cc
index 925c530..100d618 100644
--- a/shell/platform/linux/fl_key_embedder_responder.cc
+++ b/shell/platform/linux/fl_key_embedder_responder.cc
@@ -141,6 +141,7 @@
   GObject parent_instance;
 
   EmbedderSendKeyEvent send_key_event;
+  void* send_key_event_user_data;
 
   // Internal record for states of whether a key is pressed.
   //
@@ -260,11 +261,13 @@
 
 // Creates a new FlKeyEmbedderResponder instance.
 FlKeyEmbedderResponder* fl_key_embedder_responder_new(
-    EmbedderSendKeyEvent send_key_event) {
+    EmbedderSendKeyEvent send_key_event,
+    void* send_key_event_user_data) {
   FlKeyEmbedderResponder* self = FL_KEY_EMBEDDER_RESPONDER(
       g_object_new(FL_TYPE_EMBEDDER_RESPONDER_USER_DATA, nullptr));
 
-  self->send_key_event = std::move(send_key_event);
+  self->send_key_event = send_key_event;
+  self->send_key_event_user_data = send_key_event_user_data;
 
   self->pressing_records = g_hash_table_new(g_direct_hash, g_direct_equal);
   self->mapping_records = g_hash_table_new(g_direct_hash, g_direct_equal);
@@ -360,7 +363,8 @@
   out_event.character = nullptr;
   out_event.synthesized = true;
   self->sent_any_events = true;
-  self->send_key_event(&out_event, nullptr, nullptr);
+  self->send_key_event(&out_event, nullptr, nullptr,
+                       self->send_key_event_user_data);
 }
 
 namespace {
@@ -850,7 +854,8 @@
   FlKeyEmbedderUserData* response_data =
       fl_key_embedder_user_data_new(callback, user_data);
   self->sent_any_events = true;
-  self->send_key_event(&out_event, handle_response, response_data);
+  self->send_key_event(&out_event, handle_response, response_data,
+                       self->send_key_event_user_data);
 }
 
 // Sends a key event to the framework.
@@ -865,7 +870,8 @@
   fl_key_embedder_responder_handle_event_impl(
       responder, event, specified_logical_key, callback, user_data);
   if (!self->sent_any_events) {
-    self->send_key_event(&kEmptyEvent, nullptr, nullptr);
+    self->send_key_event(&kEmptyEvent, nullptr, nullptr,
+                         self->send_key_event_user_data);
   }
 }
 
diff --git a/shell/platform/linux/fl_key_embedder_responder.h b/shell/platform/linux/fl_key_embedder_responder.h
index 8937f97..73c754b 100644
--- a/shell/platform/linux/fl_key_embedder_responder.h
+++ b/shell/platform/linux/fl_key_embedder_responder.h
@@ -15,10 +15,21 @@
 
 constexpr int kMaxConvertedKeyData = 3;
 
-typedef std::function<void(const FlutterKeyEvent* event,
-                           FlutterKeyEventCallback callback,
-                           void* user_data)>
-    EmbedderSendKeyEvent;
+// The signature of a function that FlKeyEmbedderResponder calls on every key
+// event.
+//
+// The `user_data` is opaque data managed by the object that creates
+// FlKeyEmbedderResponder, and is registered along with this callback
+// via `fl_key_embedder_responder_new`.
+//
+// The `callback_user_data` is opaque data managed by FlKeyEmbedderResponder.
+// Instances of the EmbedderSendKeyEvent callback are required to invoke
+// `callback` with the `callback_user_data` parameter after the `event` has been
+// processed.
+typedef void (*EmbedderSendKeyEvent)(const FlutterKeyEvent* event,
+                                     FlutterKeyEventCallback callback,
+                                     void* callback_user_data,
+                                     void* send_key_event_user_data);
 
 G_BEGIN_DECLS
 
@@ -44,11 +55,16 @@
  * the event.
  *
  * Creates a new #FlKeyEmbedderResponder.
+ * @send_key_event: a function that is called on every key event.
+ * @send_key_event_user_data: an opaque pointer that will be sent back as the
+ * last argument of send_key_event, created and managed by the object that holds
+ * FlKeyEmbedderResponder.
  *
  * Returns: a new #FlKeyEmbedderResponder.
  */
 FlKeyEmbedderResponder* fl_key_embedder_responder_new(
-    EmbedderSendKeyEvent send_key_event);
+    EmbedderSendKeyEvent send_key_event,
+    void* send_key_event_user_data);
 
 /**
  * fl_key_embedder_responder_sync_modifiers_if_needed:
diff --git a/shell/platform/linux/fl_key_embedder_responder_test.cc b/shell/platform/linux/fl_key_embedder_responder_test.cc
index 6b7d0f1..c7445c8 100644
--- a/shell/platform/linux/fl_key_embedder_responder_test.cc
+++ b/shell/platform/linux/fl_key_embedder_responder_test.cc
@@ -149,14 +149,16 @@
 GPtrArray* g_call_records;
 }
 
-static EmbedderSendKeyEvent record_calls_in(GPtrArray* records_array) {
-  return [records_array](const FlutterKeyEvent* event,
-                         FlutterKeyEventCallback callback, void* user_data) {
-    if (records_array != nullptr) {
-      g_ptr_array_add(records_array, fl_key_embedder_call_record_new(
-                                         event, callback, user_data));
-    }
-  };
+static void record_calls(const FlutterKeyEvent* event,
+                         FlutterKeyEventCallback callback,
+                         void* callback_user_data,
+                         void* send_key_event_user_data) {
+  GPtrArray* records_array =
+      reinterpret_cast<GPtrArray*>(send_key_event_user_data);
+  if (records_array != nullptr) {
+    g_ptr_array_add(records_array, fl_key_embedder_call_record_new(
+                                       event, callback, callback_user_data));
+  }
 }
 
 static void clear_g_call_records() {
@@ -169,7 +171,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -265,7 +267,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -300,7 +302,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -393,7 +395,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -554,7 +556,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -649,7 +651,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -810,7 +812,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -967,7 +969,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -1028,7 +1030,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   // Release KeyA before it was even pressed.
@@ -1058,7 +1060,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -1189,7 +1191,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -1320,7 +1322,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -1388,7 +1390,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -1496,7 +1498,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -1595,7 +1597,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
   int user_data = 123;  // Arbitrary user data
 
   FlKeyEmbedderCallRecord* record;
@@ -1648,7 +1650,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
 
   g_expected_handled = true;
   guint32 now_time = 1;
@@ -1746,7 +1748,7 @@
   EXPECT_EQ(g_call_records, nullptr);
   g_call_records = g_ptr_array_new_with_free_func(g_object_unref);
   FlKeyResponder* responder = FL_KEY_RESPONDER(
-      fl_key_embedder_responder_new(record_calls_in(g_call_records)));
+      fl_key_embedder_responder_new(record_calls, g_call_records));
 
   g_expected_handled = true;
   guint32 now_time = 1;
diff --git a/shell/platform/linux/fl_keyboard_manager.cc b/shell/platform/linux/fl_keyboard_manager.cc
index 46f70fa..2d14293 100644
--- a/shell/platform/linux/fl_keyboard_manager.cc
+++ b/shell/platform/linux/fl_keyboard_manager.cc
@@ -599,12 +599,15 @@
   g_ptr_array_add(
       self->responder_list,
       FL_KEY_RESPONDER(fl_key_embedder_responder_new(
-          [self](const FlutterKeyEvent* event, FlutterKeyEventCallback callback,
-                 void* user_data) {
+          [](const FlutterKeyEvent* event, FlutterKeyEventCallback callback,
+             void* callback_user_data, void* send_key_event_user_data) {
+            FlKeyboardManager* self =
+                FL_KEYBOARD_MANAGER(send_key_event_user_data);
             g_return_if_fail(self->view_delegate != nullptr);
-            fl_keyboard_view_delegate_send_key_event(self->view_delegate, event,
-                                                     callback, user_data);
-          })));
+            fl_keyboard_view_delegate_send_key_event(
+                self->view_delegate, event, callback, callback_user_data);
+          },
+          self)));
   g_ptr_array_add(self->responder_list,
                   FL_KEY_RESPONDER(fl_key_channel_responder_new(
                       fl_keyboard_view_delegate_get_messenger(view_delegate))));