Skip to content

Commit 4ca7f75

Browse files
committed
微調整し、見易さも改善
キーボード deviceId が消えないようにしたり モディファイア単体は無視しつつ、printable でないキーに対応したり そのために unicode 文字にできないキーは keyCode をそのまま保持するようにしたり その過程で定数を見えやすくしたり Int.toChar ではなく Char(Int) に統一したり
1 parent c02ac93 commit 4ca7f75

16 files changed

Lines changed: 85 additions & 82 deletions

File tree

app/src/androidTest/java/jp/deadend/noname/skk/SKKSettingsActivityUITest.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ class SKKSettingsActivityUITest {
200200

201201
@Test
202202
fun testHardKeyFragment() {
203-
assert(skkPrefs.kanaKey == 4 shl 28 /* CTRL */ or 'j'.code)
203+
assert(skkPrefs.kanaKey == CTRL_PRESSED or 'j'.code)
204204
onView(withText("ハードウェアキーボードの設定")).perform(click())
205205

206206
// かなキー (CTRL+J -> TAB)
@@ -253,7 +253,7 @@ class SKKSettingsActivityUITest {
253253
)
254254
}
255255
onView(withText("全角英数キー")).check(matches(hasSibling(withText("SHIFT+Z"))))
256-
assert(skkPrefs.zenkakuKey == 1 shl 28 /* SHIFT */ or 'z'.code)
256+
assert(skkPrefs.zenkakuKey == SHIFT_PRESSED or 'z'.code)
257257

258258
// Abbrevキー (SLASH -> PERIOD)
259259
onView(withText("Abbrevキー"))
@@ -267,10 +267,10 @@ class SKKSettingsActivityUITest {
267267
assert(skkPrefs.abbrevKey == '.'.code)
268268

269269
// Revert them all
270-
skkPrefs.kanaKey = 4 shl 28 /* CTRL */ or 'j'.code
270+
skkPrefs.kanaKey = CTRL_PRESSED or 'j'.code
271271
skkPrefs.katakanaKey = 'q'.code
272272
skkPrefs.asciiKey = 'l'.code
273-
skkPrefs.zenkakuKey = 1 shl 28 /* SHIFT */ or 'l'.code
273+
skkPrefs.zenkakuKey = SHIFT_PRESSED or 'l'.code
274274
}
275275

276276
@Test

app/src/main/java/jp/deadend/noname/skk/EmacsNavKeys.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ package jp.deadend.noname.skk
33
// 0 = 未設定(無効)。KEYCODE_UNKNOWN(0) は実際には押せないキーなので安全な番兵値
44
const val NAV_KEY_DISABLED = 0
55

6-
// デフォルトエンコード値: modifierBits (CTRL = 4) shl 28 or charCode
7-
const val NAV_LINE_START_KEY_DEFAULT = 4 shl 28 or 'a'.code // Ctrl+A
8-
const val NAV_LINE_END_KEY_DEFAULT = 4 shl 28 or 'e'.code // Ctrl+E
9-
const val NAV_FORWARD_KEY_DEFAULT = 4 shl 28 or 'f'.code // Ctrl+F
10-
const val NAV_BACKWARD_KEY_DEFAULT = 4 shl 28 or 'b'.code // Ctrl+B
6+
const val NAV_LINE_START_KEY_DEFAULT = CTRL_PRESSED or 'a'.code
7+
const val NAV_LINE_END_KEY_DEFAULT = CTRL_PRESSED or 'e'.code
8+
const val NAV_FORWARD_KEY_DEFAULT = CTRL_PRESSED or 'f'.code
9+
const val NAV_BACKWARD_KEY_DEFAULT = CTRL_PRESSED or 'b'.code
1110

1211
enum class EmacsNavAction { NAVIGATE, CONSUME, PASS_THROUGH }
1312

app/src/main/java/jp/deadend/noname/skk/GodanKeyboardView.kt

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -790,11 +790,7 @@ class GodanKeyboardView(context: Context, attrs: AttributeSet?) : KeyboardView(c
790790
'' -> 'l'.code
791791
'' -> 'j'.code
792792
else -> throw IllegalArgumentException(
793-
"Char($guidedCode) is not an arrow: ${
794-
Char(
795-
guidedCode
796-
)
797-
}"
793+
"$guidedCode is not an arrow: ${Char(guidedCode)}"
798794
)
799795
}
800796
}

app/src/main/java/jp/deadend/noname/skk/KeyboardView.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ open class KeyboardView @JvmOverloads constructor(
605605
else -> "CAPSLOCK"
606606
}
607607
// mInMultiTap -> {
608-
// key.codes[mTapCount.coerceAtLeast(0)].toChar().toString()
608+
// Char(key.codes[mTapCount.coerceAtLeast(0)]).toString()
609609
// // シフト時の toUpper とか必要ならするけど今はアルファベットの multiTap がない
610610
// }
611611
else -> {

app/src/main/java/jp/deadend/noname/skk/SKKPrefs.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class SKKPrefs(context: Context) {
5757

5858
// prefs_hard_key
5959
var kanaKey: Int
60-
get() = prefs.getInt(res.getString(R.string.pref_kana_key), 4 shl 28 or 'j'.code)
60+
get() = prefs.getInt(res.getString(R.string.pref_kana_key), CTRL_PRESSED or 'j'.code)
6161
set(value) = prefs.edit { putInt(res.getString(R.string.pref_kana_key), value) }
6262

6363
var toggleKanaKey: Boolean
@@ -67,7 +67,7 @@ class SKKPrefs(context: Context) {
6767
}
6868

6969
var cancelKey: Int
70-
get() = prefs.getInt(res.getString(R.string.pref_cancel_key), 4 shl 28 or 'g'.code)
70+
get() = prefs.getInt(res.getString(R.string.pref_cancel_key), CTRL_PRESSED or 'g'.code)
7171
set(value) = prefs.edit { putInt(res.getString(R.string.pref_cancel_key), value) }
7272

7373
var emacsNavInAscii: Boolean
@@ -104,17 +104,21 @@ class SKKPrefs(context: Context) {
104104
set(value) = prefs.edit { putInt(res.getString(R.string.pref_ascii_key), value) }
105105

106106
var zenkakuKey: Int
107-
get() = prefs.getInt(res.getString(R.string.pref_zenkaku_key), 1 shl 28 or 'l'.code)
107+
get() = prefs.getInt(res.getString(R.string.pref_zenkaku_key), SHIFT_PRESSED or 'l'.code)
108108
set(value) = prefs.edit { putInt(res.getString(R.string.pref_zenkaku_key), value) }
109109

110110
var abbrevKey: Int
111111
get() = prefs.getInt(res.getString(R.string.pref_abbrev_key), '/'.code)
112112
set(value) = prefs.edit { putInt(res.getString(R.string.pref_abbrev_key), value) }
113113

114114
var hankakuKanaKey: Int
115-
get() = prefs.getInt(res.getString(R.string.pref_hankaku_kana_key), 4 shl 28 or 'q'.code)
115+
get() =
116+
prefs.getInt(res.getString(R.string.pref_hankaku_kana_key), CTRL_PRESSED or 'q'.code)
116117
set(value) = prefs.edit { putInt(res.getString(R.string.pref_hankaku_kana_key), value) }
117118

119+
fun isModeKey(keyCode: Int): Boolean =
120+
keyCode in listOf(katakanaKey, asciiKey, zenkakuKey, abbrevKey, hankakuKanaKey)
121+
118122
var useCandidatesView: Boolean
119123
get() = prefs.getBoolean(res.getString(R.string.pref_use_candidates_view), true)
120124
set(value) = prefs.edit {

app/src/main/java/jp/deadend/noname/skk/SKKService.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,21 +1059,23 @@ class SKKService : InputMethodService() {
10591059
* on an InputConnection.
10601060
*/
10611061
private fun translateKeyDown(event: KeyEvent): Boolean {
1062+
if (KeyEvent.isModifierKey(event.keyCode)) return false
1063+
10621064
val newEvent = event.run {
10631065
KeyEvent(
10641066
downTime, eventTime, action, keyCode, repeatCount,
10651067
metaState or when {
10661068
mStickyShift -> mShiftKey.useState()
10671069
mSandS && mSpacePressed -> KeyEvent.META_SHIFT_ON.also { mSandSUsed = true }
10681070
else -> 0
1069-
}
1071+
}, deviceId, scanCode
10701072
)
10711073
}
10721074
val k = encodeKey(newEvent)
10731075
val (c, _) = decodeKey(k)
1074-
1075-
val ic = currentInputConnection
1076-
if (c == 0 || ic == null) return false
1076+
if (c == 0) return false
1077+
if (k and RAW_KEYCODE != 0 && !skkPrefs.isModeKey(k)) return false
1078+
if (currentInputConnection == null) return false
10771079

10781080
processKey(k)
10791081

app/src/main/java/jp/deadend/noname/skk/SKKUtils.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ private fun processSingleNumber(str: String, number: String): String {
145145
target, number // 全角
146146
.map { char ->
147147
when (char.code) {
148-
in '0'.code..'9'.code -> (char.code + ''.code - '0'.code).toChar()
148+
in '0'.code..'9'.code -> Char(char.code + ''.code - '0'.code)
149149
'.'.code -> '' // もしかして「・」の方がいい?
150150
else -> char
151151
}
@@ -218,7 +218,7 @@ private fun unquote(str: String): String = PAT_QUOTED.findAll(str)
218218
.joinToString("") { it.groupValues[1] }
219219

220220
private fun unescapeOctal(str: String): String = PAT_ESCAPE_NUM.replace(str) {
221-
it.value.substring(1).toInt(8).toChar().toString()
221+
Char(it.value.substring(1).toInt(8)).toString()
222222
} // emacs-lispのリテラルは8進数
223223

224224
fun processConcatAndMore(rawStr: String, kanjiKey: String): String {

app/src/main/java/jp/deadend/noname/skk/SetKeyUtil.kt

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,62 +3,65 @@ package jp.deadend.noname.skk
33
import android.view.KeyCharacterMap
44
import android.view.KeyEvent
55

6-
//const val DEFAULT_VALUE = KeyEvent.KEYCODE_UNKNOWN
6+
private const val META_SHIFT = 32 - 5
7+
internal const val RAW_KEYCODE = 1 shl (META_SHIFT + 4)
8+
internal const val META_PRESSED = 1 shl (META_SHIFT + 3)
9+
internal const val CTRL_PRESSED = 1 shl (META_SHIFT + 2)
10+
internal const val ALT_PRESSED = 1 shl (META_SHIFT + 1)
11+
internal const val SHIFT_PRESSED = 1 shl (META_SHIFT + 0)
12+
private const val CHAR_CODE_MASK = SHIFT_PRESSED - 1
713

8-
private const val SHIFT_PRESSED = 1
9-
private const val ALT_PRESSED = 2
10-
private const val CTRL_PRESSED = 4
11-
private const val META_PRESSED = 8
12-
13-
private val charMap: KeyCharacterMap by lazy {
14-
KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD)
15-
}
14+
private var deviceId = KeyCharacterMap.VIRTUAL_KEYBOARD
15+
private var charMap = KeyCharacterMap.load(deviceId)
1616

1717
fun encodeKey(event: KeyEvent): Int {
18+
if (deviceId != event.deviceId) {
19+
android.util.Log.d("SKK", "encodeKey switched charMap to device $deviceId")
20+
deviceId = event.deviceId
21+
charMap = event.keyCharacterMap
22+
}
23+
1824
val uc = event.getUnicodeChar(event.metaState and KeyEvent.META_SHIFT_MASK)
1925
val lower = Character.toLowerCase(uc)
20-
var meta = 0
21-
if (uc != 0 && uc != lower) {
22-
meta = meta or SHIFT_PRESSED
23-
}
24-
if (event.metaState and KeyEvent.META_ALT_MASK != 0) {
25-
meta = meta or ALT_PRESSED
26-
}
27-
if (event.metaState and KeyEvent.META_CTRL_MASK != 0) {
28-
meta = meta or CTRL_PRESSED
29-
}
30-
if (event.metaState and KeyEvent.META_META_MASK != 0) {
31-
meta = meta or META_PRESSED
32-
}
26+
val isKeycode = lower == 0 && !KeyEvent.isModifierKey(event.keyCode)
27+
val c = if (isKeycode) event.keyCode else lower
28+
val meta = when {
29+
// 大文字以外はシフトを押していてもシフトなしの記号として扱うことで、キーボード依存をなくす
30+
uc != 0 -> if (uc != lower) SHIFT_PRESSED else 0
31+
event.metaState and KeyEvent.META_SHIFT_MASK != 0 -> SHIFT_PRESSED
32+
else -> 0
33+
} or if (event.metaState and KeyEvent.META_ALT_MASK != 0) ALT_PRESSED
34+
else 0 or if (event.metaState and KeyEvent.META_CTRL_MASK != 0) CTRL_PRESSED
35+
else 0 or if (event.metaState and KeyEvent.META_META_MASK != 0) META_PRESSED
36+
else 0 or if (isKeycode) RAW_KEYCODE else 0
3337

34-
return meta shl 28 or if (lower != 0) lower else charMap.get(event.keyCode, 0)
38+
return meta or c
3539
}
3640

3741
fun encodeKey(charCode: Int): Int {
3842
val meta = if (Character.isUpperCase(charCode)) SHIFT_PRESSED else 0
3943
val codeLower = if (meta and SHIFT_PRESSED != 0) Character.toLowerCase(charCode) else charCode
40-
return meta shl 28 or codeLower
44+
return meta or codeLower
4145
}
4246

4347
// returns Pair<lowerCharCode, isShifted>
4448
fun decodeKey(keyCode: Int): Pair<Int, Boolean> {
45-
return keyCode and 0xFFFFFFF to ((keyCode shr 28 and SHIFT_PRESSED) != 0)
49+
return keyCode and CHAR_CODE_MASK to ((keyCode and SHIFT_PRESSED) != 0)
4650
}
4751

4852
fun getKeyName(key: Int): String {
49-
val charCode = key and 0xFFFFFFF
50-
if (charCode == 0) return ""
53+
val charCode = key and CHAR_CODE_MASK
54+
if (charCode == 0) return "" // モディファイアのみの場合
5155

52-
val result = StringBuilder()
53-
val meta = key shr 28
54-
if (meta and META_PRESSED != 0) result.append("META+")
55-
if (meta and CTRL_PRESSED != 0) result.append("CTRL+")
56-
if (meta and ALT_PRESSED != 0) result.append("ALT+")
57-
if (meta and SHIFT_PRESSED != 0) result.append("SHIFT+")
56+
return buildString {
57+
if (key and META_PRESSED != 0) append("META+")
58+
if (key and CTRL_PRESSED != 0) append("CTRL+")
59+
if (key and ALT_PRESSED != 0) append("ALT+")
60+
if (key and SHIFT_PRESSED != 0) append("SHIFT+")
5861

59-
val ev = charMap.getEvents(charArrayOf(Char(charCode)))?.get(0) ?: return ""
60-
val kc = KeyEvent.keyCodeToString(ev.keyCode).removePrefix("KEYCODE_")
61-
result.append(kc)
62-
63-
return result.toString()
62+
val keyCode = if (key and RAW_KEYCODE != 0) charCode
63+
else charMap.getEvents(charArrayOf(Char(charCode)))?.firstOrNull()?.keyCode ?: 0
64+
val name = KeyEvent.keyCodeToString(keyCode).removePrefix("KEYCODE_")
65+
append(name)
66+
}
6467
}

app/src/main/java/jp/deadend/noname/skk/engine/SKKASCIIState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ object SKKASCIIState : SKKState {
1414
override fun processKey(context: SKKEngine, keyCode: Int) {
1515
val (lower, shifted) = decodeKey(keyCode)
1616
val c = if (shifted) Character.toUpperCase(lower) else lower
17-
context.commitTextSKK(c.toChar().toString())
17+
context.commitTextSKK(Char(c).toString())
1818
context.updateSuggestionsASCII()
1919
}
2020

app/src/main/java/jp/deadend/noname/skk/engine/SKKAbbrevState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ object SKKAbbrevState : SKKState {
4040
' '.code -> if (mKanjiKey.isNotEmpty()) conversionStart(mKanjiKey)
4141

4242
else -> {
43-
mKanjiKey.append(keyCode.toChar())
43+
mKanjiKey.append(Char(keyCode))
4444
setComposingTextSKK(mKanjiKey)
4545
updateSuggestions(mKanjiKey.toString())
4646
}

0 commit comments

Comments
 (0)