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