• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_EVENT_KEY_EVENT_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_EVENT_KEY_EVENT_H
18 
19 #include <map>
20 
21 #include "core/event/ace_events.h"
22 #include "core/event/focus_axis_event.h"
23 #include "core/event/non_pointer_event.h"
24 
25 namespace OHOS::MMI {
26 class KeyEvent;
27 }
28 
29 namespace OHOS::Ace {
30 enum class ModifierKeyName {
31     /** Ctrl. */
32     ModifierKeyCtrl = 1 << 0,
33     /** Shift. */
34     ModifierKeyShift = 1 << 1,
35     /** Alt. */
36     ModifierKeyAlt = 1 << 2,
37     /** Fn. */
38     ModifierKeyFn = 1 << 3,
39 };
40 
41 uint64_t CalculateModifierKeyState(const std::vector<OHOS::Ace::KeyCode>& status);
42 
43 enum class KeyCode : int32_t {
44     KEY_UNKNOWN = -1,
45     KEY_FN = 0, // New
46     KEY_HOME = 1,
47     KEY_BACK = 2,
48     KEY_CALL = 3,
49     KEY_ENDCALL = 4,
50     KEY_CLEAR = 5,
51     KEY_HEADSETHOOK = 6,
52     KEY_FOCUS = 7,
53     KEY_NOTIFICATION = 8,
54     KEY_SEARCH = 9,
55     KEY_MEDIA_PLAY_PAUSE = 10,
56     KEY_MEDIA_STOP = 11,
57     KEY_MEDIA_NEXT = 12,
58     KEY_MEDIA_PREVIOUS = 13,
59     KEY_MEDIA_REWIND = 14,
60     KEY_MEDIA_FAST_FORWARD = 15,
61     KEY_VOLUME_UP = 16,
62     KEY_VOLUME_DOWN = 17,
63     KEY_POWER = 18,
64     KEY_CAMERA = 19,
65     KEY_VOICE_ASSISTANT = 20,
66     KEY_CUSTOM1 = 21,
67     KEY_VOLUME_MUTE = 22, // New
68     KEY_MUTE = 23,        // New
69     KEY_BRIGHTNESS_UP = 40,
70     KEY_BRIGHTNESS_DOWN = 41,
71     KEY_WEAR_1 = 1001,
72     KEY_0 = 2000,
73     KEY_1 = 2001,
74     KEY_2 = 2002,
75     KEY_3 = 2003,
76     KEY_4 = 2004,
77     KEY_5 = 2005,
78     KEY_6 = 2006,
79     KEY_7 = 2007,
80     KEY_8 = 2008,
81     KEY_9 = 2009,
82     KEY_STAR = 2010,
83     KEY_POUND = 2011,
84     KEY_DPAD_UP = 2012,
85     KEY_DPAD_DOWN = 2013,
86     KEY_DPAD_LEFT = 2014,
87     KEY_DPAD_RIGHT = 2015,
88     KEY_DPAD_CENTER = 2016,
89     KEY_A = 2017,
90     KEY_B = 2018,
91     KEY_C = 2019,
92     KEY_D = 2020,
93     KEY_E = 2021,
94     KEY_F = 2022,
95     KEY_G = 2023,
96     KEY_H = 2024,
97     KEY_I = 2025,
98     KEY_J = 2026,
99     KEY_K = 2027,
100     KEY_L = 2028,
101     KEY_M = 2029,
102     KEY_N = 2030,
103     KEY_O = 2031,
104     KEY_P = 2032,
105     KEY_Q = 2033,
106     KEY_R = 2034,
107     KEY_S = 2035,
108     KEY_T = 2036,
109     KEY_U = 2037,
110     KEY_V = 2038,
111     KEY_W = 2039,
112     KEY_X = 2040,
113     KEY_Y = 2041,
114     KEY_Z = 2042,
115     KEY_COMMA = 2043,
116     KEY_PERIOD = 2044,
117     KEY_ALT_LEFT = 2045,
118     KEY_ALT_RIGHT = 2046,
119     KEY_SHIFT_LEFT = 2047,
120     KEY_SHIFT_RIGHT = 2048,
121     KEY_TAB = 2049,
122     KEY_SPACE = 2050,
123     KEY_SYM = 2051,
124     KEY_EXPLORER = 2052,
125     KEY_ENVELOPE = 2053,
126     KEY_ENTER = 2054,
127     KEY_DEL = 2055,
128     KEY_GRAVE = 2056,
129     KEY_MINUS = 2057,
130     KEY_EQUALS = 2058,
131     KEY_LEFT_BRACKET = 2059,
132     KEY_RIGHT_BRACKET = 2060,
133     KEY_BACKSLASH = 2061,
134     KEY_SEMICOLON = 2062,
135     KEY_APOSTROPHE = 2063,
136     KEY_SLASH = 2064,
137     KEY_AT = 2065,
138     KEY_PLUS = 2066,
139     KEY_MENU = 2067,
140     KEY_PAGE_UP = 2068,
141     KEY_PAGE_DOWN = 2069,
142     KEY_ESCAPE = 2070,
143     KEY_FORWARD_DEL = 2071,
144     KEY_CTRL_LEFT = 2072,
145     KEY_CTRL_RIGHT = 2073,
146     KEY_CAPS_LOCK = 2074,
147     KEY_SCROLL_LOCK = 2075,
148     KEY_META_LEFT = 2076,
149     KEY_META_RIGHT = 2077,
150     KEY_FUNCTION = 2078,
151     KEY_SYSRQ = 2079,
152     KEY_BREAK = 2080,
153     KEY_MOVE_HOME = 2081,
154     KEY_MOVE_END = 2082,
155     KEY_INSERT = 2083,
156     KEY_FORWARD = 2084,
157     KEY_MEDIA_PLAY = 2085,
158     KEY_MEDIA_PAUSE = 2086,
159     KEY_MEDIA_CLOSE = 2087,
160     KEY_MEDIA_EJECT = 2088,
161     KEY_MEDIA_RECORD = 2089,
162     KEY_F1 = 2090,
163     KEY_F2 = 2091,
164     KEY_F3 = 2092,
165     KEY_F4 = 2093,
166     KEY_F5 = 2094,
167     KEY_F6 = 2095,
168     KEY_F7 = 2096,
169     KEY_F8 = 2097,
170     KEY_F9 = 2098,
171     KEY_F10 = 2099,
172     KEY_F11 = 2100,
173     KEY_F12 = 2101,
174     KEY_NUM_LOCK = 2102,
175     KEY_NUMPAD_0 = 2103,
176     KEY_NUMPAD_1 = 2104,
177     KEY_NUMPAD_2 = 2105,
178     KEY_NUMPAD_3 = 2106,
179     KEY_NUMPAD_4 = 2107,
180     KEY_NUMPAD_5 = 2108,
181     KEY_NUMPAD_6 = 2109,
182     KEY_NUMPAD_7 = 2110,
183     KEY_NUMPAD_8 = 2111,
184     KEY_NUMPAD_9 = 2112,
185     KEY_NUMPAD_DIVIDE = 2113,
186     KEY_NUMPAD_MULTIPLY = 2114,
187     KEY_NUMPAD_SUBTRACT = 2115,
188     KEY_NUMPAD_ADD = 2116,
189     KEY_NUMPAD_DOT = 2117,
190     KEY_NUMPAD_COMMA = 2118,
191     KEY_NUMPAD_ENTER = 2119,
192     KEY_NUMPAD_EQUALS = 2120,
193     KEY_NUMPAD_LEFT_PAREN = 2121,
194     KEY_NUMPAD_RIGHT_PAREN = 2122,
195     // New Start
196     KEY_VIRTUAL_MULTITASK = 2210,
197     KEY_BUTTON_A = 2301,
198     KEY_BUTTON_B = 2302,
199     KEY_BUTTON_C = 2303,
200     KEY_BUTTON_X = 2304,
201     KEY_BUTTON_Y = 2305,
202     KEY_BUTTON_Z = 2306,
203     KEY_BUTTON_L1 = 2307,
204     KEY_BUTTON_R1 = 2308,
205     KEY_BUTTON_L2 = 2309,
206     KEY_BUTTON_R2 = 2310,
207     KEY_BUTTON_SELECT = 2311,
208     KEY_BUTTON_START = 2312,
209     KEY_BUTTON_MODE = 2313,
210     KEY_BUTTON_THUMBL = 2314,
211     KEY_BUTTON_THUMBR = 2315,
212     KEY_BUTTON_TRIGGER = 2401,
213     KEY_BUTTON_THUMB = 2402,
214     KEY_BUTTON_THUMB2 = 2403,
215     KEY_BUTTON_TOP = 2404,
216     KEY_BUTTON_TOP2 = 2405,
217     KEY_BUTTON_PINKIE = 2406,
218     KEY_BUTTON_BASE1 = 2407,
219     KEY_BUTTON_BASE2 = 2408,
220     KEY_BUTTON_BASE3 = 2409,
221     KEY_BUTTON_BASE4 = 2410,
222     KEY_BUTTON_BASE5 = 2411,
223     KEY_BUTTON_BASE6 = 2412,
224     KEY_BUTTON_BASE7 = 2413,
225     KEY_BUTTON_BASE8 = 2414,
226     KEY_BUTTON_BASE9 = 2415,
227     KEY_BUTTON_DEAD = 2416,
228     KEY_SLEEP = 2600,
229     KEY_ZENKAKU_HANKAKU = 2601,
230     KEY_102ND = 2602,
231     KEY_RO = 2603,
232     KEY_KATAKANA = 2604,
233     KEY_HIRAGANA = 2605,
234     KEY_HENKAN = 2606,
235     KEY_KATAKANA_HIRAGANA = 2607,
236     KEY_MUHENKAN = 2608,
237     KEY_LINEFEED = 2609,
238     KEY_MACRO = 2610,
239     KEY_NUMPAD_PLUSMINUS = 2611,
240     KEY_SCALE = 2612,
241     KEY_HANGUEL = 2613,
242     KEY_HANJA = 2614,
243     KEY_YEN = 2615,
244     KEY_STOP = 2616,
245     KEY_AGAIN = 2617,
246     KEY_PROPS = 2618,
247     KEY_UNDO = 2619,
248     KEY_COPY = 2620,
249     KEY_OPEN = 2621,
250     KEY_PASTE = 2622,
251     KEY_FIND = 2623,
252     KEY_CUT = 2624,
253     KEY_HELP = 2625,
254     KEY_CALC = 2626,
255     KEY_FILE = 2627,
256     KEY_BOOKMARKS = 2628,
257     KEY_NEXT = 2629,
258     KEY_PLAYPAUSE = 2630,
259     KEY_PREVIOUS = 2631,
260     KEY_STOPCD = 2632,
261     KEY_CONFIG = 2634,
262     KEY_REFRESH = 2635,
263     KEY_EXIT = 2636,
264     KEY_EDIT = 2637,
265     KEY_SCROLLUP = 2638,
266     KEY_SCROLLDOWN = 2639,
267     KEY_NEW = 2640,
268     KEY_REDO = 2641,
269     KEY_CLOSE = 2642,
270     KEY_PLAY = 2643,
271     KEY_BASSBOOST = 2644,
272     KEY_PRINT = 2645,
273     KEY_CHAT = 2646,
274     KEY_FINANCE = 2647,
275     KEY_CANCEL = 2648,
276     KEY_KBDILLUM_TOGGLE = 2649,
277     KEY_KBDILLUM_DOWN = 2650,
278     KEY_KBDILLUM_UP = 2651,
279     KEY_SEND = 2652,
280     KEY_REPLY = 2653,
281     KEY_FORWARDMAIL = 2654,
282     KEY_SAVE = 2655,
283     KEY_DOCUMENTS = 2656,
284     KEY_VIDEO_NEXT = 2657,
285     KEY_VIDEO_PREV = 2658,
286     KEY_BRIGHTNESS_CYCLE = 2659,
287     KEY_BRIGHTNESS_ZERO = 2660,
288     KEY_DISPLAY_OFF = 2661,
289     KEY_BTN_MISC = 2662,
290     KEY_GOTO = 2663,
291     KEY_INFO = 2664,
292     KEY_PROGRAM = 2665,
293     KEY_PVR = 2666,
294     KEY_SUBTITLE = 2667,
295     KEY_FULL_SCREEN = 2668,
296     KEY_KEYBOARD = 2669,
297     KEY_ASPECT_RATIO = 2670,
298     KEY_PC = 2671,
299     KEY_TV = 2672,
300     KEY_TV2 = 2673,
301     KEY_VCR = 2674,
302     KEY_VCR2 = 2675,
303     KEY_SAT = 2676,
304     KEY_CD = 2677,
305     KEY_TAPE = 2678,
306     KEY_TUNER = 2679,
307     KEY_PLAYER = 2680,
308     KEY_DVD = 2681,
309     KEY_AUDIO = 2682,
310     KEY_VIDEO = 2683,
311     KEY_MEMO = 2684,
312     KEY_CALENDAR = 2685,
313     KEY_RED = 2686,
314     KEY_GREEN = 2687,
315     KEY_YELLOW = 2688,
316     KEY_BLUE = 2689,
317     KEY_CHANNELUP = 2690,
318     KEY_CHANNELDOWN = 2691,
319     KEY_LAST = 2692,
320     KEY_RESTART = 2693,
321     KEY_SLOW = 2694,
322     KEY_SHUFFLE = 2695,
323     KEY_VIDEOPHONE = 2696,
324     KEY_GAMES = 2697,
325     KEY_ZOOMIN = 2698,
326     KEY_ZOOMOUT = 2699,
327     KEY_ZOOMRESET = 2700,
328     KEY_WORDPROCESSOR = 2701,
329     KEY_EDITOR = 2702,
330     KEY_SPREADSHEET = 2703,
331     KEY_GRAPHICSEDITOR = 2704,
332     KEY_PRESENTATION = 2705,
333     KEY_DATABASE = 2706,
334     KEY_NEWS = 2707,
335     KEY_VOICEMAIL = 2708,
336     KEY_ADDRESSBOOK = 2709,
337     KEY_MESSENGER = 2710,
338     KEY_BRIGHTNESS_TOGGLE = 2711,
339     KEY_SPELLCHECK = 2712,
340     KEY_COFFEE = 2713,
341     KEY_MEDIA_REPEAT = 2714,
342     KEY_IMAGES = 2715,
343     KEY_BUTTONCONFIG = 2716,
344     KEY_TASKMANAGER = 2717,
345     KEY_JOURNAL = 2718,
346     KEY_CONTROLPANEL = 2719,
347     KEY_APPSELECT = 2720,
348     KEY_SCREENSAVER = 2721,
349     KEY_ASSISTANT = 2722,
350     KEY_KBD_LAYOUT_NEXT = 2723,
351     KEY_BRIGHTNESS_MIN = 2724,
352     KEY_BRIGHTNESS_MAX = 2725,
353     KEY_KBDINPUTASSIST_PREV = 2726,
354     KEY_KBDINPUTASSIST_NEXT = 2727,
355     KEY_KBDINPUTASSIST_PREVGROUP = 2728,
356     KEY_KBDINPUTASSIST_NEXTGROUP = 2729,
357     KEY_KBDINPUTASSIST_ACCEPT = 2730,
358     KEY_KBDINPUTASSIST_CANCEL = 2731,
359     KEY_FRONT = 2800,
360     KEY_SETUP = 2801,
361     KEY_WAKEUP = 2802,
362     KEY_SENDFILE = 2803,
363     KEY_DELETEFILE = 2804,
364     KEY_XFER = 2805,
365     KEY_PROG1 = 2806,
366     KEY_PROG2 = 2807,
367     KEY_MSDOS = 2808,
368     KEY_SCREENLOCK = 2809,
369     KEY_DIRECTION_ROTATE_DISPLAY = 2810,
370     KEY_CYCLEWINDOWS = 2811,
371     KEY_COMPUTER = 2812,
372     KEY_EJECTCLOSECD = 2813,
373     KEY_ISO = 2814,
374     KEY_MOVE = 2815,
375     KEY_F13 = 2816,
376     KEY_F14 = 2817,
377     KEY_F15 = 2818,
378     KEY_F16 = 2819,
379     KEY_F17 = 2820,
380     KEY_F18 = 2821,
381     KEY_F19 = 2822,
382     KEY_F20 = 2823,
383     KEY_F21 = 2824,
384     KEY_F22 = 2825,
385     KEY_F23 = 2826,
386     KEY_F24 = 2827,
387     KEY_PROG3 = 2828,
388     KEY_PROG4 = 2829,
389     KEY_DASHBOARD = 2830,
390     KEY_SUSPEND = 2831,
391     KEY_HP = 2832,
392     KEY_SOUND = 2833,
393     KEY_QUESTION = 2834,
394     KEY_CONNECT = 2836,
395     KEY_SPORT = 2837,
396     KEY_SHOP = 2838,
397     KEY_ALTERASE = 2839,
398     KEY_SWITCHVIDEOMODE = 2841,
399     KEY_BATTERY = 2842,
400     KEY_BLUETOOTH = 2843,
401     KEY_WLAN = 2844,
402     KEY_UWB = 2845,
403     KEY_WWAN_WIMAX = 2846,
404     KEY_RFKILL = 2847,
405     KEY_CHANNEL = 3001,
406     KEY_BTN_0 = 3100,
407     KEY_BTN_1 = 3101,
408     KEY_BTN_2 = 3102,
409     KEY_BTN_3 = 3103,
410     KEY_BTN_4 = 3104,
411     KEY_BTN_5 = 3105,
412     KEY_BTN_6 = 3106,
413     KEY_BTN_7 = 3107,
414     KEY_BTN_8 = 3108,
415     KEY_BTN_9 = 3109,
416     KEY_BRL_DOT1 = 3201,
417     KEY_BRL_DOT2 = 3202,
418     KEY_BRL_DOT3 = 3203,
419     KEY_BRL_DOT4 = 3204,
420     KEY_BRL_DOT5 = 3205,
421     KEY_BRL_DOT6 = 3206,
422     KEY_BRL_DOT7 = 3207,
423     KEY_BRL_DOT8 = 3208,
424     KEY_BRL_DOT9 = 3209,
425     KEY_BRL_DOT10 = 3210,
426     // New End
427     KEY_LEFT_KNOB_ROLL_UP = 10001,
428     KEY_LEFT_KNOB_ROLL_DOWN = 10002,
429     KEY_LEFT_KNOB = 10003,
430     KEY_RIGHT_KNOB_ROLL_UP = 10004,
431     KEY_RIGHT_KNOB_ROLL_DOWN = 10005,
432     KEY_RIGHT_KNOB = 10006,
433     KEY_VOICE_SOURCE_SWITCH = 10007,
434     KEY_LAUNCHER_MENU = 10008,
435 
436     TV_CONTROL_BACK = KEY_BACK,
437     TV_CONTROL_UP = KEY_DPAD_UP,
438     TV_CONTROL_DOWN = KEY_DPAD_DOWN,
439     TV_CONTROL_LEFT = KEY_DPAD_LEFT,
440     TV_CONTROL_RIGHT = KEY_DPAD_RIGHT,
441     TV_CONTROL_CENTER = KEY_DPAD_CENTER,
442     TV_CONTROL_ENTER = KEY_ENTER,
443     TV_CONTROL_MEDIA_PLAY = KEY_MEDIA_PLAY,
444 };
445 
446 enum class KeyAction : int32_t {
447     UNKNOWN = -1,
448     DOWN = 0,
449     UP = 1,
450     LONG_PRESS = 2,
451     CLICK = 3,
452 };
453 
454 constexpr int32_t ASCII_START_UPPER_CASE_LETTER = 65;
455 constexpr int32_t ASCII_START_LOWER_CASE_LETTER = 97;
456 
457 ACE_FORCE_EXPORT const char* KeyToString(int32_t code);
458 
459 struct KeyEvent final : public NonPointerEvent {
KeyEventfinal460     KeyEvent()
461     {
462         eventType = UIInputEventType::KEY;
463     }
KeyEventfinal464     KeyEvent(KeyCode code, KeyAction action, std::vector<KeyCode> pressedCodes, int32_t repeatTimeStamp,
465         TimeStamp timeStamp, int32_t metaKey, int64_t deviceIdNum, SourceType source, std::vector<uint8_t> enhanceData)
466         : code(code), action(action), pressedCodes(std::move(pressedCodes)), timeStamp(timeStamp), metaKey(metaKey),
467           enhanceData(enhanceData)
468     {
469         repeatTime = repeatTimeStamp;
470         deviceId = deviceIdNum;
471         sourceType = source;
472         eventType = UIInputEventType::KEY;
473     }
474     KeyEvent(KeyCode code, KeyAction action, int32_t repeatTime = 0, int64_t timeStamp = 0, int64_t deviceId = 0,
475         SourceType sourceType = SourceType::KEYBOARD)
476     {
477         std::vector<KeyCode> pCodes;
478         std::vector<uint8_t> enhanceData;
479         std::chrono::milliseconds milliseconds(timeStamp);
480         TimeStamp time(milliseconds);
481         new (this) KeyEvent(code, action, pCodes, repeatTime, time, 0, deviceId, sourceType, enhanceData);
482     }
483     ~KeyEvent() = default;
484 
SetTimeStampfinal485     void SetTimeStamp(int64_t timeInt)
486     {
487         std::chrono::milliseconds milliseconds(timeInt);
488         TimeStamp time(milliseconds);
489         timeStamp = time;
490     }
491 
HasKeyfinal492     bool HasKey(KeyCode expectCode) const
493     {
494         auto curPressedCode = pressedCodes.rbegin();
495         while (curPressedCode != pressedCodes.rend()) {
496             if (expectCode == *curPressedCode) {
497                 return true;
498             }
499             ++curPressedCode;
500         }
501         return false;
502     }
503 
IsExactlyKeyfinal504     bool IsExactlyKey(const std::vector<KeyCode>& expectCodes) const
505     {
506         auto pressedKeysCnt = pressedCodes.size();
507         if (std::find(pressedCodes.begin(), pressedCodes.end(), KeyCode::KEY_FN) != pressedCodes.end()) {
508             --pressedKeysCnt;
509         }
510         return (expectCodes.size() != pressedKeysCnt) ? false : IsKey(expectCodes);
511     }
512 
IsKeyfinal513     bool IsKey(const std::vector<KeyCode>& expectCodes) const
514     {
515         if (expectCodes.size() > pressedCodes.size() || pressedCodes.empty()) {
516             return false;
517         }
518         auto curExpectCode = expectCodes.crbegin();
519         auto curPressedCode = pressedCodes.crbegin();
520         while (curExpectCode != expectCodes.crend()) {
521             if (*curExpectCode != *curPressedCode) {
522                 return false;
523             }
524             ++curExpectCode;
525             ++curPressedCode;
526         }
527         return true;
528     }
529 
IsCtrlWithfinal530     bool IsCtrlWith(KeyCode expectCodes) const
531     {
532         return IsKey({ KeyCode::KEY_CTRL_LEFT, expectCodes }) || IsKey({ KeyCode::KEY_CTRL_RIGHT, expectCodes });
533     }
IsShiftWithfinal534     bool IsShiftWith(KeyCode expectCodes) const
535     {
536         return (HasKey(KeyCode::KEY_SHIFT_LEFT) || HasKey(KeyCode::KEY_SHIFT_RIGHT)) && HasKey(expectCodes);
537     }
IsExactlyShiftWithfinal538     bool IsExactlyShiftWith(KeyCode expectCodes) const
539     {
540         return IsExactlyKey({ KeyCode::KEY_SHIFT_LEFT, expectCodes }) ||
541             IsExactlyKey({ KeyCode::KEY_SHIFT_RIGHT, expectCodes });
542     }
IsNumberKeyfinal543     bool IsNumberKey() const
544     {
545         return ((KeyCode::KEY_0 <= code && code <= KeyCode::KEY_9) ||
546                 (KeyCode::KEY_NUMPAD_0 <= code && code <= KeyCode::KEY_NUMPAD_9));
547     }
IsDirectionalKeyfinal548     bool IsDirectionalKey() const
549     {
550         return KeyCode::KEY_DPAD_UP <= code && code <= KeyCode::KEY_DPAD_RIGHT;
551     }
IsLetterKeyfinal552     bool IsLetterKey() const
553     {
554         return (KeyCode::KEY_A <= code && code <= KeyCode::KEY_Z);
555     }
IsCombinationKeyfinal556     bool IsCombinationKey() const
557     {
558         return pressedCodes.size() > 1;
559     }
IsFunctionKeyfinal560     bool IsFunctionKey() const
561     {
562         return (KeyCode::KEY_F1 <= code && code <= KeyCode::KEY_F12) ||
563                (KeyCode::KEY_DPAD_UP <= code && code <= KeyCode::KEY_DPAD_RIGHT) || KeyCode::KEY_TAB == code;
564     }
IsEscapeKeyfinal565     bool IsEscapeKey() const
566     {
567         return KeyCode::KEY_ESCAPE == code;
568     }
IsPreImefinal569     bool IsPreIme() const
570     {
571         return isPreIme;
572     }
573 
574     std::string ConvertInputCodeToString() const;
575     std::string ConvertCodeToString() const;
576 
577     KeyCode code { KeyCode::KEY_UNKNOWN };
578     std::string key;
579     KeyAction action { KeyAction::UNKNOWN };
580     std::vector<KeyCode> pressedCodes;
581     // When the key is held down for a long period of time, it will be accumulated once in a while.
582     // Note that In the long press scene, you will receive a DOWN and an extra LONG_PRESS event. If you only want to
583     // identify the click event, you can use CLICK event.
584     TimeStamp timeStamp;
585     int32_t metaKey = 0;
586     KeyIntention keyIntention { KeyIntention::INTENTION_UNKNOWN };
587     bool enableCapsLock = false;
588     bool isPreIme = false;
589     bool isRedispatch = false;
590     bool numLock = false;
591     bool scrollLock = false;
592     uint32_t unicode = 0;
593     std::vector<uint8_t> enhanceData;
594     std::shared_ptr<MMI::KeyEvent> rawKeyEvent;
595     std::string msg = "";
596     std::optional<bool> activeMark;
597     int32_t targetDisplayId = 0;
598 
ToStringfinal599     std::string ToString() const
600     {
601         std::stringstream ss;
602         ss << "code=" << static_cast<int32_t>(code) << ", ";
603         ss << "action=" << static_cast<int32_t>(action) << ", ";
604         ss << "pressedCodes=[";
605         std::for_each(pressedCodes.begin(), pressedCodes.end(),
606             [&ss](const KeyCode& code) { ss << static_cast<int32_t>(code) << ", "; });
607         ss << "]" << ", ";
608         ss << "isPreIme = " << isPreIme;
609         return ss.str();
610     }
611 };
612 
613 class ACE_EXPORT KeyEventInfo : public BaseEventInfo {
DECLARE_RELATIONSHIP_OF_CLASSES(KeyEventInfo,BaseEventInfo)614     DECLARE_RELATIONSHIP_OF_CLASSES(KeyEventInfo, BaseEventInfo)
615 
616 public:
617     explicit KeyEventInfo(const KeyEvent& event) : BaseEventInfo("keyEvent")
618     {
619         keyCode_ = event.code;
620         keyText_ = event.key;
621         keyType_ = event.action;
622         keySource_ = event.sourceType;
623         keyIntention_ = event.keyIntention;
624         metaKey_ = event.metaKey;
625         SetDeviceId(event.deviceId);
626         SetTimeStamp(event.timeStamp);
627         keyMsg_ = event.msg;
628         SetPressedKeyCodes(event.pressedCodes);
629         unicode_ = event.unicode;
630         numLock_ = event.numLock;
631         capsLock_ = event.enableCapsLock;
632         scrollLock_ = event.scrollLock;
633         targetDisplayId_ = event.targetDisplayId;
634     };
635     ~KeyEventInfo() override = default;
636 
GetKeyType()637     KeyAction GetKeyType() const
638     {
639         return keyType_;
640     }
GetKeyCode()641     KeyCode GetKeyCode() const
642     {
643         return keyCode_;
644     }
GetKeyText()645     const std::string& GetKeyText() const
646     {
647         return keyText_;
648     }
GetMetaKey()649     int32_t GetMetaKey() const
650     {
651         return metaKey_;
652     }
GetKeySource()653     SourceType GetKeySource() const
654     {
655         return keySource_;
656     }
GetKeyIntention()657     KeyIntention GetKeyIntention() const
658     {
659         return keyIntention_;
660     }
661 
SetMetaKey(int32_t metaKey)662     void SetMetaKey(int32_t metaKey)
663     {
664         metaKey_ = metaKey;
665     }
666 
GetUnicode()667     uint32_t GetUnicode() const
668     {
669         return unicode_;
670     }
671 
GetNumLock()672     bool GetNumLock() const
673     {
674         return numLock_;
675     }
676 
GetCapsLock()677     bool GetCapsLock() const
678     {
679         return capsLock_;
680     }
681 
GetScrollLock()682     bool GetScrollLock() const
683     {
684         return scrollLock_;
685     }
686 
687     void ParseKeyEvent(KeyEvent& keyEvent);
688 
689 private:
690     KeyCode keyCode_ = KeyCode::KEY_UNKNOWN;
691     std::string keyText_ = "";
692     KeyAction keyType_ = KeyAction::UNKNOWN;
693     int32_t metaKey_ = 0;
694     SourceType keySource_ = SourceType::NONE;
695     KeyIntention keyIntention_ = KeyIntention::INTENTION_UNKNOWN;
696     std::string keyMsg_ = "";
697     uint32_t unicode_ = 0;
698     bool numLock_= false;
699     bool capsLock_ = false;
700     bool scrollLock_ = false;
701 };
702 
703 enum class BlurReason : int32_t {
704     FOCUS_SWITCH = 0,
705     WINDOW_BLUR = 1,
706     FRAME_DESTROY = 2, // frame node detached from main tree
707     VIEW_SWITCH = 3,
708     CLEAR_FOCUS = 4, // User api clearFocus triggered
709     BACK_TO_TABSTOP = 5,
710 };
711 
712 enum class FocusReason : int32_t {
713     DEFAULT = 0,
714     FOCUS_TRAVEL = 1,
715     FOCUS_TOUCH = 2,
716     WINDOW_FOCUS = 3,
717     VIEW_SWITCH = 4,
718 };
719 
720 using OnKeyEventFunc = std::function<bool(const KeyEvent&)>;
721 using OnKeyCallbackFunc = std::function<void(KeyEventInfo&)>;
722 using OnKeyConsumeFunc = std::function<bool(KeyEventInfo&)>;
723 using OnFocusFunc = std::function<void()>;
724 using OnClearFocusStateFunc = std::function<void()>;
725 using OnPaintFocusStateFunc = std::function<bool()>;
726 using OnBlurFunc = std::function<void()>;
727 using OnBlurReasonFunc = std::function<void(BlurReason reason)>;
728 using OnPreFocusFunc = std::function<void()>;
729 using OnKeyEventDispatchFunc = std::function<bool(KeyEventInfo&)>;
730 using OnFocusAxisEventFunc = std::function<void(NG::FocusAxisEventInfo&)>;
731 } // namespace OHOS::Ace
732 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_EVENT_KEY_EVENT_H
733