16
16
17
17
#include " key_event_channel.h"
18
18
19
+ #include < map>
20
+
19
21
#include " flutter/shell/platform/tizen/channels/navigation_channel.h"
20
22
#include " flutter/shell/platform/tizen/channels/text_input_plugin.h"
21
23
#include " flutter/shell/platform/tizen/logger.h"
@@ -24,47 +26,224 @@ static constexpr char kChannelName[] = "flutter/keyevent";
24
26
25
27
static constexpr char kKeyMapKey [] = " keymap" ;
26
28
static constexpr char kKeyCodeKey [] = " keyCode" ;
29
+ static constexpr char kScanCodeKey [] = " scanCode" ;
27
30
static constexpr char kTypeKey [] = " type" ;
28
31
static 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
+
32
35
static constexpr char kKeyUp [] = " keyup" ;
33
36
static constexpr char kKeyDown [] = " keydown" ;
34
-
37
+ static constexpr char kGtkToolkit [] = " gtk" ;
38
+ static constexpr char kLinuxKeyMap [] = " linux" ;
35
39
static constexpr char kPlatformBackButtonName [] = " XF86Back" ;
36
40
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
+
37
215
KeyEventChannel::KeyEventChannel (flutter::BinaryMessenger* messenger)
38
216
: channel_(
39
217
std::make_unique<flutter::BasicMessageChannel<rapidjson::Document>>(
40
218
messenger, kChannelName ,
41
219
&flutter::JsonMessageCodec::GetInstance ())) {
42
220
// register key down callback
43
- key_event_handlers .push_back (ecore_event_handler_add (
221
+ key_event_handlers_ .push_back (ecore_event_handler_add (
44
222
ECORE_EVENT_KEY_DOWN,
45
223
[](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);
47
225
auto self = reinterpret_cast <KeyEventChannel*>(data);
48
226
49
- if (strcmp (keyEvent ->keyname , kPlatformBackButtonName ) == 0 ) {
227
+ if (strcmp (key ->keyname , kPlatformBackButtonName ) == 0 ) {
50
228
// The device back button was pressed. Do nothing.
51
229
} else if (self->textInputPlugin_ &&
52
230
self->textInputPlugin_ ->isSoftwareKeyboardShowing ()) {
53
231
// Handled by software keyboard.
54
232
} else {
55
- self->OnKeyDown (keyEvent );
233
+ self->SendKeyEvent (key, true );
56
234
}
235
+
57
236
return ECORE_CALLBACK_PASS_ON;
58
237
},
59
238
this ));
60
239
// register key up callback
61
- key_event_handlers .push_back (ecore_event_handler_add (
240
+ key_event_handlers_ .push_back (ecore_event_handler_add (
62
241
ECORE_EVENT_KEY_UP,
63
242
[](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);
65
244
auto self = reinterpret_cast <KeyEventChannel*>(data);
66
245
67
- if (strcmp (keyEvent ->keyname , kPlatformBackButtonName ) == 0 ) {
246
+ if (strcmp (key ->keyname , kPlatformBackButtonName ) == 0 ) {
68
247
// The device back button was pressed.
69
248
if (self->navigation_channel_ ) {
70
249
self->navigation_channel_ ->PopRoute ();
@@ -73,45 +252,40 @@ KeyEventChannel::KeyEventChannel(flutter::BinaryMessenger* messenger)
73
252
self->textInputPlugin_ ->isSoftwareKeyboardShowing ()) {
74
253
// Handled by software keyboard.
75
254
} else {
76
- self->OnKeyUp (keyEvent );
255
+ self->SendKeyEvent (key, false );
77
256
}
257
+
78
258
return ECORE_CALLBACK_PASS_ON;
79
259
},
80
260
this ));
81
261
}
82
262
83
263
KeyEventChannel::~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 );
86
266
}
87
267
}
88
268
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
+ }
107
277
rapidjson::Document event (rapidjson::kObjectType );
108
278
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
+ }
116
290
channel_->Send (event);
117
291
}
0 commit comments