@@ -73,55 +73,6 @@ static uint64_t to_lower(uint64_t n) {
73
73
return n;
74
74
}
75
75
76
- /* *
77
- * FlKeyEmbedderUserData:
78
- * The user_data used when #FlKeyEmbedderResponder sends message through the
79
- * embedder.SendKeyEvent API.
80
- */
81
- G_DECLARE_FINAL_TYPE (FlKeyEmbedderUserData,
82
- fl_key_embedder_user_data,
83
- FL,
84
- KEY_EMBEDDER_USER_DATA,
85
- GObject);
86
-
87
- struct _FlKeyEmbedderUserData {
88
- GObject parent_instance;
89
-
90
- FlKeyEmbedderResponderAsyncCallback callback;
91
- gpointer user_data;
92
- };
93
-
94
- G_DEFINE_TYPE (FlKeyEmbedderUserData, fl_key_embedder_user_data, G_TYPE_OBJECT)
95
-
96
- static void fl_key_embedder_user_data_dispose(GObject* object);
97
-
98
- static void fl_key_embedder_user_data_class_init (
99
- FlKeyEmbedderUserDataClass* klass) {
100
- G_OBJECT_CLASS (klass)->dispose = fl_key_embedder_user_data_dispose;
101
- }
102
-
103
- static void fl_key_embedder_user_data_init (FlKeyEmbedderUserData* self) {}
104
-
105
- static void fl_key_embedder_user_data_dispose (GObject* object) {
106
- // The following line suppresses a warning for unused function
107
- // FL_IS_KEY_EMBEDDER_USER_DATA.
108
- g_return_if_fail (FL_IS_KEY_EMBEDDER_USER_DATA (object));
109
- }
110
-
111
- // Creates a new FlKeyChannelUserData private class with all information.
112
- //
113
- // The callback and the user_data might be nullptr.
114
- static FlKeyEmbedderUserData* fl_key_embedder_user_data_new (
115
- FlKeyEmbedderResponderAsyncCallback callback,
116
- gpointer user_data) {
117
- FlKeyEmbedderUserData* self = FL_KEY_EMBEDDER_USER_DATA (
118
- g_object_new (fl_key_embedder_user_data_get_type (), nullptr ));
119
-
120
- self->callback = callback;
121
- self->user_data = user_data;
122
- return self;
123
- }
124
-
125
76
namespace {
126
77
127
78
typedef enum {
@@ -135,8 +86,8 @@ typedef enum {
135
86
struct _FlKeyEmbedderResponder {
136
87
GObject parent_instance;
137
88
138
- EmbedderSendKeyEvent send_key_event;
139
- void * send_key_event_user_data ;
89
+ // Engine sending key events to.
90
+ GWeakRef engine ;
140
91
141
92
// Internal record for states of whether a key is pressed.
142
93
//
@@ -190,6 +141,8 @@ struct _FlKeyEmbedderResponder {
190
141
// It is a map from primary physical keys to lock bits. Both keys and values
191
142
// are directly stored uint64s. This table is freed by the responder.
192
143
GHashTable* logical_key_to_lock_bit;
144
+
145
+ GCancellable* cancellable;
193
146
};
194
147
195
148
static void fl_key_embedder_responder_dispose (GObject* object);
@@ -203,17 +156,23 @@ static void fl_key_embedder_responder_class_init(
203
156
}
204
157
205
158
// Initializes an FlKeyEmbedderResponder instance.
206
- static void fl_key_embedder_responder_init (FlKeyEmbedderResponder* self) {}
159
+ static void fl_key_embedder_responder_init (FlKeyEmbedderResponder* self) {
160
+ self->cancellable = g_cancellable_new ();
161
+ }
207
162
208
163
// Disposes of an FlKeyEmbedderResponder instance.
209
164
static void fl_key_embedder_responder_dispose (GObject* object) {
210
165
FlKeyEmbedderResponder* self = FL_KEY_EMBEDDER_RESPONDER (object);
211
166
167
+ g_cancellable_cancel (self->cancellable );
168
+
169
+ g_weak_ref_clear (&self->engine );
212
170
g_clear_pointer (&self->pressing_records , g_hash_table_unref);
213
171
g_clear_pointer (&self->mapping_records , g_hash_table_unref);
214
172
g_clear_pointer (&self->modifier_bit_to_checked_keys , g_hash_table_unref);
215
173
g_clear_pointer (&self->lock_bit_to_checked_keys , g_hash_table_unref);
216
174
g_clear_pointer (&self->logical_key_to_lock_bit , g_hash_table_unref);
175
+ g_clear_object (&self->cancellable );
217
176
218
177
G_OBJECT_CLASS (fl_key_embedder_responder_parent_class)->dispose (object);
219
178
}
@@ -234,14 +193,11 @@ static void initialize_logical_key_to_lock_bit_loop_body(gpointer lock_bit,
234
193
}
235
194
236
195
// Creates a new FlKeyEmbedderResponder instance.
237
- FlKeyEmbedderResponder* fl_key_embedder_responder_new (
238
- EmbedderSendKeyEvent send_key_event,
239
- void * send_key_event_user_data) {
196
+ FlKeyEmbedderResponder* fl_key_embedder_responder_new (FlEngine* engine) {
240
197
FlKeyEmbedderResponder* self = FL_KEY_EMBEDDER_RESPONDER (
241
198
g_object_new (fl_key_embedder_responder_get_type (), nullptr ));
242
199
243
- self->send_key_event = send_key_event;
244
- self->send_key_event_user_data = send_key_event_user_data;
200
+ g_weak_ref_init (&self->engine , engine);
245
201
246
202
self->pressing_records = g_hash_table_new (g_direct_hash, g_direct_equal);
247
203
self->mapping_records = g_hash_table_new (g_direct_hash, g_direct_equal);
@@ -311,16 +267,6 @@ static char* event_to_character(FlKeyEvent* event) {
311
267
return result;
312
268
}
313
269
314
- // Handles a response from the embedder API to a key event sent to the framework
315
- // earlier.
316
- static void handle_response (bool handled, gpointer user_data) {
317
- g_autoptr (FlKeyEmbedderUserData) data = FL_KEY_EMBEDDER_USER_DATA (user_data);
318
-
319
- g_return_if_fail (data->callback != nullptr );
320
-
321
- data->callback (handled, data->user_data );
322
- }
323
-
324
270
// Sends a synthesized event to the framework with no demand for callback.
325
271
static void synthesize_simple_event (FlKeyEmbedderResponder* self,
326
272
FlutterKeyEventType type,
@@ -336,8 +282,11 @@ static void synthesize_simple_event(FlKeyEmbedderResponder* self,
336
282
out_event.character = nullptr ;
337
283
out_event.synthesized = true ;
338
284
self->sent_any_events = true ;
339
- self->send_key_event (&out_event, nullptr , nullptr ,
340
- self->send_key_event_user_data );
285
+ g_autoptr (FlEngine) engine = FL_ENGINE (g_weak_ref_get (&self->engine ));
286
+ if (engine != nullptr ) {
287
+ fl_engine_send_key_event (engine, &out_event, self->cancellable , nullptr ,
288
+ nullptr );
289
+ }
341
290
}
342
291
343
292
namespace {
@@ -750,13 +699,9 @@ static void fl_key_embedder_responder_handle_event_impl(
750
699
FlKeyEmbedderResponder* responder,
751
700
FlKeyEvent* event,
752
701
uint64_t specified_logical_key,
753
- FlKeyEmbedderResponderAsyncCallback callback,
754
- gpointer user_data) {
702
+ GTask* task) {
755
703
FlKeyEmbedderResponder* self = FL_KEY_EMBEDDER_RESPONDER (responder);
756
704
757
- g_return_if_fail (event != nullptr );
758
- g_return_if_fail (callback != nullptr );
759
-
760
705
const uint64_t logical_key = specified_logical_key != 0
761
706
? specified_logical_key
762
707
: event_to_logical_key (event);
@@ -811,7 +756,9 @@ static void fl_key_embedder_responder_handle_event_impl(
811
756
// The physical key has been released before. It might indicate a missed
812
757
// event due to loss of focus, or multiple keyboards pressed keys with the
813
758
// same physical key. Ignore the up event.
814
- callback (true , user_data);
759
+ gboolean* return_value = g_new0 (gboolean, 1 );
760
+ *return_value = TRUE ;
761
+ g_task_return_pointer (task, return_value, g_free);
815
762
return ;
816
763
} else {
817
764
out_event.type = kFlutterKeyEventTypeUp ;
@@ -825,41 +772,85 @@ static void fl_key_embedder_responder_handle_event_impl(
825
772
if (is_down_event) {
826
773
update_mapping_record (self, physical_key, logical_key);
827
774
}
828
- FlKeyEmbedderUserData* response_data =
829
- fl_key_embedder_user_data_new (callback, user_data);
830
775
self->sent_any_events = true ;
831
- self->send_key_event (&out_event, handle_response, response_data,
832
- self->send_key_event_user_data );
776
+ g_autoptr (FlEngine) engine = FL_ENGINE (g_weak_ref_get (&self->engine ));
777
+ if (engine != nullptr ) {
778
+ fl_engine_send_key_event (
779
+ engine, &out_event, self->cancellable ,
780
+ [](GObject* object, GAsyncResult* result, gpointer user_data) {
781
+ g_autoptr (GTask) task = G_TASK (user_data);
782
+
783
+ gboolean handled;
784
+ g_autoptr (GError) error = nullptr ;
785
+ if (!fl_engine_send_key_event_finish (FL_ENGINE (object), result,
786
+ &handled, &error)) {
787
+ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
788
+ return ;
789
+ }
790
+ g_warning (" Failed to handle key event: %s" , error->message );
791
+ handled = FALSE ;
792
+ }
793
+
794
+ gboolean* return_value = g_new0 (gboolean, 1 );
795
+ *return_value = handled;
796
+ g_task_return_pointer (task, return_value, g_free);
797
+ },
798
+ g_object_ref (task));
799
+ }
833
800
}
834
801
835
- void fl_key_embedder_responder_handle_event (
836
- FlKeyEmbedderResponder* self,
837
- FlKeyEvent* event,
838
- uint64_t specified_logical_key,
839
- FlKeyEmbedderResponderAsyncCallback callback,
840
- gpointer user_data) {
802
+ void fl_key_embedder_responder_handle_event (FlKeyEmbedderResponder* self,
803
+ FlKeyEvent* event,
804
+ uint64_t specified_logical_key,
805
+ GCancellable* cancellable,
806
+ GAsyncReadyCallback callback,
807
+ gpointer user_data) {
808
+ g_autoptr (GTask) task = g_task_new (self, cancellable, callback, user_data);
809
+
841
810
self->sent_any_events = false ;
842
- fl_key_embedder_responder_handle_event_impl (
843
- self, event, specified_logical_key, callback, user_data );
811
+ fl_key_embedder_responder_handle_event_impl (self, event,
812
+ specified_logical_key, task );
844
813
if (!self->sent_any_events ) {
845
- self->send_key_event (&kEmptyEvent , nullptr , nullptr ,
846
- self->send_key_event_user_data );
814
+ g_autoptr (FlEngine) engine = FL_ENGINE (g_weak_ref_get (&self->engine ));
815
+ if (engine != nullptr ) {
816
+ fl_engine_send_key_event (engine, &kEmptyEvent , self->cancellable , nullptr ,
817
+ nullptr );
818
+ }
847
819
}
848
820
}
849
821
822
+ gboolean fl_key_embedder_responder_handle_event_finish (
823
+ FlKeyEmbedderResponder* self,
824
+ GAsyncResult* result,
825
+ gboolean* handled,
826
+ GError** error) {
827
+ g_return_val_if_fail (g_task_is_valid (result, self), FALSE );
828
+
829
+ g_autofree gboolean* return_value =
830
+ static_cast <gboolean*>(g_task_propagate_pointer (G_TASK (result), error));
831
+ if (return_value == nullptr ) {
832
+ return FALSE ;
833
+ }
834
+
835
+ *handled = *return_value;
836
+ return TRUE ;
837
+ }
838
+
850
839
void fl_key_embedder_responder_sync_modifiers_if_needed (
851
- FlKeyEmbedderResponder* responder ,
840
+ FlKeyEmbedderResponder* self ,
852
841
guint state,
853
842
double event_time) {
843
+ g_return_if_fail (FL_IS_KEY_EMBEDDER_RESPONDER (self));
844
+
854
845
const double timestamp = event_time * kMicrosecondsPerMillisecond ;
855
846
856
847
SyncStateLoopContext sync_state_context;
857
- sync_state_context.self = responder ;
848
+ sync_state_context.self = self ;
858
849
sync_state_context.state = state;
859
850
sync_state_context.timestamp = timestamp;
860
851
861
852
// Update pressing states.
862
- g_hash_table_foreach (responder ->modifier_bit_to_checked_keys ,
853
+ g_hash_table_foreach (self ->modifier_bit_to_checked_keys ,
863
854
synchronize_pressed_states_loop_body,
864
855
&sync_state_context);
865
856
}
0 commit comments