Skip to content

Commit 73bc76c

Browse files
swift-kimbbrto21
authored andcommitted
Add physical to logical key mapping (#20)
1 parent d5b9405 commit 73bc76c

File tree

2 files changed

+215
-42
lines changed

2 files changed

+215
-42
lines changed

shell/platform/tizen/channels/key_event_channel.cc

Lines changed: 213 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
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

2527
static constexpr char kKeyMapKey[] = "keymap";
2628
static constexpr char kKeyCodeKey[] = "keyCode";
29+
static constexpr char kScanCodeKey[] = "scanCode";
2730
static constexpr char kTypeKey[] = "type";
2831
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+
3235
static constexpr char kKeyUp[] = "keyup";
3336
static constexpr char kKeyDown[] = "keydown";
34-
37+
static constexpr char kGtkToolkit[] = "gtk";
38+
static constexpr char kLinuxKeyMap[] = "linux";
3539
static 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+
37215
KeyEventChannel::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

83263
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);
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
}

shell/platform/tizen/channels/key_event_channel.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,9 @@ class KeyEventChannel {
4343

4444
private:
4545
std::unique_ptr<flutter::BasicMessageChannel<rapidjson::Document>> channel_;
46-
std::vector<Ecore_Event_Handler*> key_event_handlers;
46+
std::vector<Ecore_Event_Handler*> key_event_handlers_;
4747

48-
void OnKeyDown(Ecore_Event_Key* keyDownEvent);
49-
void OnKeyUp(Ecore_Event_Key* keyDownEvent);
48+
void SendKeyEvent(Ecore_Event_Key* key, bool is_down);
5049

5150
NavigationChannel* navigation_channel_;
5251
TextInputPlugin* textInputPlugin_;

0 commit comments

Comments
 (0)