@@ -3,62 +3,65 @@ package jp.deadend.noname.skk
33import android.view.KeyCharacterMap
44import 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
1717fun 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
3741fun 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>
4448fun 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
4852fun 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}
0 commit comments