Skip to content

Commit 6da7a58

Browse files
tumuyanBambooin
authored andcommitted
feat: change key label when shift key on
1 parent 23b6de4 commit 6da7a58

File tree

2 files changed

+73
-50
lines changed

2 files changed

+73
-50
lines changed

app/src/main/java/com/osfans/trime/ime/enums/Keycode.kt

+41-18
Original file line numberDiff line numberDiff line change
@@ -59,14 +59,18 @@ enum class Keycode {
5959

6060
companion object {
6161

62+
// librime keyname (x11) - trime keycode (兼容Android)
6263
private val convertMap: HashMap<String, Keycode> = hashMapOf()
64+
65+
// 部分符号的 trime keycode (兼容Android) - key label
6366
private val reverseMap: HashMap<Keycode, String> = hashMapOf()
6467

6568
init {
66-
for (type in Keycode.values()) {
69+
for (type in values()) {
6770
convertMap[type.toString()] = type
6871
}
6972

73+
// android keycode 包含的数字开头的按键
7074
reverseMap[_3D_MODE] = "3D_MODE"
7175
reverseMap[_0] = "0"
7276
reverseMap[_1] = "1"
@@ -81,19 +85,26 @@ enum class Keycode {
8185
reverseMap[_8] = "8"
8286
reverseMap[_9] = "9"
8387

84-
reverseMap[KP_0] = "0"
85-
reverseMap[KP_1] = "1"
86-
reverseMap[KP_2] = "2"
87-
reverseMap[KP_3] = "3"
88-
reverseMap[KP_4] = "4"
89-
reverseMap[KP_5] = "5"
90-
reverseMap[KP_6] = "6"
91-
reverseMap[KP_7] = "7"
92-
reverseMap[KP_8] = "8"
93-
reverseMap[KP_9] = "9"
94-
reverseMap[KP_8] = "8"
95-
reverseMap[KP_9] = "9"
96-
88+
// android keycode 已包含的符号
89+
reverseMap[grave] = "`"
90+
reverseMap[at] = "@"
91+
reverseMap[numbersign] = "#"
92+
reverseMap[asterisk] = "*"
93+
reverseMap[parenleft] = "("
94+
reverseMap[parenright] = ")"
95+
reverseMap[minus] = "-"
96+
reverseMap[equal] = "="
97+
reverseMap[plus] = "+"
98+
reverseMap[bracketleft] = "["
99+
reverseMap[bracketright] = "]"
100+
reverseMap[backslash] = "\\"
101+
reverseMap[semicolon] = ";"
102+
reverseMap[apostrophe] = "'"
103+
reverseMap[comma] = ","
104+
reverseMap[period] = "."
105+
reverseMap[slash] = "/"
106+
107+
// android keycode未包含的符号
97108
reverseMap[exclam] = "!"
98109
reverseMap[quotedbl] = "\""
99110
reverseMap[dollar] = "$"
@@ -113,18 +124,30 @@ enum class Keycode {
113124
reverseMap.forEach {
114125
convertMap[it.value] = it.key
115126
}
127+
128+
// android keycode 包含的小键盘,仅用于输出label,不用于label转按键
129+
reverseMap[KP_0] = "0"
130+
reverseMap[KP_1] = "1"
131+
reverseMap[KP_2] = "2"
132+
reverseMap[KP_3] = "3"
133+
reverseMap[KP_4] = "4"
134+
reverseMap[KP_5] = "5"
135+
reverseMap[KP_6] = "6"
136+
reverseMap[KP_7] = "7"
137+
reverseMap[KP_8] = "8"
138+
reverseMap[KP_9] = "9"
139+
reverseMap[KP_8] = "8"
140+
reverseMap[KP_9] = "9"
116141
}
117142

118143
fun isStdKey(keycode: Int): Boolean {
119-
return keycode < A.ordinal
144+
return keycode < A.ordinal && keycode > 0
120145
}
121146

122147
fun hasSymbolLabel(keycode: Int): Boolean {
123148
if (keycode < 0 || keycode > values().size)
124149
return false
125-
126-
return keycode >= A.ordinal ||
127-
(keycode >= KP_0.ordinal && keycode <= KP_9.ordinal)
150+
return keycode >= A.ordinal || reverseMap.containsKey(values()[keycode])
128151
}
129152

130153
fun getSymbolLabell(keycode: Keycode): String {

app/src/main/java/com/osfans/trime/ime/keyboard/Event.java

+32-32
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class Event {
3939
private int code;
4040
private int mask = 0;
4141
private String text;
42-
private String label;
42+
private String label, shiftLabel;
4343
private String preview;
4444
private List<?> states;
4545
private String command;
@@ -100,6 +100,20 @@ public Event(Keyboard keyboard, @NonNull String s) {
100100
text = s;
101101
label = labelPattern.matcher(s).replaceAll("");
102102
}
103+
104+
shiftLabel = label;
105+
if (Keycode.Companion.isStdKey(code)) { // Android keycode区域
106+
if (Key.getKcm().isPrintingKey(code)) {
107+
int mMask = KeyEvent.META_SHIFT_ON | mask;
108+
KeyEvent event = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, code, 0, mMask);
109+
int k = event.getUnicodeChar(mMask);
110+
Timber.d(
111+
"shiftLabel = " + shiftLabel + " keycode=" + code + ", mask=" + mMask + ", k=" + k);
112+
if (k > 0) {
113+
shiftLabel = "" + ((char) (k));
114+
}
115+
}
116+
}
103117
}
104118

105119
public Event(String s) {
@@ -179,6 +193,8 @@ else if (s.length() == 1
179193

180194
public String getLabel() {
181195
if (!TextUtils.isEmpty(toggle)) return (String) states.get(Rime.getOption(toggle) ? 1 : 0);
196+
if ((mKeyboard.getModifer() | mask & KeyEvent.META_SHIFT_ON) != 0)
197+
return adjustCase(shiftLabel);
182198
return adjustCase(label);
183199
}
184200

@@ -217,13 +233,22 @@ private void parseLabel() {
217233
}
218234
}
219235

220-
public static String getDisplayLabel(int keyCode) {
236+
public String getDisplayLabel(int keyCode) {
221237
String s = "";
222-
if (Keycode.Companion.isStdKey(keyCode)) { // 字母數字
238+
if (Keycode.Companion.isStdKey(keyCode)) {
239+
// Android keycode区域
223240
if (Key.getKcm().isPrintingKey(keyCode)) {
224-
char c = Key.getKcm().getDisplayLabel(keyCode);
225-
if (Character.isUpperCase(c)) c = Character.toLowerCase(c);
226-
s = String.valueOf(c);
241+
KeyEvent event = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, mask);
242+
int k = event.getUnicodeChar(mask);
243+
244+
Timber.d("getDisplayLabel() keycode=" + keyCode + ", mask=" + mask + ", k=" + k);
245+
if (k > 0) {
246+
s += ((char) (k));
247+
} else {
248+
char c = Key.getKcm().getDisplayLabel(keyCode);
249+
if (Character.isUpperCase(c)) c = Character.toLowerCase(c);
250+
s = String.valueOf(c);
251+
}
227252
} else {
228253
s = Keycode.keyNameOf(keyCode);
229254
}
@@ -237,10 +262,8 @@ public static int getClickCode(String s) {
237262
int keyCode = -1;
238263
if (TextUtils.isEmpty(s)) { // 空鍵
239264
keyCode = 0;
240-
} else if (Keycode.fromString(s) != Keycode.VoidSymbol) { // 字母數字
265+
} else if (Keycode.fromString(s) != Keycode.VoidSymbol) {
241266
keyCode = Keycode.keyCodeOf(s);
242-
} else if (symbolAliases.containsKey(s)) {
243-
keyCode = symbolAliases.get(s);
244267
}
245268
return keyCode;
246269
}
@@ -285,27 +308,4 @@ public boolean isAlt() {
285308
put("SYM", KeyEvent.META_SYM_ON);
286309
}
287310
};
288-
289-
private static final Map<String, Integer> symbolAliases =
290-
new HashMap<String, Integer>() {
291-
{
292-
put("#", KeyEvent.KEYCODE_POUND);
293-
put("'", KeyEvent.KEYCODE_APOSTROPHE);
294-
put("(", KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN);
295-
put(")", KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN);
296-
put("*", KeyEvent.KEYCODE_STAR);
297-
put("+", KeyEvent.KEYCODE_PLUS);
298-
put(",", KeyEvent.KEYCODE_COMMA);
299-
put("-", KeyEvent.KEYCODE_MINUS);
300-
put(".", KeyEvent.KEYCODE_PERIOD);
301-
put("/", KeyEvent.KEYCODE_SLASH);
302-
put(";", KeyEvent.KEYCODE_SEMICOLON);
303-
put("=", KeyEvent.KEYCODE_EQUALS);
304-
put("@", KeyEvent.KEYCODE_AT);
305-
put("\\", KeyEvent.KEYCODE_BACKSLASH);
306-
put("[", KeyEvent.KEYCODE_LEFT_BRACKET);
307-
put("`", KeyEvent.KEYCODE_GRAVE);
308-
put("]", KeyEvent.KEYCODE_RIGHT_BRACKET);
309-
}
310-
};
311311
}

0 commit comments

Comments
 (0)