From ce8b187914f599e8e579fab829671fb2f07064b7 Mon Sep 17 00:00:00 2001 From: Adam Barth Date: Tue, 15 Nov 2016 13:04:08 -0800 Subject: [PATCH] Add support for raw key events on Fuchsia (#3208) Fixes https://github.com/flutter/flutter/issues/6631 --- content_handler/BUILD.gn | 1 + content_handler/runtime_holder.cc | 32 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/content_handler/BUILD.gn b/content_handler/BUILD.gn index 64063828d..4b6370796 100644 --- a/content_handler/BUILD.gn +++ b/content_handler/BUILD.gn @@ -41,6 +41,7 @@ executable("content_handler") { "//lib/mtl", "//lib/tonic/mx", "//lib/zip", + "//third_party/rapidjson", "//third_party/skia", # TODO(abarth): We shouldn't need to depend on libdart_builtin but we fail diff --git a/content_handler/runtime_holder.cc b/content_handler/runtime_holder.cc index 0f3fdc275..ad81c8169 100644 --- a/content_handler/runtime_holder.cc +++ b/content_handler/runtime_holder.cc @@ -21,6 +21,9 @@ #include "lib/ftl/time/time_delta.h" #include "lib/tonic/mx/mx_converter.h" #include "lib/zip/create_unzipper.h" +#include "third_party/rapidjson/rapidjson/document.h" +#include "third_party/rapidjson/rapidjson/stringbuffer.h" +#include "third_party/rapidjson/rapidjson/writer.h" using tonic::DartConverter; using tonic::ToDart; @@ -271,6 +274,35 @@ void RuntimeHolder::OnEvent(mozart::EventPtr event, runtime_->DispatchPointerDataPacket(packet); handled = true; + } else if (event->key_data) { + const char* type = nullptr; + if (event->action == mozart::EventType::KEY_PRESSED) + type = "keydown"; + else if (event->action == mozart::EventType::KEY_RELEASED) + type = "keyup"; + + if (type) { + rapidjson::Document document; + auto& allocator = document.GetAllocator(); + document.SetObject(); + document.AddMember("type", rapidjson::Value(type, strlen(type)), + allocator); + document.AddMember("keymap", rapidjson::Value("fuchsia"), allocator); + document.AddMember("hidUsage", event->key_data->hid_usage, allocator); + document.AddMember("codePoint", event->key_data->code_point, allocator); + document.AddMember("modifiers", event->key_data->modifiers, allocator); + rapidjson::StringBuffer buffer; + rapidjson::Writer writer(buffer); + document.Accept(writer); + + const uint8_t* data = + reinterpret_cast(buffer.GetString()); + runtime_->DispatchPlatformMessage( + ftl::MakeRefCounted( + "flutter/keyevent", + std::vector(data, data + buffer.GetSize()), nullptr)); + handled = true; + } } callback(handled); } -- GitLab