• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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