1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "flutter/shell/platform/windows/key_event_handler.h"
6
7 #include <windows.h>
8
9 #include <iostream>
10
11 #include "flutter/shell/platform/common/cpp/client_wrapper/include/flutter/json_message_codec.h"
12
13 static constexpr char kChannelName[] = "flutter/keyevent";
14
15 static constexpr char kKeyCodeKey[] = "keyCode";
16 static constexpr char kKeyMapKey[] = "keymap";
17 static constexpr char kTypeKey[] = "type";
18
19 static constexpr char kAndroidKeyMap[] = "android";
20 static constexpr char kKeyUp[] = "keyup";
21 static constexpr char kKeyDown[] = "keydown";
22
23 namespace flutter {
24
KeyEventHandler(flutter::BinaryMessenger * messenger)25 KeyEventHandler::KeyEventHandler(flutter::BinaryMessenger* messenger)
26 : channel_(
27 std::make_unique<flutter::BasicMessageChannel<rapidjson::Document>>(
28 messenger,
29 kChannelName,
30 &flutter::JsonMessageCodec::GetInstance())) {}
31
32 KeyEventHandler::~KeyEventHandler() = default;
33
CharHook(Win32FlutterWindow * window,unsigned int code_point)34 void KeyEventHandler::CharHook(Win32FlutterWindow* window,
35 unsigned int code_point) {}
36
KeyboardHook(Win32FlutterWindow * window,int key,int scancode,int action,int mods)37 void KeyEventHandler::KeyboardHook(Win32FlutterWindow* window,
38 int key,
39 int scancode,
40 int action,
41 int mods) {
42 // TODO: Translate to a cross-platform key code system rather than passing
43 // the native key code.
44 rapidjson::Document event(rapidjson::kObjectType);
45 auto& allocator = event.GetAllocator();
46 event.AddMember(kKeyCodeKey, key, allocator);
47 event.AddMember(kKeyMapKey, kAndroidKeyMap, allocator);
48
49 switch (action) {
50 case WM_KEYDOWN:
51 event.AddMember(kTypeKey, kKeyDown, allocator);
52 break;
53 case WM_KEYUP:
54 event.AddMember(kTypeKey, kKeyUp, allocator);
55 break;
56 default:
57 std::cerr << "Unknown key event action: " << action << std::endl;
58 return;
59 }
60 channel_->Send(event);
61 }
62
63 } // namespace flutter