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