1 /*
2 * Copyright (c) 2022 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 "key_unicode_transformation.h"
17
18 #include "hos_key_event.h"
19
20 #undef MMI_LOG_DOMAIN
21 #define MMI_LOG_DOMAIN MMI_LOG_HANDLER
22 #undef MMI_LOG_TAG
23 #define MMI_LOG_TAG "KeyUnicodeTransformation"
24
25 namespace OHOS {
26 namespace MMI {
27 namespace {
28 struct KeyUnicode {
29 uint32_t original { 0 };
30 uint32_t transitioned { 0 };
31 };
32
33 constexpr uint32_t DEFAULT_UNICODE = 0x0000;
34
35 const std::map<int32_t, KeyUnicode> KEY_UNICODE_TRANSFORMATION = {
36 #ifndef OHOS_BUILD_ENABLE_WATCH
37 { HOS_KEY_A, { 0x0061, 0x0041 } },
38 { HOS_KEY_B, { 0x0062, 0x0042 } },
39 { HOS_KEY_C, { 0x0063, 0x0043 } },
40 { HOS_KEY_D, { 0x0064, 0x0044 } },
41 { HOS_KEY_E, { 0x0065, 0x0045 } },
42 { HOS_KEY_F, { 0x0066, 0x0046 } },
43 { HOS_KEY_G, { 0x0067, 0x0047 } },
44 { HOS_KEY_H, { 0x0068, 0x0048 } },
45 { HOS_KEY_I, { 0x0069, 0x0049 } },
46 { HOS_KEY_J, { 0x006A, 0x004A } },
47 { HOS_KEY_K, { 0x006B, 0x004B } },
48 { HOS_KEY_L, { 0x006C, 0x004C } },
49 { HOS_KEY_M, { 0x006D, 0x004D } },
50 { HOS_KEY_N, { 0x006E, 0x004E } },
51 { HOS_KEY_O, { 0x006F, 0x004F } },
52 { HOS_KEY_P, { 0x0070, 0x0050 } },
53 { HOS_KEY_Q, { 0x0071, 0x0051 } },
54 { HOS_KEY_R, { 0x0072, 0x0052 } },
55 { HOS_KEY_S, { 0x0073, 0x0053 } },
56 { HOS_KEY_T, { 0x0074, 0x0054 } },
57 { HOS_KEY_U, { 0x0075, 0x0055 } },
58 { HOS_KEY_V, { 0x0076, 0x0056 } },
59 { HOS_KEY_W, { 0x0077, 0x0057 } },
60 { HOS_KEY_X, { 0x0078, 0x0058 } },
61 { HOS_KEY_Y, { 0x0079, 0x0059 } },
62 { HOS_KEY_Z, { 0x007A, 0x005A } },
63 { HOS_KEY_0, { 0x0030, 0x0029 } },
64 { HOS_KEY_1, { 0x0031, 0x0021 } },
65 { HOS_KEY_2, { 0x0032, 0x0040 } },
66 { HOS_KEY_3, { 0x0033, 0x0023 } },
67 { HOS_KEY_4, { 0x0034, 0x0024 } },
68 { HOS_KEY_5, { 0x0035, 0x0025 } },
69 { HOS_KEY_6, { 0x0036, 0x005E } },
70 { HOS_KEY_7, { 0x0037, 0x0026 } },
71 { HOS_KEY_8, { 0x0038, 0x002A } },
72 { HOS_KEY_9, { 0x0039, 0x0028 } },
73 { HOS_KEY_GRAVE, { 0x0060, 0x007E } },
74 { HOS_KEY_MINUS, { 0x002D, 0x005F } },
75 { HOS_KEY_EQUALS, { 0x002B, 0x003D } },
76 { HOS_KEY_LEFT_BRACKET, { 0x005B, 0x007B } },
77 { HOS_KEY_RIGHT_BRACKET, { 0x005D, 0x007D } },
78 { HOS_KEY_BACKSLASH, { 0x005C, 0x007C } },
79 { HOS_KEY_SEMICOLON, { 0x003B, 0x003A } },
80 { HOS_KEY_APOSTROPHE, { 0x0027, 0x0022 } },
81 { HOS_KEY_SLASH, { 0x002F, 0x003F } },
82 { HOS_KEY_COMMA, { 0x002C, 0x003C } },
83 { HOS_KEY_PERIOD, { 0x002E, 0x003E } },
84 { HOS_KEY_NUMPAD_0, { 0x0030, 0x0000 } },
85 { HOS_KEY_NUMPAD_1, { 0x0031, 0x0000 } },
86 { HOS_KEY_NUMPAD_2, { 0x0032, 0x0000 } },
87 { HOS_KEY_NUMPAD_3, { 0x0033, 0x0000 } },
88 { HOS_KEY_NUMPAD_4, { 0x0034, 0x0000 } },
89 { HOS_KEY_NUMPAD_5, { 0x0035, 0x0000 } },
90 { HOS_KEY_NUMPAD_6, { 0x0036, 0x0000 } },
91 { HOS_KEY_NUMPAD_7, { 0x0037, 0x0000 } },
92 { HOS_KEY_NUMPAD_8, { 0x0038, 0x0000 } },
93 { HOS_KEY_NUMPAD_9, { 0x0039, 0x0000 } },
94 { HOS_KEY_NUMPAD_DIVIDE, { 0x002F, 0x0000 } },
95 { HOS_KEY_NUMPAD_MULTIPLY, { 0x0038, 0x0000 } },
96 { HOS_KEY_NUMPAD_SUBTRACT, { 0x002D, 0x0000 } },
97 { HOS_KEY_NUMPAD_ADD, { 0x002B, 0x0000 } },
98 { HOS_KEY_NUMPAD_DOT, { 0x002E, 0x0000 } }
99 #endif // OHOS_BUILD_ENABLE_WATCH
100 };
101 } // namespace
102
IsShiftPressed(std::shared_ptr<KeyEvent> keyEvent)103 bool IsShiftPressed(std::shared_ptr<KeyEvent> keyEvent)
104 {
105 CHKPF(keyEvent);
106 auto pressedKeys = keyEvent->GetPressedKeys();
107 for (auto iter = pressedKeys.cbegin(); iter != pressedKeys.cend(); ++iter) {
108 if ((*iter == HOS_KEY_SHIFT_LEFT) || (*iter == HOS_KEY_SHIFT_RIGHT)) {
109 return true;
110 }
111 }
112 return false;
113 }
114
KeyCodeToUnicode(int32_t keyCode,std::shared_ptr<KeyEvent> keyEvent)115 uint32_t KeyCodeToUnicode(int32_t keyCode, std::shared_ptr<KeyEvent> keyEvent)
116 {
117 CHKPR(keyEvent, DEFAULT_UNICODE);
118 auto iter = KEY_UNICODE_TRANSFORMATION.find(keyCode);
119 if (iter == KEY_UNICODE_TRANSFORMATION.end()) {
120 return DEFAULT_UNICODE;
121 }
122 const KeyUnicode &keyUnicode = iter->second;
123 bool isCapsEnable = keyEvent->GetFunctionKey(KeyEvent::CAPS_LOCK_FUNCTION_KEY);
124 bool isShiftPress = IsShiftPressed(keyEvent);
125 if (keyCode >= HOS_KEY_A && keyCode <= HOS_KEY_Z) {
126 if (isShiftPress) {
127 isCapsEnable = !isCapsEnable;
128 }
129 if (isCapsEnable) {
130 return keyUnicode.transitioned;
131 }
132 } else {
133 if (isShiftPress) {
134 return keyUnicode.transitioned;
135 }
136 }
137 return keyUnicode.original;
138 }
139 } // namespace MMI
140 } // namespace OHOS