1616
1717#include " key_event_channel.h"
1818
19+ #include < map>
20+
1921#include " flutter/shell/platform/tizen/channels/navigation_channel.h"
2022#include " flutter/shell/platform/tizen/channels/text_input_plugin.h"
2123#include " flutter/shell/platform/tizen/logger.h"
@@ -24,47 +26,224 @@ static constexpr char kChannelName[] = "flutter/keyevent";
2426
2527static constexpr char kKeyMapKey [] = " keymap" ;
2628static constexpr char kKeyCodeKey [] = " keyCode" ;
29+ static constexpr char kScanCodeKey [] = " scanCode" ;
2730static constexpr char kTypeKey [] = " type" ;
2831static constexpr char kModifiersKey [] = " modifiers" ;
29- static constexpr char kKeyNameKey [] = " keyName " ;
30- static constexpr char kComposeKey [] = " compose " ;
31- static constexpr char kTizenKeyMap [] = " tizen " ;
32+ static constexpr char kToolkitKey [] = " toolkit " ;
33+ static constexpr char kUnicodeScalarValuesKey [] = " unicodeScalarValues " ;
34+
3235static constexpr char kKeyUp [] = " keyup" ;
3336static constexpr char kKeyDown [] = " keydown" ;
34-
37+ static constexpr char kGtkToolkit [] = " gtk" ;
38+ static constexpr char kLinuxKeyMap [] = " linux" ;
3539static constexpr char kPlatformBackButtonName [] = " XF86Back" ;
3640
41+ // Mapping from physical (raw) key codes to logical (Gtk) key codes.
42+ static const std::map<int , int > kKeyCodeMap = {
43+ {0x00000009 , 65307 }, // LogicalKeyboardKey.escape
44+ {0x0000000a , 49 }, // LogicalKeyboardKey.digit1
45+ {0x0000000b , 50 }, // LogicalKeyboardKey.digit2
46+ {0x0000000c , 51 }, // LogicalKeyboardKey.digit3
47+ {0x0000000d , 52 }, // LogicalKeyboardKey.digit4
48+ {0x0000000e , 53 }, // LogicalKeyboardKey.digit5
49+ {0x0000000f , 54 }, // LogicalKeyboardKey.digit6
50+ {0x00000010 , 55 }, // LogicalKeyboardKey.digit7
51+ {0x00000011 , 56 }, // LogicalKeyboardKey.digit8
52+ {0x00000012 , 57 }, // LogicalKeyboardKey.digit9
53+ {0x00000013 , 48 }, // LogicalKeyboardKey.digit0
54+ {0x00000014 , 45 }, // LogicalKeyboardKey.minus
55+ {0x00000015 , 61 }, // LogicalKeyboardKey.equal
56+ {0x00000016 , 65288 }, // LogicalKeyboardKey.backspace
57+ {0x00000017 , 65289 }, // LogicalKeyboardKey.tab
58+ {0x00000018 , 81 }, // LogicalKeyboardKey.keyQ
59+ {0x00000019 , 87 }, // LogicalKeyboardKey.keyW
60+ {0x0000001a , 69 }, // LogicalKeyboardKey.keyE
61+ {0x0000001b , 82 }, // LogicalKeyboardKey.keyR
62+ {0x0000001c , 84 }, // LogicalKeyboardKey.keyT
63+ {0x0000001d , 89 }, // LogicalKeyboardKey.keyY
64+ {0x0000001e , 85 }, // LogicalKeyboardKey.keyU
65+ {0x0000001f , 73 }, // LogicalKeyboardKey.keyI
66+ {0x00000020 , 79 }, // LogicalKeyboardKey.keyO
67+ {0x00000021 , 80 }, // LogicalKeyboardKey.keyP
68+ {0x00000022 , 91 }, // LogicalKeyboardKey.bracketLeft
69+ {0x00000023 , 93 }, // LogicalKeyboardKey.bracketRight
70+ {0x00000024 , 65293 }, // LogicalKeyboardKey.enter
71+ {0x00000025 , 65507 }, // LogicalKeyboardKey.controlLeft
72+ {0x00000026 , 65 }, // LogicalKeyboardKey.keyA
73+ {0x00000027 , 83 }, // LogicalKeyboardKey.keyS
74+ {0x00000028 , 68 }, // LogicalKeyboardKey.keyD
75+ {0x00000029 , 70 }, // LogicalKeyboardKey.keyF
76+ {0x0000002a , 71 }, // LogicalKeyboardKey.keyG
77+ {0x0000002b , 72 }, // LogicalKeyboardKey.keyH
78+ {0x0000002c , 74 }, // LogicalKeyboardKey.keyJ
79+ {0x0000002d , 75 }, // LogicalKeyboardKey.keyK
80+ {0x0000002e , 76 }, // LogicalKeyboardKey.keyL
81+ {0x0000002f , 59 }, // LogicalKeyboardKey.semicolon
82+ {0x00000030 , 39 }, // LogicalKeyboardKey.quote
83+ {0x00000031 , 96 }, // LogicalKeyboardKey.backquote
84+ {0x00000032 , 65505 }, // LogicalKeyboardKey.shiftLeft
85+ {0x00000033 , 92 }, // LogicalKeyboardKey.backslash
86+ {0x00000034 , 90 }, // LogicalKeyboardKey.keyZ
87+ {0x00000035 , 88 }, // LogicalKeyboardKey.keyX
88+ {0x00000036 , 67 }, // LogicalKeyboardKey.keyC
89+ {0x00000037 , 86 }, // LogicalKeyboardKey.keyV
90+ {0x00000038 , 66 }, // LogicalKeyboardKey.keyB
91+ {0x00000039 , 78 }, // LogicalKeyboardKey.keyN
92+ {0x0000003a , 77 }, // LogicalKeyboardKey.keyM
93+ {0x0000003b , 44 }, // LogicalKeyboardKey.comma
94+ {0x0000003c , 46 }, // LogicalKeyboardKey.period
95+ {0x0000003d , 47 }, // LogicalKeyboardKey.slash
96+ {0x0000003e , 65506 }, // LogicalKeyboardKey.shiftRight
97+ {0x0000003f , 65450 }, // LogicalKeyboardKey.numpadMultiply
98+ {0x00000040 , 65513 }, // LogicalKeyboardKey.altLeft
99+ {0x00000041 , 32 }, // LogicalKeyboardKey.space
100+ {0x00000042 , 65509 }, // LogicalKeyboardKey.capsLock
101+ {0x00000043 , 65470 }, // LogicalKeyboardKey.f1
102+ {0x00000044 , 65471 }, // LogicalKeyboardKey.f2
103+ {0x00000045 , 65472 }, // LogicalKeyboardKey.f3
104+ {0x00000046 , 65473 }, // LogicalKeyboardKey.f4
105+ {0x00000047 , 65474 }, // LogicalKeyboardKey.f5
106+ {0x00000048 , 65475 }, // LogicalKeyboardKey.f6
107+ {0x00000049 , 65476 }, // LogicalKeyboardKey.f7
108+ {0x0000004a , 65477 }, // LogicalKeyboardKey.f8
109+ {0x0000004b , 65478 }, // LogicalKeyboardKey.f9
110+ {0x0000004c , 65479 }, // LogicalKeyboardKey.f10
111+ {0x0000004d , 65407 }, // LogicalKeyboardKey.numLock
112+ {0x0000004e , 65300 }, // LogicalKeyboardKey.scrollLock
113+ {0x0000004f , 65463 }, // LogicalKeyboardKey.numpad7
114+ {0x00000050 , 65464 }, // LogicalKeyboardKey.numpad8
115+ {0x00000051 , 65465 }, // LogicalKeyboardKey.numpad9
116+ {0x00000052 , 65453 }, // LogicalKeyboardKey.numpadSubtract
117+ {0x00000053 , 65460 }, // LogicalKeyboardKey.numpad4
118+ {0x00000054 , 65461 }, // LogicalKeyboardKey.numpad5
119+ {0x00000055 , 65462 }, // LogicalKeyboardKey.numpad6
120+ {0x00000056 , 65451 }, // LogicalKeyboardKey.numpadAdd
121+ {0x00000057 , 65457 }, // LogicalKeyboardKey.numpad1
122+ {0x00000058 , 65458 }, // LogicalKeyboardKey.numpad2
123+ {0x00000059 , 65459 }, // LogicalKeyboardKey.numpad3
124+ {0x0000005a , 65456 }, // LogicalKeyboardKey.numpad0
125+ {0x0000005b , 65454 }, // LogicalKeyboardKey.numpadDecimal
126+ {0x0000005f , 65480 }, // LogicalKeyboardKey.f11
127+ {0x00000060 , 65481 }, // LogicalKeyboardKey.f12
128+ {0x00000065 , 65406 }, // LogicalKeyboardKey.kanaMode
129+ {0x00000068 , 65421 }, // LogicalKeyboardKey.numpadEnter
130+ {0x00000069 , 65508 }, // LogicalKeyboardKey.controlRight
131+ {0x0000006a , 65455 }, // LogicalKeyboardKey.numpadDivide
132+ {0x0000006b , 64797 }, // LogicalKeyboardKey.printScreen
133+ {0x0000006c , 65514 }, // LogicalKeyboardKey.altRight
134+ {0x0000006e , 65360 }, // LogicalKeyboardKey.home
135+ {0x0000006f , 65362 }, // LogicalKeyboardKey.arrowUp
136+ {0x00000070 , 65365 }, // LogicalKeyboardKey.pageUp
137+ {0x00000071 , 65361 }, // LogicalKeyboardKey.arrowLeft
138+ {0x00000072 , 65363 }, // LogicalKeyboardKey.arrowRight
139+ {0x00000073 , 65367 }, // LogicalKeyboardKey.end
140+ {0x00000074 , 65364 }, // LogicalKeyboardKey.arrowDown
141+ {0x00000075 , 65366 }, // LogicalKeyboardKey.pageDown
142+ {0x00000076 , 65379 }, // LogicalKeyboardKey.insert
143+ {0x00000077 , 65535 }, // LogicalKeyboardKey.delete
144+ {0x00000079 , 269025042 }, // LogicalKeyboardKey.audioVolumeMute
145+ {0x0000007a , 269025041 }, // LogicalKeyboardKey.audioVolumeDown
146+ {0x0000007b , 269025043 }, // LogicalKeyboardKey.audioVolumeUp
147+ {0x0000007c , 269025066 }, // LogicalKeyboardKey.power
148+ {0x0000007d , 65469 }, // LogicalKeyboardKey.numpadEqual
149+ {0x0000007f , 65299 }, // LogicalKeyboardKey.pause
150+ {0x00000084 , 165 }, // LogicalKeyboardKey.intlYen
151+ {0x00000085 , 65511 }, // LogicalKeyboardKey.metaLeft
152+ {0x00000086 , 65512 }, // LogicalKeyboardKey.metaRight
153+ {0x00000087 , 65383 }, // LogicalKeyboardKey.contextMenu
154+ {0x00000088 , 269025064 }, // LogicalKeyboardKey.browserStop
155+ {0x0000008b , 65381 }, // LogicalKeyboardKey.undo
156+ {0x0000008c , 65376 }, // LogicalKeyboardKey.select
157+ {0x0000008d , 269025111 }, // LogicalKeyboardKey.copy
158+ {0x0000008e , 269025131 }, // LogicalKeyboardKey.open
159+ {0x0000008f , 269025133 }, // LogicalKeyboardKey.paste
160+ {0x00000090 , 65384 }, // LogicalKeyboardKey.find
161+ {0x00000092 , 65386 }, // LogicalKeyboardKey.help
162+ {0x00000096 , 269025071 }, // LogicalKeyboardKey.sleep
163+ {0x00000097 , 269025067 }, // LogicalKeyboardKey.wakeUp
164+ {0x0000009e , 269025070 }, // LogicalKeyboardKey.launchInternetBrowser
165+ {0x000000a3 , 269025049 }, // LogicalKeyboardKey.launchMail
166+ {0x000000a4 , 269025072 }, // LogicalKeyboardKey.browserFavorites
167+ {0x000000a6 , 269025062 }, // LogicalKeyboardKey.browserBack
168+ {0x000000a7 , 269025063 }, // LogicalKeyboardKey.browserForward
169+ {0x000000a9 , 269025068 }, // LogicalKeyboardKey.eject
170+ {0x000000ab , 269025047 }, // LogicalKeyboardKey.mediaTrackNext
171+ {0x000000ad , 269025046 }, // LogicalKeyboardKey.mediaTrackPrevious
172+ {0x000000ae , 269025045 }, // LogicalKeyboardKey.mediaStop
173+ {0x000000af , 269025052 }, // LogicalKeyboardKey.mediaRecord
174+ {0x000000b0 , 269025086 }, // LogicalKeyboardKey.mediaRewind
175+ {0x000000b1 , 269025134 }, // LogicalKeyboardKey.launchPhone
176+ {0x000000b4 , 269025048 }, // LogicalKeyboardKey.browserHome
177+ {0x000000b5 , 269025065 }, // LogicalKeyboardKey.browserRefresh
178+ {0x000000bd , 269025128 }, // LogicalKeyboardKey.newKey
179+ {0x000000be , 65382 }, // LogicalKeyboardKey.redo
180+ {0x000000bf , 65482 }, // LogicalKeyboardKey.f13
181+ {0x000000c0 , 65483 }, // LogicalKeyboardKey.f14
182+ {0x000000c1 , 65484 }, // LogicalKeyboardKey.f15
183+ {0x000000c2 , 65485 }, // LogicalKeyboardKey.f16
184+ {0x000000c3 , 65486 }, // LogicalKeyboardKey.f17
185+ {0x000000c4 , 65487 }, // LogicalKeyboardKey.f18
186+ {0x000000c5 , 65488 }, // LogicalKeyboardKey.f19
187+ {0x000000c6 , 65489 }, // LogicalKeyboardKey.f20
188+ {0x000000c7 , 65490 }, // LogicalKeyboardKey.f21
189+ {0x000000c8 , 65491 }, // LogicalKeyboardKey.f22
190+ {0x000000c9 , 65492 }, // LogicalKeyboardKey.f23
191+ {0x000000ca , 65493 }, // LogicalKeyboardKey.f24
192+ {0x000000d1 , 269025073 }, // LogicalKeyboardKey.mediaPause
193+ {0x000000d6 , 269025110 }, // LogicalKeyboardKey.close
194+ {0x000000d7 , 269025044 }, // LogicalKeyboardKey.mediaPlay
195+ {0x000000d8 , 269025175 }, // LogicalKeyboardKey.mediaFastForward
196+ {0x000000da , 65377 }, // LogicalKeyboardKey.print
197+ {0x000000e1 , 269025051 }, // LogicalKeyboardKey.browserSearch
198+ {0x000000e8 , 269025027 }, // LogicalKeyboardKey.brightnessDown
199+ {0x000000e9 , 269025026 }, // LogicalKeyboardKey.brightnessUp
200+ {0x000000ed , 269025030 }, // LogicalKeyboardKey.kbdIllumDown
201+ {0x000000ee , 269025029 }, // LogicalKeyboardKey.kbdIllumUp
202+ {0x000000ef , 269025147 }, // LogicalKeyboardKey.mailSend
203+ {0x000000f0 , 269025138 }, // LogicalKeyboardKey.mailReply
204+ {0x000000f1 , 269025168 }, // LogicalKeyboardKey.mailForward
205+ {0x000000f2 , 269025143 }, // LogicalKeyboardKey.save
206+ {0x00000190 , 269025170 }, // LogicalKeyboardKey.launchAudioBrowser
207+ {0x00000195 , 269025056 }, // LogicalKeyboardKey.launchCalendar
208+ {0x000001aa , 269025163 }, // LogicalKeyboardKey.zoomIn
209+ {0x000001ab , 269025164 }, // LogicalKeyboardKey.zoomOut
210+ {0x000001b8 , 269025148 }, // LogicalKeyboardKey.spellCheck
211+ {0x000001b9 , 269025121 }, // LogicalKeyboardKey.logOff
212+ {0x0000024d , 269025069 }, // LogicalKeyboardKey.launchScreenSaver
213+ };
214+
37215KeyEventChannel::KeyEventChannel (flutter::BinaryMessenger* messenger)
38216 : channel_(
39217 std::make_unique<flutter::BasicMessageChannel<rapidjson::Document>>(
40218 messenger, kChannelName ,
41219 &flutter::JsonMessageCodec::GetInstance ())) {
42220 // register key down callback
43- key_event_handlers .push_back (ecore_event_handler_add (
221+ key_event_handlers_ .push_back (ecore_event_handler_add (
44222 ECORE_EVENT_KEY_DOWN,
45223 [](void * data, int type, void * event) -> Eina_Bool {
46- Ecore_Event_Key* keyEvent = reinterpret_cast <Ecore_Event_Key*>(event);
224+ Ecore_Event_Key* key = reinterpret_cast <Ecore_Event_Key*>(event);
47225 auto self = reinterpret_cast <KeyEventChannel*>(data);
48226
49- if (strcmp (keyEvent ->keyname , kPlatformBackButtonName ) == 0 ) {
227+ if (strcmp (key ->keyname , kPlatformBackButtonName ) == 0 ) {
50228 // The device back button was pressed. Do nothing.
51229 } else if (self->textInputPlugin_ &&
52230 self->textInputPlugin_ ->isSoftwareKeyboardShowing ()) {
53231 // Handled by software keyboard.
54232 } else {
55- self->OnKeyDown (keyEvent );
233+ self->SendKeyEvent (key, true );
56234 }
235+
57236 return ECORE_CALLBACK_PASS_ON;
58237 },
59238 this ));
60239 // register key up callback
61- key_event_handlers .push_back (ecore_event_handler_add (
240+ key_event_handlers_ .push_back (ecore_event_handler_add (
62241 ECORE_EVENT_KEY_UP,
63242 [](void * data, int type, void * event) -> Eina_Bool {
64- Ecore_Event_Key* keyEvent = reinterpret_cast <Ecore_Event_Key*>(event);
243+ Ecore_Event_Key* key = reinterpret_cast <Ecore_Event_Key*>(event);
65244 auto self = reinterpret_cast <KeyEventChannel*>(data);
66245
67- if (strcmp (keyEvent ->keyname , kPlatformBackButtonName ) == 0 ) {
246+ if (strcmp (key ->keyname , kPlatformBackButtonName ) == 0 ) {
68247 // The device back button was pressed.
69248 if (self->navigation_channel_ ) {
70249 self->navigation_channel_ ->PopRoute ();
@@ -73,45 +252,40 @@ KeyEventChannel::KeyEventChannel(flutter::BinaryMessenger* messenger)
73252 self->textInputPlugin_ ->isSoftwareKeyboardShowing ()) {
74253 // Handled by software keyboard.
75254 } else {
76- self->OnKeyUp (keyEvent );
255+ self->SendKeyEvent (key, false );
77256 }
257+
78258 return ECORE_CALLBACK_PASS_ON;
79259 },
80260 this ));
81261}
82262
83263KeyEventChannel::~KeyEventChannel () {
84- for (auto event : key_event_handlers ) {
85- ecore_event_handler_del (event );
264+ for (auto handler : key_event_handlers_ ) {
265+ ecore_event_handler_del (handler );
86266 }
87267}
88268
89- void KeyEventChannel::OnKeyDown (Ecore_Event_Key* keyDownEvent) {
90- LoggerD (" OnKeyDown keyCode == %d, keyName == %s" , keyDownEvent->keycode ,
91- keyDownEvent->keyname );
92- rapidjson::Document event (rapidjson::kObjectType );
93- auto & allocator = event.GetAllocator ();
94- rapidjson::Value keyNameValue;
95- event.AddMember (kKeyMapKey , kTizenKeyMap , allocator);
96- event.AddMember (kTypeKey , kKeyDown , allocator);
97- event.AddMember (kKeyCodeKey , keyDownEvent->keycode , allocator);
98- event.AddMember (kModifiersKey , keyDownEvent->modifiers , allocator);
99- keyNameValue.SetString (keyDownEvent->keyname , allocator);
100- event.AddMember (kKeyNameKey , keyNameValue, allocator);
101- channel_->Send (event);
102- }
103-
104- void KeyEventChannel::OnKeyUp (Ecore_Event_Key* keyUpEvent) {
105- LoggerD (" OnKeyUp keyCode == %d, keyName == %s" , keyUpEvent->keycode ,
106- keyUpEvent->keyname );
269+ void KeyEventChannel::SendKeyEvent (Ecore_Event_Key* key, bool is_down) {
270+ LoggerD (" rawKeyCode = %x, keyName = %s, type = %s" , key->keycode ,
271+ key->keyname , is_down ? kKeyDown : kKeyUp );
272+ int scan_code = key->keycode ;
273+ int key_code = 0 ;
274+ if (kKeyCodeMap .count (scan_code) > 0 ) {
275+ key_code = kKeyCodeMap .at (scan_code);
276+ }
107277 rapidjson::Document event (rapidjson::kObjectType );
108278 auto & allocator = event.GetAllocator ();
109- rapidjson::Value keyNameValue;
110- event.AddMember (kKeyMapKey , kTizenKeyMap , allocator);
111- event.AddMember (kTypeKey , kKeyUp , allocator);
112- event.AddMember (kKeyCodeKey , keyUpEvent->keycode , allocator);
113- event.AddMember (kModifiersKey , keyUpEvent->modifiers , allocator);
114- keyNameValue.SetString (keyUpEvent->keyname , allocator);
115- event.AddMember (kKeyNameKey , keyNameValue, allocator);
279+ event.AddMember (kKeyMapKey , kLinuxKeyMap , allocator);
280+ event.AddMember (kToolkitKey , kGtkToolkit , allocator);
281+ event.AddMember (kUnicodeScalarValuesKey , 0 , allocator);
282+ event.AddMember (kKeyCodeKey , key_code, allocator);
283+ event.AddMember (kScanCodeKey , scan_code, allocator);
284+ event.AddMember (kModifiersKey , key->modifiers , allocator);
285+ if (is_down) {
286+ event.AddMember (kTypeKey , kKeyDown , allocator);
287+ } else {
288+ event.AddMember (kTypeKey , kKeyUp , allocator);
289+ }
116290 channel_->Send (event);
117291}
0 commit comments