21 #define DEBUG_PRINT_LAYOUT
26 fl_keyboard_manager_data,
28 KEYBOARD_MANAGER_DATA,
35 static bool is_eascii(uint16_t character) {
36 return character < 256;
39 #ifdef DEBUG_PRINT_LAYOUT
41 void debug_format_layout_data(std::string& debug_layout_data,
45 if (keycode % 4 == 0) {
46 debug_layout_data.append(
" ");
49 constexpr
int kBufferSize = 30;
52 buffer[kBufferSize - 1] = 0;
54 snprintf(
buffer, kBufferSize,
"0x%04x, 0x%04x, ", clue1, clue2);
55 debug_layout_data.append(
buffer);
57 if (keycode % 4 == 3) {
58 snprintf(
buffer, kBufferSize,
" // 0x%02x", keycode);
59 debug_layout_data.append(
buffer);
83 G_DEFINE_TYPE(FlKeyboardManagerData, fl_keyboard_manager_data, G_TYPE_OBJECT)
86 g_return_if_fail(FL_IS_KEYBOARD_MANAGER_DATA(
object));
87 FlKeyboardManagerData*
self = FL_KEYBOARD_MANAGER_DATA(
object);
89 g_weak_ref_clear(&self->manager);
91 G_OBJECT_CLASS(fl_keyboard_manager_data_parent_class)->dispose(
object);
95 FlKeyboardManagerDataClass* klass) {
103 FlKeyboardManager* manager,
104 FlKeyboardPendingEvent* pending) {
105 FlKeyboardManagerData*
self = FL_KEYBOARD_MANAGER_DATA(
106 g_object_new(fl_keyboard_manager_data_get_type(),
nullptr));
108 g_weak_ref_init(&self->manager, manager);
109 self->pending = FL_KEYBOARD_PENDING_EVENT(g_object_ref(pending));
165 std::unique_ptr<std::map<uint64_t, const LayoutGoal*>>
175 G_DEFINE_TYPE(FlKeyboardManager, fl_keyboard_manager, G_TYPE_OBJECT);
178 g_clear_object(&self->derived_layout);
186 gconstpointer needle,
187 GEqualFunc equal_func,
190 g_return_val_if_fail(haystack != NULL, FALSE);
191 if (equal_func == NULL) {
192 equal_func = g_direct_equal;
194 for (
i = 0;
i < haystack->len;
i++) {
195 if (equal_func(g_ptr_array_index(haystack,
i), needle)) {
196 if (index_ != NULL) {
208 FlKeyboardPendingEvent* pending =
209 FL_KEYBOARD_PENDING_EVENT(
const_cast<gpointer
>(a));
210 uint64_t hash = *
reinterpret_cast<const uint64_t*
>(b);
222 self->pending_redispatches,
static_cast<const uint64_t*
>(&hash),
226 g_ptr_array_remove_index_fast(self->pending_redispatches, result_index);
235 FlKeyboardPendingEvent* pending) {
236 g_autoptr(FlKeyboardViewDelegate) view_delegate =
237 FL_KEYBOARD_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
238 if (view_delegate ==
nullptr) {
244 g_ptr_array_remove(self->pending_responds, pending);
245 bool should_redispatch =
249 if (should_redispatch) {
250 g_ptr_array_add(self->pending_redispatches, g_object_ref(pending));
252 if (self->redispatch_handler !=
nullptr) {
253 self->redispatch_handler(event, self->redispatch_handler_user_data);
255 GdkEventType event_type =
257 g_return_if_fail(event_type == GDK_KEY_PRESS ||
258 event_type == GDK_KEY_RELEASE);
267 g_autoptr(FlKeyboardManagerData) data = FL_KEYBOARD_MANAGER_DATA(
user_data);
271 g_autoptr(FlKeyboardManager)
self =
272 FL_KEYBOARD_MANAGER(g_weak_ref_get(&data->manager));
273 if (
self ==
nullptr) {
281 GAsyncResult* result,
283 g_autoptr(FlKeyboardManagerData) data = FL_KEYBOARD_MANAGER_DATA(
user_data);
285 g_autoptr(GError)
error =
nullptr;
288 FL_KEY_CHANNEL_RESPONDER(
object), result, &handled, &
error)) {
289 if (!g_error_matches(
error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
290 g_warning(
"Failed to handle key event in platform: %s",
error->message);
295 g_autoptr(FlKeyboardManager)
self =
296 FL_KEYBOARD_MANAGER(g_weak_ref_get(&data->manager));
297 if (
self ==
nullptr) {
310 GdkKeymapKey key = {keycode, group, level};
311 constexpr
int kBmpMax = 0xD7FF;
313 if (self->lookup_key_handler !=
nullptr) {
314 origin =
self->lookup_key_handler(&key, self->lookup_key_handler_user_data);
316 origin = gdk_keymap_lookup_key(self->keymap, &key);
318 return origin < kBmpMax ? origin : 0xFFFF;
324 g_autoptr(FlKeyboardViewDelegate) view_delegate =
325 FL_KEYBOARD_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
326 if (view_delegate ==
nullptr) {
335 self->keycode_to_goals->end()) {
341 std::map<uint64_t, const LayoutGoal*> remaining_mandatory_goals =
342 *
self->logical_to_mandatory_goals;
344 #ifdef DEBUG_PRINT_LAYOUT
345 std::string debug_layout_data;
346 for (uint16_t keycode = 0; keycode < 128; keycode += 1) {
347 std::vector<uint16_t> this_key_clues = {
351 debug_format_layout_data(debug_layout_data, keycode, this_key_clues[0],
361 uint16_t keycode = keycode_goal.keycode;
362 std::vector<uint16_t> this_key_clues = {
374 for (uint16_t clue : this_key_clues) {
375 auto matching_goal = remaining_mandatory_goals.find(clue);
376 if (matching_goal != remaining_mandatory_goals.end()) {
379 self->derived_layout, group, keycode) == 0);
382 remaining_mandatory_goals.erase(matching_goal);
386 bool has_any_eascii =
387 is_eascii(this_key_clues[0]) || is_eascii(this_key_clues[1]);
392 auto found_us_layout =
self->keycode_to_goals->find(keycode);
393 if (found_us_layout != self->keycode_to_goals->end()) {
395 self->derived_layout, group, keycode,
396 found_us_layout->second->logical_key);
402 for (
const auto mandatory_goal_iter : remaining_mandatory_goals) {
403 const LayoutGoal* goal = mandatory_goal_iter.second;
410 FlKeyboardManager*
self = FL_KEYBOARD_MANAGER(
object);
412 g_cancellable_cancel(self->cancellable);
414 g_weak_ref_clear(&self->engine);
415 g_weak_ref_clear(&self->view_delegate);
417 self->keycode_to_goals.reset();
418 self->logical_to_mandatory_goals.reset();
420 g_clear_object(&self->key_embedder_responder);
421 g_clear_object(&self->key_channel_responder);
422 g_ptr_array_set_free_func(self->pending_responds, g_object_unref);
423 g_ptr_array_free(self->pending_responds,
TRUE);
424 g_ptr_array_free(self->pending_redispatches,
TRUE);
425 g_clear_object(&self->derived_layout);
426 if (self->keymap_keys_changed_cb_id != 0) {
427 g_signal_handler_disconnect(self->keymap, self->keymap_keys_changed_cb_id);
428 self->keymap_keys_changed_cb_id = 0;
430 g_clear_object(&self->cancellable);
432 G_OBJECT_CLASS(fl_keyboard_manager_parent_class)->dispose(
object);
442 self->keycode_to_goals =
443 std::make_unique<std::map<uint16_t, const LayoutGoal*>>();
444 self->logical_to_mandatory_goals =
445 std::make_unique<std::map<uint64_t, const LayoutGoal*>>();
447 (*
self->keycode_to_goals)[goal.keycode] = &goal;
448 if (goal.mandatory) {
449 (*
self->logical_to_mandatory_goals)[goal.logical_key] = &goal;
453 self->pending_responds = g_ptr_array_new();
454 self->pending_redispatches = g_ptr_array_new_with_free_func(g_object_unref);
456 self->keymap = gdk_keymap_get_for_display(gdk_display_get_default());
457 self->keymap_keys_changed_cb_id = g_signal_connect_swapped(
459 self->cancellable = g_cancellable_new();
464 FlKeyboardViewDelegate* view_delegate) {
465 g_return_val_if_fail(FL_IS_KEYBOARD_VIEW_DELEGATE(view_delegate),
nullptr);
467 FlKeyboardManager*
self = FL_KEYBOARD_MANAGER(
468 g_object_new(fl_keyboard_manager_get_type(),
nullptr));
470 g_weak_ref_init(&self->engine, engine);
471 g_weak_ref_init(&self->view_delegate, view_delegate);
474 [](
const FlutterKeyEvent* event, FlutterKeyEventCallback callback,
475 void* callback_user_data,
void* send_key_event_user_data) {
476 FlKeyboardManager*
self = FL_KEYBOARD_MANAGER(send_key_event_user_data);
477 if (self->send_key_event_handler !=
nullptr) {
478 self->send_key_event_handler(event, callback, callback_user_data,
479 self->send_key_event_handler_user_data);
481 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
482 if (engine !=
nullptr) {
484 FlutterKeyEventCallback callback;
485 void* callback_user_data;
487 SendKeyEventData* data = g_new0(SendKeyEventData, 1);
488 data->callback = callback;
489 data->callback_user_data = callback_user_data;
491 engine, event, self->cancellable,
492 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
493 g_autofree SendKeyEventData* data =
494 static_cast<SendKeyEventData*>(user_data);
495 gboolean handled = FALSE;
496 g_autoptr(GError) error = nullptr;
497 if (!fl_engine_send_key_event_finish(
498 FL_ENGINE(object), result, &handled, &error)) {
499 if (g_error_matches(error, G_IO_ERROR,
500 G_IO_ERROR_CANCELLED)) {
504 g_warning(
"Failed to send key event: %s", error->message);
507 if (data->callback !=
nullptr) {
508 data->callback(handled, data->callback_user_data);
516 self->key_channel_responder =
524 g_return_val_if_fail(FL_IS_KEYBOARD_MANAGER(
self), FALSE);
525 g_return_val_if_fail(event !=
nullptr, FALSE);
536 g_ptr_array_add(self->pending_responds, pending);
537 g_autoptr(FlKeyboardManagerData) data =
543 self->key_embedder_responder, event, specified_logical_key,
546 self->key_channel_responder, event, specified_logical_key,
553 g_return_val_if_fail(FL_IS_KEYBOARD_MANAGER(
self), FALSE);
554 return self->pending_responds->len == 0 &&
555 self->pending_redispatches->len == 0;
561 g_return_if_fail(FL_IS_KEYBOARD_MANAGER(
self));
563 self->key_embedder_responder,
state, event_time);
567 g_return_val_if_fail(FL_IS_KEYBOARD_MANAGER(
self),
nullptr);
568 if (self->get_pressed_state_handler !=
nullptr) {
569 return self->get_pressed_state_handler(
570 self->get_pressed_state_handler_user_data);
573 self->key_embedder_responder);
578 FlKeyboardManager*
self,
581 g_return_if_fail(FL_IS_KEYBOARD_MANAGER(
self));
582 self->send_key_event_handler = send_key_event_handler;
583 self->send_key_event_handler_user_data =
user_data;
587 FlKeyboardManager*
self,
590 g_return_if_fail(FL_IS_KEYBOARD_MANAGER(
self));
591 self->lookup_key_handler = lookup_key_handler;
592 self->lookup_key_handler_user_data =
user_data;
596 FlKeyboardManager*
self,
599 g_return_if_fail(FL_IS_KEYBOARD_MANAGER(
self));
600 self->redispatch_handler = redispatch_handler;
601 self->redispatch_handler_user_data =
user_data;
605 FlKeyboardManager*
self,
608 g_return_if_fail(FL_IS_KEYBOARD_MANAGER(
self));
609 self->get_pressed_state_handler = get_pressed_state_handler;
610 self->get_pressed_state_handler_user_data =
user_data;