Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions ci/licenses_golden/licenses_flutter
Original file line number Diff line number Diff line change
Expand Up @@ -2041,6 +2041,8 @@ FILE: ../../../flutter/shell/platform/linux/fl_key_responder.h
FILE: ../../../flutter/shell/platform/linux/fl_keyboard_manager.cc
FILE: ../../../flutter/shell/platform/linux/fl_keyboard_manager.h
FILE: ../../../flutter/shell/platform/linux/fl_keyboard_manager_test.cc
FILE: ../../../flutter/shell/platform/linux/fl_keyboard_view_delegate.cc
FILE: ../../../flutter/shell/platform/linux/fl_keyboard_view_delegate.h
FILE: ../../../flutter/shell/platform/linux/fl_message_codec.cc
FILE: ../../../flutter/shell/platform/linux/fl_message_codec_test.cc
FILE: ../../../flutter/shell/platform/linux/fl_method_call.cc
Expand Down
2 changes: 2 additions & 0 deletions shell/platform/linux/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ source_set("flutter_linux_sources") {
"fl_dart_project_private.h",
"fl_engine_private.h",
"fl_keyboard_manager.h",
"fl_keyboard_view_delegate.h",
"fl_key_event.h",
"fl_key_responder.h",
"fl_key_channel_responder.h",
Expand Down Expand Up @@ -113,6 +114,7 @@ source_set("flutter_linux_sources") {
"fl_key_event.cc",
"fl_key_responder.cc",
"fl_keyboard_manager.cc",
"fl_keyboard_view_delegate.cc",
"fl_message_codec.cc",
"fl_method_call.cc",
"fl_method_channel.cc",
Expand Down
42 changes: 14 additions & 28 deletions shell/platform/linux/fl_key_embedder_responder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
#include <cinttypes>

#include "flutter/shell/platform/embedder/embedder.h"
#include "flutter/shell/platform/linux/fl_engine_private.h"
#include "flutter/shell/platform/linux/fl_key_embedder_responder_private.h"
#include "flutter/shell/platform/linux/key_mapping.h"

Expand Down Expand Up @@ -141,8 +140,7 @@ typedef enum {
struct _FlKeyEmbedderResponder {
GObject parent_instance;

// A weak pointer to the engine the responder is attached to.
FlEngine* engine;
EmbedderSendKeyEvent send_key_event;

// Internal record for states of whether a key is pressed.
//
Expand Down Expand Up @@ -171,7 +169,7 @@ struct _FlKeyEmbedderResponder {
// For more information, see #update_caps_lock_state_logic_inferrence.
StateLogicInferrence caps_lock_state_logic_inferrence;

// Record if any events has been sent through the engine during a
// Record if any events has been sent during a
// |fl_key_embedder_responder_handle_event| call.
bool sent_any_events;

Expand Down Expand Up @@ -259,18 +257,13 @@ static void initialize_logical_key_to_lock_bit_loop_body(gpointer lock_bit,
GUINT_TO_POINTER(lock_bit));
}

// Creates a new FlKeyEmbedderResponder instance with an engine.
FlKeyEmbedderResponder* fl_key_embedder_responder_new(FlEngine* engine) {
g_return_val_if_fail(FL_IS_ENGINE(engine), nullptr);

// Creates a new FlKeyEmbedderResponder instance.
FlKeyEmbedderResponder* fl_key_embedder_responder_new(
EmbedderSendKeyEvent send_key_event) {
FlKeyEmbedderResponder* self = FL_KEY_EMBEDDER_RESPONDER(
g_object_new(FL_TYPE_EMBEDDER_RESPONDER_USER_DATA, nullptr));

self->engine = engine;
// Add a weak pointer so we can know if the key event responder disappeared
// while the framework was responding.
g_object_add_weak_pointer(G_OBJECT(engine),
reinterpret_cast<gpointer*>(&(self->engine)));
self->send_key_event = std::move(send_key_event);

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);
Expand Down Expand Up @@ -351,7 +344,7 @@ static void handle_response(bool handled, gpointer user_data) {
data->callback(handled, data->user_data);
}

// Sends a synthesized event to the engine with no demand for callback.
// Sends a synthesized event to the framework with no demand for callback.
static void synthesize_simple_event(FlKeyEmbedderResponder* self,
FlutterKeyEventType type,
uint64_t physical,
Expand All @@ -365,10 +358,8 @@ static void synthesize_simple_event(FlKeyEmbedderResponder* self,
out_event.logical = logical;
out_event.character = nullptr;
out_event.synthesized = true;
if (self->engine != nullptr) {
self->sent_any_events = true;
fl_engine_send_key_event(self->engine, &out_event, nullptr, nullptr);
}
self->sent_any_events = true;
self->send_key_event(&out_event, nullptr, nullptr);
}

namespace {
Expand Down Expand Up @@ -776,15 +767,10 @@ static void fl_key_embedder_responder_handle_event_impl(
if (is_down_event) {
update_mapping_record(self, physical_key, logical_key);
}
if (self->engine != nullptr) {
FlKeyEmbedderUserData* response_data =
fl_key_embedder_user_data_new(callback, user_data);
self->sent_any_events = true;
fl_engine_send_key_event(self->engine, &out_event, handle_response,
response_data);
} else {
callback(true, user_data);
}
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);
}

// Sends a key event to the framework.
Expand All @@ -798,6 +784,6 @@ static void fl_key_embedder_responder_handle_event(
fl_key_embedder_responder_handle_event_impl(responder, event, callback,
user_data);
if (!self->sent_any_events) {
fl_engine_send_key_event(self->engine, &empty_event, nullptr, nullptr);
self->send_key_event(&empty_event, nullptr, nullptr);
}
}
9 changes: 8 additions & 1 deletion shell/platform/linux/fl_key_embedder_responder.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#define FLUTTER_SHELL_PLATFORM_LINUX_FL_KEY_EMBEDDER_RESPONDER_H_

#include <gdk/gdk.h>
#include <functional>

#include "flutter/shell/platform/linux/fl_key_responder.h"
#include "flutter/shell/platform/linux/fl_keyboard_manager.h"
Expand All @@ -14,6 +15,11 @@

constexpr int kMaxConvertedKeyData = 3;

typedef std::function<void(const FlutterKeyEvent* event,
FlutterKeyEventCallback callback,
void* user_data)>
EmbedderSendKeyEvent;

G_BEGIN_DECLS

#define FL_TYPE_KEY_EMBEDDER_RESPONDER fl_key_embedder_responder_get_type()
Expand Down Expand Up @@ -41,7 +47,8 @@ G_DECLARE_FINAL_TYPE(FlKeyEmbedderResponder,
*
* Returns: a new #FlKeyEmbedderResponder.
*/
FlKeyEmbedderResponder* fl_key_embedder_responder_new(FlEngine* engine);
FlKeyEmbedderResponder* fl_key_embedder_responder_new(
EmbedderSendKeyEvent send_key_event);

G_END_DECLS

Expand Down
Loading