1 /*
2 * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "core/event/key_event_recognizer.h"
17
18 namespace OHOS::Ace {
19 namespace {
20
21 constexpr int32_t LONG_PRESS_DURATION = 1;
22 constexpr int32_t KEY_INTENTION_OFFSET = 16;
23 constexpr int32_t KEY_INTENTION_ITEM_MIN_COUNT = 1;
24 constexpr int32_t KEY_INTENTION_ITEM_MAX_COUNT = 3;
25
26 // List Menu key on keyboard.
27 constexpr int64_t KEY_COMPOSE = 2466;
28
29 enum class CtrlKeysBit {
30 CTRL = 1,
31 SHIFT = 2,
32 ALT = 4,
33 META = 8,
34 };
35 }
36
KeyCodeToString(int32_t keyCode)37 const char* KeyCodeToString(int32_t keyCode)
38 {
39 const static std::map<KeyCode, std::string> KEYCODE_TO_STRING = {
40 {KeyCode::KEY_FN, "KEYCODE_FN"},
41 {KeyCode::KEY_UNKNOWN, "KEYCODE_UNKNOWN"},
42 {KeyCode::KEY_HOME, "KEYCODE_HOME"},
43 {KeyCode::KEY_BACK, "KEYCODE_BACK"},
44 {KeyCode::KEY_CALL, "KEYCODE_CALL"},
45 {KeyCode::KEY_ENDCALL, "KEYCODE_ENDCALL"},
46 {KeyCode::KEY_CLEAR, "KEYCODE_CLEAR"},
47 {KeyCode::KEY_HEADSETHOOK, "KEYCODE_HEADSETHOOK"},
48 {KeyCode::KEY_FOCUS, "KEYCODE_FOCUS"},
49 {KeyCode::KEY_NOTIFICATION, "KEYCODE_NOTIFICATION"},
50 {KeyCode::KEY_SEARCH, "KEYCODE_SEARCH"},
51 {KeyCode::KEY_MEDIA_PLAY_PAUSE, "KEYCODE_MEDIA_PLAY_PAUSE"},
52 {KeyCode::KEY_MEDIA_STOP, "KEYCODE_MEDIA_STOP"},
53 {KeyCode::KEY_MEDIA_NEXT, "KEYCODE_MEDIA_NEXT"},
54 {KeyCode::KEY_MEDIA_PREVIOUS, "KEYCODE_MEDIA_PREVIOUS"},
55 {KeyCode::KEY_MEDIA_REWIND, "KEYCODE_MEDIA_REWIND"},
56 {KeyCode::KEY_MEDIA_FAST_FORWARD, "KEYCODE_MEDIA_FAST_FORWARD"},
57 {KeyCode::KEY_VOLUME_UP, "KEYCODE_VOLUME_UP"},
58 {KeyCode::KEY_VOLUME_DOWN, "KEYCODE_VOLUME_DOWN"},
59 {KeyCode::KEY_POWER, "KEYCODE_POWER"},
60 {KeyCode::KEY_CAMERA, "KEYCODE_CAMERA"},
61 {KeyCode::KEY_VOICE_ASSISTANT, "KEYCODE_VOICE_ASSISTANT"},
62 {KeyCode::KEY_CUSTOM1, "KEYCODE_CUSTOM1"},
63 {KeyCode::KEY_VOLUME_MUTE, "KEYCODE_VOLUME_MUTE"},
64 {KeyCode::KEY_MUTE, "KEYCODE_MUTE"},
65 {KeyCode::KEY_BRIGHTNESS_UP, "KEYCODE_BRIGHTNESS_UP"},
66 {KeyCode::KEY_BRIGHTNESS_DOWN, "KEYCODE_BRIGHTNESS_DOWN"},
67 {KeyCode::KEY_WEAR_1, "KEYCODE_WEAR_1"},
68 {KeyCode::KEY_0, "KEYCODE_0"},
69 {KeyCode::KEY_1, "KEYCODE_1"},
70 {KeyCode::KEY_2, "KEYCODE_2"},
71 {KeyCode::KEY_3, "KEYCODE_3"},
72 {KeyCode::KEY_4, "KEYCODE_4"},
73 {KeyCode::KEY_5, "KEYCODE_5"},
74 {KeyCode::KEY_6, "KEYCODE_6"},
75 {KeyCode::KEY_7, "KEYCODE_7"},
76 {KeyCode::KEY_8, "KEYCODE_8"},
77 {KeyCode::KEY_9, "KEYCODE_9"},
78 {KeyCode::KEY_STAR, "KEYCODE_STAR"},
79 {KeyCode::KEY_POUND, "KEYCODE_POUND"},
80 {KeyCode::KEY_DPAD_UP, "KEYCODE_DPAD_UP"},
81 {KeyCode::KEY_DPAD_DOWN, "KEYCODE_DPAD_DOWN"},
82 {KeyCode::KEY_DPAD_LEFT, "KEYCODE_DPAD_LEFT"},
83 {KeyCode::KEY_DPAD_RIGHT, "KEYCODE_DPAD_RIGHT"},
84 {KeyCode::KEY_DPAD_CENTER, "KEYCODE_DPAD_CENTER"},
85 {KeyCode::KEY_A, "KEYCODE_A"},
86 {KeyCode::KEY_B, "KEYCODE_B"},
87 {KeyCode::KEY_C, "KEYCODE_C"},
88 {KeyCode::KEY_D, "KEYCODE_D"},
89 {KeyCode::KEY_E, "KEYCODE_E"},
90 {KeyCode::KEY_F, "KEYCODE_F"},
91 {KeyCode::KEY_G, "KEYCODE_G"},
92 {KeyCode::KEY_H, "KEYCODE_H"},
93 {KeyCode::KEY_I, "KEYCODE_I"},
94 {KeyCode::KEY_J, "KEYCODE_J"},
95 {KeyCode::KEY_K, "KEYCODE_K"},
96 {KeyCode::KEY_L, "KEYCODE_L"},
97 {KeyCode::KEY_M, "KEYCODE_M"},
98 {KeyCode::KEY_N, "KEYCODE_N"},
99 {KeyCode::KEY_O, "KEYCODE_O"},
100 {KeyCode::KEY_P, "KEYCODE_P"},
101 {KeyCode::KEY_Q, "KEYCODE_Q"},
102 {KeyCode::KEY_R, "KEYCODE_R"},
103 {KeyCode::KEY_S, "KEYCODE_S"},
104 {KeyCode::KEY_T, "KEYCODE_T"},
105 {KeyCode::KEY_U, "KEYCODE_U"},
106 {KeyCode::KEY_V, "KEYCODE_V"},
107 {KeyCode::KEY_W, "KEYCODE_W"},
108 {KeyCode::KEY_X, "KEYCODE_X"},
109 {KeyCode::KEY_Y, "KEYCODE_Y"},
110 {KeyCode::KEY_Z, "KEYCODE_Z"},
111 {KeyCode::KEY_COMMA, "KEYCODE_COMMA"},
112 {KeyCode::KEY_PERIOD, "KEYCODE_PERIOD"},
113 {KeyCode::KEY_ALT_LEFT, "KEYCODE_ALT_LEFT"},
114 {KeyCode::KEY_ALT_RIGHT, "KEYCODE_ALT_RIGHT"},
115 {KeyCode::KEY_SHIFT_LEFT, "KEYCODE_SHIFT_LEFT"},
116 {KeyCode::KEY_SHIFT_RIGHT, "KEYCODE_SHIFT_RIGHT"},
117 {KeyCode::KEY_TAB, "KEYCODE_TAB"},
118 {KeyCode::KEY_SPACE, "KEYCODE_SPACE"},
119 {KeyCode::KEY_SYM, "KEYCODE_SYM"},
120 {KeyCode::KEY_EXPLORER, "KEYCODE_EXPLORER"},
121 {KeyCode::KEY_ENVELOPE, "KEYCODE_ENVELOPE"},
122 {KeyCode::KEY_ENTER, "KEYCODE_ENTER"},
123 {KeyCode::KEY_DEL, "KEYCODE_DEL"},
124 {KeyCode::KEY_GRAVE, "KEYCODE_GRAVE"},
125 {KeyCode::KEY_MINUS, "KEYCODE_MINUS"},
126 {KeyCode::KEY_EQUALS, "KEYCODE_EQUALS"},
127 {KeyCode::KEY_LEFT_BRACKET, "KEYCODE_LEFT_BRACKET"},
128 {KeyCode::KEY_RIGHT_BRACKET, "KEYCODE_RIGHT_BRACKET"},
129 {KeyCode::KEY_BACKSLASH, "KEYCODE_BACKSLASH"},
130 {KeyCode::KEY_SEMICOLON, "KEYCODE_SEMICOLON"},
131 {KeyCode::KEY_APOSTROPHE, "KEYCODE_APOSTROPHE"},
132 {KeyCode::KEY_SLASH, "KEYCODE_SLASH"},
133 {KeyCode::KEY_AT, "KEYCODE_AT"},
134 {KeyCode::KEY_PLUS, "KEYCODE_PLUS"},
135 {KeyCode::KEY_MENU, "KEYCODE_MENU"},
136 {KeyCode::KEY_PAGE_UP, "KEYCODE_PAGE_UP"},
137 {KeyCode::KEY_PAGE_DOWN, "KEYCODE_PAGE_DOWN"},
138 {KeyCode::KEY_ESCAPE, "KEYCODE_ESCAPE"},
139 {KeyCode::KEY_FORWARD_DEL, "KEYCODE_FORWARD_DEL"},
140 {KeyCode::KEY_CTRL_LEFT, "KEYCODE_CTRL_LEFT"},
141 {KeyCode::KEY_CTRL_RIGHT, "KEYCODE_CTRL_RIGHT"},
142 {KeyCode::KEY_CAPS_LOCK, "KEYCODE_CAPS_LOCK"},
143 {KeyCode::KEY_SCROLL_LOCK, "KEYCODE_SCROLL_LOCK"},
144 {KeyCode::KEY_META_LEFT, "KEYCODE_META_LEFT"},
145 {KeyCode::KEY_META_RIGHT, "KEYCODE_META_RIGHT"},
146 {KeyCode::KEY_FUNCTION, "KEYCODE_FUNCTION"},
147 {KeyCode::KEY_SYSRQ, "KEYCODE_SYSRQ"},
148 {KeyCode::KEY_BREAK, "KEYCODE_BREAK"},
149 {KeyCode::KEY_MOVE_HOME, "KEYCODE_MOVE_HOME"},
150 {KeyCode::KEY_MOVE_END, "KEYCODE_MOVE_END"},
151 {KeyCode::KEY_INSERT, "KEYCODE_INSERT"},
152 {KeyCode::KEY_FORWARD, "KEYCODE_FORWARD"},
153 {KeyCode::KEY_MEDIA_PLAY, "KEYCODE_MEDIA_PLAY"},
154 {KeyCode::KEY_MEDIA_PAUSE, "KEYCODE_MEDIA_PAUSE"},
155 {KeyCode::KEY_MEDIA_CLOSE, "KEYCODE_MEDIA_CLOSE"},
156 {KeyCode::KEY_MEDIA_EJECT, "KEYCODE_MEDIA_EJECT"},
157 {KeyCode::KEY_MEDIA_RECORD, "KEYCODE_MEDIA_RECORD"},
158 {KeyCode::KEY_F1, "KEYCODE_F1"},
159 {KeyCode::KEY_F2, "KEYCODE_F2"},
160 {KeyCode::KEY_F3, "KEYCODE_F3"},
161 {KeyCode::KEY_F4, "KEYCODE_F4"},
162 {KeyCode::KEY_F5, "KEYCODE_F5"},
163 {KeyCode::KEY_F6, "KEYCODE_F6"},
164 {KeyCode::KEY_F7, "KEYCODE_F7"},
165 {KeyCode::KEY_F8, "KEYCODE_F8"},
166 {KeyCode::KEY_F9, "KEYCODE_F9"},
167 {KeyCode::KEY_F10, "KEYCODE_F10"},
168 {KeyCode::KEY_F11, "KEYCODE_F11"},
169 {KeyCode::KEY_F12, "KEYCODE_F12"},
170 {KeyCode::KEY_NUM_LOCK, "KEYCODE_NUM_LOCK"},
171 {KeyCode::KEY_NUMPAD_0, "KEYCODE_NUMPAD_0"},
172 {KeyCode::KEY_NUMPAD_1, "KEYCODE_NUMPAD_1"},
173 {KeyCode::KEY_NUMPAD_2, "KEYCODE_NUMPAD_2"},
174 {KeyCode::KEY_NUMPAD_3, "KEYCODE_NUMPAD_3"},
175 {KeyCode::KEY_NUMPAD_4, "KEYCODE_NUMPAD_4"},
176 {KeyCode::KEY_NUMPAD_5, "KEYCODE_NUMPAD_5"},
177 {KeyCode::KEY_NUMPAD_6, "KEYCODE_NUMPAD_6"},
178 {KeyCode::KEY_NUMPAD_7, "KEYCODE_NUMPAD_7"},
179 {KeyCode::KEY_NUMPAD_8, "KEYCODE_NUMPAD_8"},
180 {KeyCode::KEY_NUMPAD_9, "KEYCODE_NUMPAD_9"},
181 {KeyCode::KEY_NUMPAD_DIVIDE, "KEYCODE_NUMPAD_DIVIDE"},
182 {KeyCode::KEY_NUMPAD_MULTIPLY, "KEYCODE_NUMPAD_MULTIPLY"},
183 {KeyCode::KEY_NUMPAD_SUBTRACT, "KEYCODE_NUMPAD_SUBTRACT"},
184 {KeyCode::KEY_NUMPAD_ADD, "KEYCODE_NUMPAD_ADD"},
185 {KeyCode::KEY_NUMPAD_DOT, "KEYCODE_NUMPAD_DOT"},
186 {KeyCode::KEY_NUMPAD_COMMA, "KEYCODE_NUMPAD_COMMA"},
187 {KeyCode::KEY_NUMPAD_ENTER, "KEYCODE_NUMPAD_ENTER"},
188 {KeyCode::KEY_NUMPAD_EQUALS, "KEYCODE_NUMPAD_EQUALS"},
189 {KeyCode::KEY_NUMPAD_LEFT_PAREN, "KEYCODE_NUMPAD_LEFT_PAREN"},
190 {KeyCode::KEY_NUMPAD_RIGHT_PAREN, "KEYCODE_NUMPAD_RIGHT_PAREN"},
191 {KeyCode::KEY_VIRTUAL_MULTITASK, "KEYCODE_VIRTUAL_MULTITASK"},
192 {KeyCode::KEY_BUTTON_A, "KEYCODE_BUTTON_A"},
193 {KeyCode::KEY_BUTTON_B, "KEYCODE_BUTTON_B"},
194 {KeyCode::KEY_BUTTON_C, "KEYCODE_BUTTON_C"},
195 {KeyCode::KEY_BUTTON_X, "KEYCODE_BUTTON_X"},
196 {KeyCode::KEY_BUTTON_Y, "KEYCODE_BUTTON_Y"},
197 {KeyCode::KEY_BUTTON_Z, "KEYCODE_BUTTON_Z"},
198 {KeyCode::KEY_BUTTON_L1, "KEYCODE_BUTTON_L1"},
199 {KeyCode::KEY_BUTTON_R1, "KEYCODE_BUTTON_R1"},
200 {KeyCode::KEY_BUTTON_L2, "KEYCODE_BUTTON_L2"},
201 {KeyCode::KEY_BUTTON_R2, "KEYCODE_BUTTON_R2"},
202 {KeyCode::KEY_BUTTON_SELECT, "KEYCODE_BUTTON_SELECT"},
203 {KeyCode::KEY_BUTTON_START, "KEYCODE_BUTTON_START"},
204 {KeyCode::KEY_BUTTON_MODE, "KEYCODE_BUTTON_MODE"},
205 {KeyCode::KEY_BUTTON_THUMBL, "KEYCODE_BUTTON_THUMBL"},
206 {KeyCode::KEY_BUTTON_THUMBR, "KEYCODE_BUTTON_THUMBR"},
207 {KeyCode::KEY_BUTTON_TRIGGER, "KEYCODE_BUTTON_TRIGGER"},
208 {KeyCode::KEY_BUTTON_THUMB, "KEYCODE_BUTTON_THUMB"},
209 {KeyCode::KEY_BUTTON_THUMB2, "KEYCODE_BUTTON_THUMB2"},
210 {KeyCode::KEY_BUTTON_TOP, "KEYCODE_BUTTON_TOP"},
211 {KeyCode::KEY_BUTTON_TOP2, "KEYCODE_BUTTON_TOP2"},
212 {KeyCode::KEY_BUTTON_PINKIE, "KEYCODE_BUTTON_PINKIE"},
213 {KeyCode::KEY_BUTTON_BASE1, "KEYCODE_BUTTON_BASE1"},
214 {KeyCode::KEY_BUTTON_BASE2, "KEYCODE_BUTTON_BASE2"},
215 {KeyCode::KEY_BUTTON_BASE3, "KEYCODE_BUTTON_BASE3"},
216 {KeyCode::KEY_BUTTON_BASE4, "KEYCODE_BUTTON_BASE4"},
217 {KeyCode::KEY_BUTTON_BASE5, "KEYCODE_BUTTON_BASE5"},
218 {KeyCode::KEY_BUTTON_BASE6, "KEYCODE_BUTTON_BASE6"},
219 {KeyCode::KEY_BUTTON_BASE7, "KEYCODE_BUTTON_BASE7"},
220 {KeyCode::KEY_BUTTON_BASE8, "KEYCODE_BUTTON_BASE8"},
221 {KeyCode::KEY_BUTTON_BASE9, "KEYCODE_BUTTON_BASE9"},
222 {KeyCode::KEY_BUTTON_DEAD, "KEYCODE_BUTTON_DEAD"},
223 {KeyCode::KEY_SLEEP, "KEYCODE_SLEEP"},
224 {KeyCode::KEY_ZENKAKU_HANKAKU, "KEYCODE_ZENKAKU_HANKAKU"},
225 {KeyCode::KEY_102ND, "KEYCODE_102ND"},
226 {KeyCode::KEY_RO, "KEYCODE_RO"},
227 {KeyCode::KEY_KATAKANA, "KEYCODE_KATAKANA"},
228 {KeyCode::KEY_HIRAGANA, "KEYCODE_HIRAGANA"},
229 {KeyCode::KEY_HENKAN, "KEYCODE_HENKAN"},
230 {KeyCode::KEY_KATAKANA_HIRAGANA, "KEYCODE_KATAKANA_HIRAGANA"},
231 {KeyCode::KEY_MUHENKAN, "KEYCODE_MUHENKAN"},
232 {KeyCode::KEY_LINEFEED, "KEYCODE_LINEFEED"},
233 {KeyCode::KEY_MACRO, "KEYCODE_MACRO"},
234 {KeyCode::KEY_NUMPAD_PLUSMINUS, "KEYCODE_NUMPAD_PLUSMINUS"},
235 {KeyCode::KEY_SCALE, "KEYCODE_SCALE"},
236 {KeyCode::KEY_HANGUEL, "KEYCODE_HANGUEL"},
237 {KeyCode::KEY_HANJA, "KEYCODE_HANJA"},
238 {KeyCode::KEY_YEN, "KEYCODE_YEN"},
239 {KeyCode::KEY_STOP, "KEYCODE_STOP"},
240 {KeyCode::KEY_AGAIN, "KEYCODE_AGAIN"},
241 {KeyCode::KEY_PROPS, "KEYCODE_PROPS"},
242 {KeyCode::KEY_UNDO, "KEYCODE_UNDO"},
243 {KeyCode::KEY_COPY, "KEYCODE_COPY"},
244 {KeyCode::KEY_OPEN, "KEYCODE_OPEN"},
245 {KeyCode::KEY_PASTE, "KEYCODE_PASTE"},
246 {KeyCode::KEY_FIND, "KEYCODE_FIND"},
247 {KeyCode::KEY_CUT, "KEYCODE_CUT"},
248 {KeyCode::KEY_HELP, "KEYCODE_HELP"},
249 {KeyCode::KEY_CALC, "KEYCODE_CALC"},
250 {KeyCode::KEY_FILE, "KEYCODE_FILE"},
251 {KeyCode::KEY_BOOKMARKS, "KEYCODE_BOOKMARKS"},
252 {KeyCode::KEY_NEXT, "KEYCODE_NEXT"},
253 {KeyCode::KEY_PLAYPAUSE, "KEYCODE_PLAYPAUSE"},
254 {KeyCode::KEY_PREVIOUS, "KEYCODE_PREVIOUS"},
255 {KeyCode::KEY_STOPCD, "KEYCODE_STOPCD"},
256 {KeyCode::KEY_CONFIG, "KEYCODE_CONFIG"},
257 {KeyCode::KEY_REFRESH, "KEYCODE_REFRESH"},
258 {KeyCode::KEY_EXIT, "KEYCODE_EXIT"},
259 {KeyCode::KEY_EDIT, "KEYCODE_EDIT"},
260 {KeyCode::KEY_SCROLLUP, "KEYCODE_SCROLLUP"},
261 {KeyCode::KEY_SCROLLDOWN, "KEYCODE_SCROLLDOWN"},
262 {KeyCode::KEY_NEW, "KEYCODE_NEW"},
263 {KeyCode::KEY_REDO, "KEYCODE_REDO"},
264 {KeyCode::KEY_CLOSE, "KEYCODE_CLOSE"},
265 {KeyCode::KEY_PLAY, "KEYCODE_PLAY"},
266 {KeyCode::KEY_BASSBOOST, "KEYCODE_BASSBOOST"},
267 {KeyCode::KEY_PRINT, "KEYCODE_PRINT"},
268 {KeyCode::KEY_CHAT, "KEYCODE_CHAT"},
269 {KeyCode::KEY_FINANCE, "KEYCODE_FINANCE"},
270 {KeyCode::KEY_CANCEL, "KEYCODE_CANCEL"},
271 {KeyCode::KEY_KBDILLUM_TOGGLE, "KEYCODE_KBDILLUM_TOGGLE"},
272 {KeyCode::KEY_KBDILLUM_DOWN, "KEYCODE_KBDILLUM_DOWN"},
273 {KeyCode::KEY_KBDILLUM_UP, "KEYCODE_KBDILLUM_UP"},
274 {KeyCode::KEY_SEND, "KEYCODE_SEND"},
275 {KeyCode::KEY_REPLY, "KEYCODE_REPLY"},
276 {KeyCode::KEY_FORWARDMAIL, "KEYCODE_FORWARDMAIL"},
277 {KeyCode::KEY_SAVE, "KEYCODE_SAVE"},
278 {KeyCode::KEY_DOCUMENTS, "KEYCODE_DOCUMENTS"},
279 {KeyCode::KEY_VIDEO_NEXT, "KEYCODE_VIDEO_NEXT"},
280 {KeyCode::KEY_VIDEO_PREV, "KEYCODE_VIDEO_PREV"},
281 {KeyCode::KEY_BRIGHTNESS_CYCLE, "KEYCODE_BRIGHTNESS_CYCLE"},
282 {KeyCode::KEY_BRIGHTNESS_ZERO, "KEYCODE_BRIGHTNESS_ZERO"},
283 {KeyCode::KEY_DISPLAY_OFF, "KEYCODE_DISPLAY_OFF"},
284 {KeyCode::KEY_BTN_MISC, "KEYCODE_BTN_MISC"},
285 {KeyCode::KEY_GOTO, "KEYCODE_GOTO"},
286 {KeyCode::KEY_INFO, "KEYCODE_INFO"},
287 {KeyCode::KEY_PROGRAM, "KEYCODE_PROGRAM"},
288 {KeyCode::KEY_PVR, "KEYCODE_PVR"},
289 {KeyCode::KEY_SUBTITLE, "KEYCODE_SUBTITLE"},
290 {KeyCode::KEY_FULL_SCREEN, "KEYCODE_FULL_SCREEN"},
291 {KeyCode::KEY_KEYBOARD, "KEYCODE_KEYBOARD"},
292 {KeyCode::KEY_ASPECT_RATIO, "KEYCODE_ASPECT_RATIO"},
293 {KeyCode::KEY_PC, "KEYCODE_PC"},
294 {KeyCode::KEY_TV, "KEYCODE_TV"},
295 {KeyCode::KEY_TV2, "KEYCODE_TV2"},
296 {KeyCode::KEY_VCR, "KEYCODE_VCR"},
297 {KeyCode::KEY_VCR2, "KEYCODE_VCR2"},
298 {KeyCode::KEY_SAT, "KEYCODE_SAT"},
299 {KeyCode::KEY_CD, "KEYCODE_CD"},
300 {KeyCode::KEY_TAPE, "KEYCODE_TAPE"},
301 {KeyCode::KEY_TUNER, "KEYCODE_TUNER"},
302 {KeyCode::KEY_PLAYER, "KEYCODE_PLAYER"},
303 {KeyCode::KEY_DVD, "KEYCODE_DVD"},
304 {KeyCode::KEY_AUDIO, "KEYCODE_AUDIO"},
305 {KeyCode::KEY_VIDEO, "KEYCODE_VIDEO"},
306 {KeyCode::KEY_MEMO, "KEYCODE_MEMO"},
307 {KeyCode::KEY_CALENDAR, "KEYCODE_CALENDAR"},
308 {KeyCode::KEY_RED, "KEYCODE_RED"},
309 {KeyCode::KEY_GREEN, "KEYCODE_GREEN"},
310 {KeyCode::KEY_YELLOW, "KEYCODE_YELLOW"},
311 {KeyCode::KEY_BLUE, "KEYCODE_BLUE"},
312 {KeyCode::KEY_CHANNELUP, "KEYCODE_CHANNELUP"},
313 {KeyCode::KEY_CHANNELDOWN, "KEYCODE_CHANNELDOWN"},
314 {KeyCode::KEY_LAST, "KEYCODE_LAST"},
315 {KeyCode::KEY_RESTART, "KEYCODE_RESTART"},
316 {KeyCode::KEY_SLOW, "KEYCODE_SLOW"},
317 {KeyCode::KEY_SHUFFLE, "KEYCODE_SHUFFLE"},
318 {KeyCode::KEY_VIDEOPHONE, "KEYCODE_VIDEOPHONE"},
319 {KeyCode::KEY_GAMES, "KEYCODE_GAMES"},
320 {KeyCode::KEY_ZOOMIN, "KEYCODE_ZOOMIN"},
321 {KeyCode::KEY_ZOOMOUT, "KEYCODE_ZOOMOUT"},
322 {KeyCode::KEY_ZOOMRESET, "KEYCODE_ZOOMRESET"},
323 {KeyCode::KEY_WORDPROCESSOR, "KEYCODE_WORDPROCESSOR"},
324 {KeyCode::KEY_EDITOR, "KEYCODE_EDITOR"},
325 {KeyCode::KEY_SPREADSHEET, "KEYCODE_SPREADSHEET"},
326 {KeyCode::KEY_GRAPHICSEDITOR, "KEYCODE_GRAPHICSEDITOR"},
327 {KeyCode::KEY_PRESENTATION, "KEYCODE_PRESENTATION"},
328 {KeyCode::KEY_DATABASE, "KEYCODE_DATABASE"},
329 {KeyCode::KEY_NEWS, "KEYCODE_NEWS"},
330 {KeyCode::KEY_VOICEMAIL, "KEYCODE_VOICEMAIL"},
331 {KeyCode::KEY_ADDRESSBOOK, "KEYCODE_ADDRESSBOOK"},
332 {KeyCode::KEY_MESSENGER, "KEYCODE_MESSENGER"},
333 {KeyCode::KEY_BRIGHTNESS_TOGGLE, "KEYCODE_BRIGHTNESS_TOGGLE"},
334 {KeyCode::KEY_SPELLCHECK, "KEYCODE_SPELLCHECK"},
335 {KeyCode::KEY_COFFEE, "KEYCODE_COFFEE"},
336 {KeyCode::KEY_MEDIA_REPEAT, "KEYCODE_MEDIA_REPEAT"},
337 {KeyCode::KEY_IMAGES, "KEYCODE_IMAGES"},
338 {KeyCode::KEY_BUTTONCONFIG, "KEYCODE_BUTTONCONFIG"},
339 {KeyCode::KEY_TASKMANAGER, "KEYCODE_TASKMANAGER"},
340 {KeyCode::KEY_JOURNAL, "KEYCODE_JOURNAL"},
341 {KeyCode::KEY_CONTROLPANEL, "KEYCODE_CONTROLPANEL"},
342 {KeyCode::KEY_APPSELECT, "KEYCODE_APPSELECT"},
343 {KeyCode::KEY_SCREENSAVER, "KEYCODE_SCREENSAVER"},
344 {KeyCode::KEY_ASSISTANT, "KEYCODE_ASSISTANT"},
345 {KeyCode::KEY_KBD_LAYOUT_NEXT, "KEYCODE_KBD_LAYOUT_NEXT"},
346 {KeyCode::KEY_BRIGHTNESS_MIN, "KEYCODE_BRIGHTNESS_MIN"},
347 {KeyCode::KEY_BRIGHTNESS_MAX, "KEYCODE_BRIGHTNESS_MAX"},
348 {KeyCode::KEY_KBDINPUTASSIST_PREV, "KEYCODE_KBDINPUTASSIST_PREV"},
349 {KeyCode::KEY_KBDINPUTASSIST_NEXT, "KEYCODE_KBDINPUTASSIST_NEXT"},
350 {KeyCode::KEY_KBDINPUTASSIST_PREVGROUP, "KEYCODE_KBDINPUTASSIST_PREVGROUP"},
351 {KeyCode::KEY_KBDINPUTASSIST_NEXTGROUP, "KEYCODE_KBDINPUTASSIST_NEXTGROUP"},
352 {KeyCode::KEY_KBDINPUTASSIST_ACCEPT, "KEYCODE_KBDINPUTASSIST_ACCEPT"},
353 {KeyCode::KEY_KBDINPUTASSIST_CANCEL, "KEYCODE_KBDINPUTASSIST_CANCEL"},
354 {KeyCode::KEY_FRONT, "KEYCODE_FRONT"},
355 {KeyCode::KEY_SETUP, "KEYCODE_SETUP"},
356 {KeyCode::KEY_WAKEUP, "KEYCODE_WAKEUP"},
357 {KeyCode::KEY_SENDFILE, "KEYCODE_SENDFILE"},
358 {KeyCode::KEY_DELETEFILE, "KEYCODE_DELETEFILE"},
359 {KeyCode::KEY_XFER, "KEYCODE_XFER"},
360 {KeyCode::KEY_PROG1, "KEYCODE_PROG1"},
361 {KeyCode::KEY_PROG2, "KEYCODE_PROG2"},
362 {KeyCode::KEY_MSDOS, "KEYCODE_MSDOS"},
363 {KeyCode::KEY_SCREENLOCK, "KEYCODE_SCREENLOCK"},
364 {KeyCode::KEY_DIRECTION_ROTATE_DISPLAY, "KEYCODE_DIRECTION_ROTATE_DISPLAY"},
365 {KeyCode::KEY_CYCLEWINDOWS, "KEYCODE_CYCLEWINDOWS"},
366 {KeyCode::KEY_COMPUTER, "KEYCODE_COMPUTER"},
367 {KeyCode::KEY_EJECTCLOSECD, "KEYCODE_EJECTCLOSECD"},
368 {KeyCode::KEY_ISO, "KEYCODE_ISO"},
369 {KeyCode::KEY_MOVE, "KEYCODE_MOVE"},
370 {KeyCode::KEY_F13, "KEYCODE_F13"},
371 {KeyCode::KEY_F14, "KEYCODE_F14"},
372 {KeyCode::KEY_F15, "KEYCODE_F15"},
373 {KeyCode::KEY_F16, "KEYCODE_F16"},
374 {KeyCode::KEY_F17, "KEYCODE_F17"},
375 {KeyCode::KEY_F18, "KEYCODE_F18"},
376 {KeyCode::KEY_F19, "KEYCODE_F19"},
377 {KeyCode::KEY_F20, "KEYCODE_F20"},
378 {KeyCode::KEY_F21, "KEYCODE_F21"},
379 {KeyCode::KEY_F22, "KEYCODE_F22"},
380 {KeyCode::KEY_F23, "KEYCODE_F23"},
381 {KeyCode::KEY_F24, "KEYCODE_F24"},
382 {KeyCode::KEY_PROG3, "KEYCODE_PROG3"},
383 {KeyCode::KEY_PROG4, "KEYCODE_PROG4"},
384 {KeyCode::KEY_DASHBOARD, "KEYCODE_DASHBOARD"},
385 {KeyCode::KEY_SUSPEND, "KEYCODE_SUSPEND"},
386 {KeyCode::KEY_HP, "KEYCODE_HP"},
387 {KeyCode::KEY_SOUND, "KEYCODE_SOUND"},
388 {KeyCode::KEY_QUESTION, "KEYCODE_QUESTION"},
389 {KeyCode::KEY_CONNECT, "KEYCODE_CONNECT"},
390 {KeyCode::KEY_SPORT, "KEYCODE_SPORT"},
391 {KeyCode::KEY_SHOP, "KEYCODE_SHOP"},
392 {KeyCode::KEY_ALTERASE, "KEYCODE_ALTERASE"},
393 {KeyCode::KEY_SWITCHVIDEOMODE, "KEYCODE_SWITCHVIDEOMODE"},
394 {KeyCode::KEY_BATTERY, "KEYCODE_BATTERY"},
395 {KeyCode::KEY_BLUETOOTH, "KEYCODE_BLUETOOTH"},
396 {KeyCode::KEY_WLAN, "KEYCODE_WLAN"},
397 {KeyCode::KEY_UWB, "KEYCODE_UWB"},
398 {KeyCode::KEY_WWAN_WIMAX, "KEYCODE_WWAN_WIMAX"},
399 {KeyCode::KEY_RFKILL, "KEYCODE_RFKILL"},
400 {KeyCode::KEY_CHANNEL, "KEYCODE_CHANNEL"},
401 {KeyCode::KEY_BTN_0, "KEYCODE_BTN_0"},
402 {KeyCode::KEY_BTN_1, "KEYCODE_BTN_1"},
403 {KeyCode::KEY_BTN_2, "KEYCODE_BTN_2"},
404 {KeyCode::KEY_BTN_3, "KEYCODE_BTN_3"},
405 {KeyCode::KEY_BTN_4, "KEYCODE_BTN_4"},
406 {KeyCode::KEY_BTN_5, "KEYCODE_BTN_5"},
407 {KeyCode::KEY_BTN_6, "KEYCODE_BTN_6"},
408 {KeyCode::KEY_BTN_7, "KEYCODE_BTN_7"},
409 {KeyCode::KEY_BTN_8, "KEYCODE_BTN_8"},
410 {KeyCode::KEY_BTN_9, "KEYCODE_BTN_9"},
411 {KeyCode::KEY_BRL_DOT1, "KEYCODE_BRL_DOT1"},
412 {KeyCode::KEY_BRL_DOT2, "KEYCODE_BRL_DOT2"},
413 {KeyCode::KEY_BRL_DOT3, "KEYCODE_BRL_DOT3"},
414 {KeyCode::KEY_BRL_DOT4, "KEYCODE_BRL_DOT4"},
415 {KeyCode::KEY_BRL_DOT5, "KEYCODE_BRL_DOT5"},
416 {KeyCode::KEY_BRL_DOT6, "KEYCODE_BRL_DOT6"},
417 {KeyCode::KEY_BRL_DOT7, "KEYCODE_BRL_DOT7"},
418 {KeyCode::KEY_BRL_DOT8, "KEYCODE_BRL_DOT8"},
419 {KeyCode::KEY_BRL_DOT9, "KEYCODE_BRL_DOT9"},
420 {KeyCode::KEY_BRL_DOT10, "KEYCODE_BRL_DOT10"},
421 {KeyCode::KEY_LEFT_KNOB_ROLL_UP, "KEYCODE_LEFT_KNOB_ROLL_UP"},
422 {KeyCode::KEY_LEFT_KNOB_ROLL_DOWN, "KEYCODE_LEFT_KNOB_ROLL_DOWN"},
423 {KeyCode::KEY_LEFT_KNOB, "KEYCODE_LEFT_KNOB"},
424 {KeyCode::KEY_RIGHT_KNOB_ROLL_UP, "KEYCODE_RIGHT_KNOB_ROLL_UP"},
425 {KeyCode::KEY_RIGHT_KNOB_ROLL_DOWN, "KEYCODE_RIGHT_KNOB_ROLL_DOWN"},
426 {KeyCode::KEY_RIGHT_KNOB, "KEYCODE_RIGHT_KNOB"},
427 {KeyCode::KEY_VOICE_SOURCE_SWITCH, "KEYCODE_VOICE_SOURCE_SWITCH"},
428 {KeyCode::KEY_LAUNCHER_MENU, "KEYCODE_LAUNCHER_MENU"},
429 };
430 auto iter = KEYCODE_TO_STRING.find(static_cast<KeyCode>(keyCode));
431 if (iter == KEYCODE_TO_STRING.end()) {
432 return "KEYCODE_INVALID";
433 }
434 return iter->second.c_str();
435 }
keyItemsTransKeyIntention(const std::vector<KeyCode> & items)436 KeyIntention keyItemsTransKeyIntention(const std::vector<KeyCode> &items)
437 {
438 if (items.size() < KEY_INTENTION_ITEM_MIN_COUNT || items.size() > KEY_INTENTION_ITEM_MAX_COUNT) {
439 return KeyIntention::INTENTION_UNKNOWN;
440 }
441
442 uint64_t keyCodes = 0;
443 for (const auto &item : items) {
444 keyCodes = (keyCodes << KEY_INTENTION_OFFSET) + static_cast<uint64_t>(item);
445 }
446 const static std::map<int64_t, KeyIntention> MAP_KEY_INTENTION = {
447 {(int64_t)KeyCode::KEY_DPAD_UP, KeyIntention::INTENTION_UP},
448 {(int64_t)KeyCode::KEY_DPAD_DOWN, KeyIntention::INTENTION_DOWN},
449 {(int64_t)KeyCode::KEY_DPAD_LEFT, KeyIntention::INTENTION_LEFT},
450 {(int64_t)KeyCode::KEY_DPAD_RIGHT, KeyIntention::INTENTION_RIGHT},
451 {(int64_t)KeyCode::KEY_SPACE, KeyIntention::INTENTION_SELECT},
452 {(int64_t)KeyCode::KEY_NUMPAD_ENTER, KeyIntention::INTENTION_SELECT},
453 {(int64_t)KeyCode::KEY_ESCAPE, KeyIntention::INTENTION_ESCAPE},
454 {((int64_t)KeyCode::KEY_ALT_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_DPAD_LEFT,
455 KeyIntention::INTENTION_BACK},
456 {((int64_t)KeyCode::KEY_ALT_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_DPAD_RIGHT,
457 KeyIntention::INTENTION_FORWARD},
458 {((int64_t)KeyCode::KEY_ALT_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_DPAD_LEFT,
459 KeyIntention::INTENTION_BACK},
460 {((int64_t)KeyCode::KEY_ALT_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_DPAD_RIGHT,
461 KeyIntention::INTENTION_FORWARD},
462 {((int64_t)KeyCode::KEY_SHIFT_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_F10,
463 KeyIntention::INTENTION_MENU},
464 {((int64_t)KeyCode::KEY_SHIFT_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_F10,
465 KeyIntention::INTENTION_MENU},
466 {KEY_COMPOSE, KeyIntention::INTENTION_MENU},
467 {(int64_t)KeyCode::KEY_PAGE_UP, KeyIntention::INTENTION_PAGE_UP},
468 {(int64_t)KeyCode::KEY_PAGE_DOWN, KeyIntention::INTENTION_PAGE_DOWN},
469 {((int64_t)KeyCode::KEY_CTRL_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_PLUS,
470 KeyIntention::INTENTION_ZOOM_OUT},
471 {((int64_t)KeyCode::KEY_CTRL_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_PLUS,
472 KeyIntention::INTENTION_ZOOM_OUT},
473 {((int64_t)KeyCode::KEY_CTRL_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_NUMPAD_ADD,
474 KeyIntention::INTENTION_ZOOM_OUT},
475 {((int64_t)KeyCode::KEY_CTRL_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_NUMPAD_ADD,
476 KeyIntention::INTENTION_ZOOM_OUT},
477 {((int64_t)KeyCode::KEY_CTRL_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_MINUS,
478 KeyIntention::INTENTION_ZOOM_IN},
479 {((int64_t)KeyCode::KEY_CTRL_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_MINUS,
480 KeyIntention::INTENTION_ZOOM_IN},
481 {((int64_t)KeyCode::KEY_CTRL_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_NUMPAD_SUBTRACT,
482 KeyIntention::INTENTION_ZOOM_IN},
483 {((int64_t)KeyCode::KEY_CTRL_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_NUMPAD_SUBTRACT,
484 KeyIntention::INTENTION_ZOOM_IN},
485 {(int64_t)KeyCode::KEY_VOLUME_MUTE, KeyIntention::INTENTION_MEDIA_MUTE},
486 {(int64_t)KeyCode::KEY_MUTE, KeyIntention::INTENTION_MEDIA_MUTE},
487 {(int64_t)KeyCode::KEY_VOLUME_UP, KeyIntention::INTENTION_VOLUTE_UP},
488 {(int64_t)KeyCode::KEY_VOLUME_DOWN, KeyIntention::INTENTION_VOLUTE_DOWN},
489 {(int64_t)KeyCode::KEY_APPSELECT, KeyIntention::INTENTION_SELECT},
490 {(int64_t)KeyCode::KEY_BACK, KeyIntention::INTENTION_BACK},
491 {(int64_t)KeyCode::KEY_MOVE_HOME, KeyIntention::INTENTION_HOME},
492 };
493
494 auto iter = MAP_KEY_INTENTION.find(static_cast<int64_t>(keyCodes));
495 if (iter == MAP_KEY_INTENTION.end()) {
496 return KeyIntention::INTENTION_UNKNOWN;
497 }
498 return iter->second;
499 }
500
GetKeyEvents(int32_t keyCode,int32_t keyAction,int32_t repeatTime,int64_t timeStamp,int64_t timeStampStart,int32_t metaKey,int32_t keySource,int64_t deviceId,std::string msg)501 std::vector<KeyEvent> KeyEventRecognizer::GetKeyEvents(int32_t keyCode, int32_t keyAction, int32_t repeatTime,
502 int64_t timeStamp, int64_t timeStampStart, int32_t metaKey, int32_t keySource, int64_t deviceId,
503 std::string msg)
504 {
505 if (timeStamp == 0) {
506 timeStamp = clock();
507 }
508 std::vector<KeyEvent> keyEvents;
509 auto event = KeyEvent(static_cast<KeyCode>(keyCode), static_cast<KeyAction>(keyAction), repeatTime,
510 timeStamp, deviceId, static_cast<SourceType>(keySource));
511 if ((keyCode != static_cast<int32_t>(KeyCode::KEY_UNKNOWN)) &&
512 (keyAction == static_cast<int32_t>(KeyAction::DOWN))) {
513 clearPressedKey();
514 if (static_cast<uint32_t>(metaKey) & static_cast<uint32_t>(CtrlKeysBit::CTRL)) {
515 addPressedKey(static_cast<int32_t>(KeyCode::KEY_CTRL_LEFT));
516 }
517 if (static_cast<uint32_t>(metaKey) & static_cast<uint32_t>(CtrlKeysBit::SHIFT)) {
518 addPressedKey(static_cast<int32_t>(KeyCode::KEY_SHIFT_LEFT));
519 }
520 if (static_cast<uint32_t>(metaKey) & static_cast<uint32_t>(CtrlKeysBit::ALT)) {
521 addPressedKey(static_cast<int32_t>(KeyCode::KEY_ALT_LEFT));
522 }
523 addPressedKey(keyCode);
524 }
525 auto keyItems = getPressedKeys();
526 event.keyIntention = keyItemsTransKeyIntention(keyItems);
527 if ((keyCode != static_cast<int32_t>(KeyCode::KEY_UNKNOWN)) &&
528 (keyAction == static_cast<int32_t>(KeyAction::UP))) {
529 removeReleasedKey(keyCode);
530 }
531 event.pressedCodes = getPressedKeys();
532 event.key = KeyCodeToString(keyCode);
533 event.msg = msg;
534
535 keyEvents.emplace_back(event);
536 auto result = keyMap_.try_emplace(keyCode, false);
537 auto iter = result.first;
538
539 // Recognize long press event.
540 if ((keyAction == static_cast<int32_t>(KeyAction::DOWN)) && (repeatTime >= LONG_PRESS_DURATION) &&
541 (!iter->second)) {
542 iter->second = true;
543 keyEvents.emplace_back(KeyEvent(static_cast<KeyCode>(keyCode), KeyAction::LONG_PRESS, repeatTime, timeStamp,
544 deviceId, static_cast<SourceType>(keySource)));
545 }
546 // Recognize click event.
547 if (keyAction == static_cast<int32_t>(KeyAction::UP)) {
548 if (iter->second) {
549 iter->second = false;
550 } else {
551 keyEvents.emplace_back(KeyEvent(static_cast<KeyCode>(keyCode), KeyAction::CLICK, repeatTime, timeStamp,
552 deviceId, static_cast<SourceType>(keySource)));
553 }
554 }
555 return keyEvents;
556 }
557
getPressedKeys() const558 std::vector<KeyCode> KeyEventRecognizer::getPressedKeys() const
559 {
560 std::vector<KeyCode> result;
561 for (const auto &item : keys_) {
562 result.push_back(static_cast<KeyCode>(item));
563 }
564 return result;
565 }
addPressedKey(const int32_t keyCode)566 void KeyEventRecognizer::addPressedKey(const int32_t keyCode)
567 {
568 std::vector<KeyCode> pressedkeys = getPressedKeys();
569 std::vector<KeyCode>::iterator result = std::find(pressedkeys.begin(),
570 pressedkeys.end(), static_cast<KeyCode>(keyCode));
571 if (result == pressedkeys.end()) {
572 keys_.push_back(keyCode);
573 }
574 }
removeReleasedKey(const int32_t keyCode)575 void KeyEventRecognizer::removeReleasedKey(const int32_t keyCode)
576 {
577 for (auto it = keys_.begin(); it != keys_.end(); ++it) {
578 if (*it == keyCode) {
579 keys_.erase(it);
580 return;
581 }
582 }
583 }
clearPressedKey()584 void KeyEventRecognizer::clearPressedKey()
585 {
586 keys_.clear();
587 }
588 } // namespace OHOS::Ace
589