Skip to content

Commit 9b8d8d8

Browse files
tumuyanBambooin
authored andcommitted
fix: some key with shift couldn't input in ascii mode
1 parent 6da7a58 commit 9b8d8d8

File tree

4 files changed

+84
-35
lines changed

4 files changed

+84
-35
lines changed

app/src/main/java/com/osfans/trime/ime/core/Trime.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -934,12 +934,15 @@ public boolean onRimeKey(int[] event) {
934934
private boolean composeEvent(@NonNull KeyEvent event) {
935935
final int keyCode = event.getKeyCode();
936936
if (keyCode == KeyEvent.KEYCODE_MENU) return false; // 不處理 Menu 鍵
937-
if (Keycode.Companion.hasSymbolLabel(keyCode)) return false; // 只處理安卓標準按鍵
937+
if (!Keycode.Companion.isStdKey(keyCode)) return false; // 只處理安卓標準按鍵
938938
if (event.getRepeatCount() == 0 && Key.isTrimeModifierKey(keyCode)) {
939939
boolean ret =
940940
onRimeKey(
941941
Event.getRimeEvent(
942-
keyCode, event.getAction() == KeyEvent.ACTION_DOWN ? 0 : Rime.META_RELEASE_ON));
942+
keyCode,
943+
event.getAction() == KeyEvent.ACTION_DOWN
944+
? event.getModifiers()
945+
: Rime.META_RELEASE_ON));
943946
if (isComposing()) setCandidatesViewShown(textInputManager.isComposable()); // 藍牙鍵盤打字時顯示候選欄
944947
return ret;
945948
}

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

+72
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package com.osfans.trime.ime.enums
22

33
import android.text.TextUtils
44
import android.view.KeyEvent
5+
import com.osfans.trime.ime.keyboard.Key
6+
import timber.log.Timber
57

68
enum class Keycode {
79
// 与原trime.yaml主题android_key/name小节相比,差异如下:
@@ -144,6 +146,52 @@ enum class Keycode {
144146
return keycode < A.ordinal && keycode > 0
145147
}
146148

149+
fun toStdKeyEvent(keycode: Int, mask: Int = 0): IntArray {
150+
var event = IntArray(2)
151+
if (keycode < 0 || keycode > values().size)
152+
return event
153+
if (keycode < A.ordinal) {
154+
event[0] = keycode
155+
event[1] = mask
156+
} else {
157+
if (keycode <= Z.ordinal)
158+
event[0] = keycode - A.ordinal + a.ordinal
159+
else if (keycode == exclam.ordinal)
160+
event[0] = _1.ordinal
161+
else if (keycode == dollar.ordinal)
162+
event[0] = _4.ordinal
163+
else if (keycode == percent.ordinal)
164+
event[0] = _5.ordinal
165+
else if (keycode == asciicircum.ordinal)
166+
event[0] = _6.ordinal
167+
else if (keycode == ampersand.ordinal)
168+
event[0] = _7.ordinal
169+
else if (keycode == quotedbl.ordinal)
170+
event[0] = apostrophe.ordinal
171+
else if (keycode == colon.ordinal)
172+
event[0] = semicolon.ordinal
173+
else if (keycode == less.ordinal)
174+
event[0] = comma.ordinal
175+
else if (keycode == greater.ordinal)
176+
event[0] = period.ordinal
177+
else if (keycode == question.ordinal)
178+
event[0] = slash.ordinal
179+
else if (keycode == underscore.ordinal)
180+
event[0] = minus.ordinal
181+
else if (keycode == braceleft.ordinal)
182+
event[0] = bracketleft.ordinal
183+
else if (keycode == braceright.ordinal)
184+
event[0] = bracketright.ordinal
185+
else if (keycode == asciitilde.ordinal)
186+
event[0] = grave.ordinal
187+
else if (keycode == bar.ordinal)
188+
event[0] = backslash.ordinal
189+
190+
event[1] = mask or KeyEvent.META_SHIFT_ON
191+
}
192+
return event
193+
}
194+
147195
fun hasSymbolLabel(keycode: Int): Boolean {
148196
if (keycode < 0 || keycode > values().size)
149197
return false
@@ -154,6 +202,30 @@ enum class Keycode {
154202
return reverseMap[keycode] ?: ""
155203
}
156204

205+
fun getDisplayLabel(keyCode: Int, mask: Int): String? {
206+
var s: String? = ""
207+
if (isStdKey(keyCode)) {
208+
// Android keycode区域
209+
if (Key.getKcm().isPrintingKey(keyCode)) {
210+
val event = KeyEvent(0, 0, KeyEvent.ACTION_DOWN, keyCode, 0, mask)
211+
val k = event.getUnicodeChar(mask)
212+
Timber.d("getDisplayLabel() keycode=$keyCode, mask=$mask, k=$k")
213+
if (k > 0) {
214+
s += k.toChar()
215+
} else {
216+
var c = Key.getKcm().getDisplayLabel(keyCode)
217+
if (Character.isUpperCase(c)) c = c.lowercaseChar()
218+
s = c.toString()
219+
}
220+
} else {
221+
s = keyNameOf(keyCode)
222+
}
223+
} else if (hasSymbolLabel(keyCode)) { // 可見符號
224+
s = getSymbolLabell(valueOf(keyCode))
225+
}
226+
return s
227+
}
228+
157229
private val masks = hashMapOf(
158230
"Shift" to KeyEvent.META_SHIFT_ON,
159231
"Control" to KeyEvent.META_CTRL_ON,

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

+1-26
Original file line numberDiff line numberDiff line change
@@ -229,35 +229,10 @@ private void parseLabel() {
229229
if (c == KeyEvent.KEYCODE_SPACE) {
230230
label = Rime.getSchemaName();
231231
} else {
232-
if (c > 0) label = getDisplayLabel(c);
232+
if (c > 0) label = Keycode.Companion.getDisplayLabel(c, mask);
233233
}
234234
}
235235

236-
public String getDisplayLabel(int keyCode) {
237-
String s = "";
238-
if (Keycode.Companion.isStdKey(keyCode)) {
239-
// Android keycode区域
240-
if (Key.getKcm().isPrintingKey(keyCode)) {
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-
}
252-
} else {
253-
s = Keycode.keyNameOf(keyCode);
254-
}
255-
} else if (Keycode.Companion.hasSymbolLabel(keyCode)) { // 可見符號
256-
s = Keycode.Companion.getSymbolLabell(Keycode.valueOf(keyCode));
257-
}
258-
return s;
259-
}
260-
261236
public static int getClickCode(String s) {
262237
int keyCode = -1;
263238
if (TextUtils.isEmpty(s)) { // 空鍵

app/src/main/java/com/osfans/trime/ime/text/TextInputManager.kt

+6-7
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import com.osfans.trime.ime.broadcast.IntentReceiver
1313
import com.osfans.trime.ime.core.EditorInstance
1414
import com.osfans.trime.ime.core.Speech
1515
import com.osfans.trime.ime.core.Trime
16-
import com.osfans.trime.ime.enums.Keycode
16+
import com.osfans.trime.ime.enums.Keycode.Companion.toStdKeyEvent
1717
import com.osfans.trime.ime.enums.SymbolKeyboardType
1818
import com.osfans.trime.ime.keyboard.Event
1919
import com.osfans.trime.ime.keyboard.Keyboard.printModifierKeyState
@@ -421,14 +421,13 @@ class TextInputManager private constructor() :
421421

422422
override fun onKey(keyEventCode: Int, metaState: Int) {
423423
printModifierKeyState(metaState, "keyEventCode=" + keyEventCode)
424+
425+
// 优先由librime处理按键事件
424426
if (trime.handleKey(keyEventCode, metaState)) return
425-
if (Keycode.hasSymbolLabel(keyEventCode)) {
426-
needSendUpRimeKey = false
427-
activeEditorInstance.commitText(Keycode.getSymbolLabell(Keycode.valueOf(keyEventCode)))
428-
return
429-
}
427+
// 大写字母和部分符号转换为Shift+Android keyevent
428+
val event = toStdKeyEvent(keyEventCode, metaState)
430429
needSendUpRimeKey = false
431-
activeEditorInstance.sendDownUpKeyEvent(keyEventCode, metaState)
430+
activeEditorInstance.sendDownUpKeyEvent(event[0], event[1])
432431
}
433432

434433
override fun onText(text: CharSequence?) {

0 commit comments

Comments
 (0)