[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))));