text input pane wip

This commit is contained in:
minjaesong
2021-10-20 23:00:25 +09:00
parent 8a8e97d4b2
commit 9326b87909
34 changed files with 320 additions and 163 deletions

View File

@@ -1,11 +1,18 @@
package net.torvald.terrarum.gamecontroller
import com.badlogic.gdx.Gdx
import net.torvald.terrarum.App.printdbg
typealias TerrarumKeyLayout = Array<Array<String?>>
data class TerrarumKeyLayout(
val name: String,
val symbols: Array<Array<String?>>?,
val acceptChar: ((Int) -> String?)? = null
)
/**
* Key Layout File Structure for Low Layer:
* - n: Displayed name of the keyboard layout
* - t: Key symbols in 256R4C string array (C1: unshifted, C2: Shift, C3: AltGr, C4: Shift-AltGr)
*
* IME consists of two keyboard layers:
* - Low layer: "english" keyboard (qwerty, colemak, etc), stateless
* - High layer: chinese/japanese/korean/etc. keyboard, stateful
@@ -36,10 +43,11 @@ object IME {
private fun parseKeylayoutFile(path: String): TerrarumKeyLayout {
val file = Gdx.files.internal(path)
val src = file.readString("UTF-8")
val jsval = context.eval("js", src)
val jsval = context.eval("js", "let t=$src;Object.freeze(t)")
val name = jsval.getMember("n").asString()
val out = Array(256) { Array<String?>(4) { null } }
for (keycode in 0L until 256L) {
val a = jsval.getArrayElement(keycode)
val a = jsval.getMember("t").getArrayElement(keycode)
if (!a.isNull) {
for (layer in 0L until 4L) {
if (a.arraySize > layer) {
@@ -52,9 +60,9 @@ object IME {
}
}
//println("[IME] Test Keymap print:"); for (keycode in 0 until 256) { print("$keycode:\t"); println(out[keycode].joinToString("\t")) }
// println("[IME] Test Keymap print for $name:"); for (keycode in 0 until 256) { print("$keycode:\t"); println(out[keycode].joinToString("\t")) }
return out
return TerrarumKeyLayout(name, out)
}
}

View File

@@ -283,13 +283,19 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
private const val KEY_DOWN = 0
private const val KEY_CHANGE = 1
const val N_KEY_ROLLOVER = 8
var KEYBOARD_DELAYS = floatArrayOf(0.25f, 0.025f)
var KEYBOARD_DELAYS = longArrayOf(0L,250000000L,0L,25000000L,0L)
private var stroboTime = 0L
private var stroboStatus = 0
private var repeatCount = 0
private var oldKeys = IntArray(N_KEY_ROLLOVER) { 0 }
/** always Low Layer */
private var keymap = IME.getLowLayerByName(App.getConfigString("basekeyboardlayout"))
fun resetKeyboardStrobo() {
stroboStatus = 0
repeatCount = 0
}
// code proudly stolen from tsvm's TVDOS.SYS
fun withKeyboardEvent(callback: (TerrarumKeyboardEvent) -> Unit) {
val keys = strobeKeys()
@@ -337,8 +343,9 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
}
private fun keysToStr(keys: IntArray): Array<String?>? {
if (keys.size == 0) return null
val headkey = keys[0]
return if (keymap[headkey] == null) null else keymap[headkey]
return if (keymap.symbols!![headkey] == null) null else keymap.symbols!![headkey]
}
private fun strobeKeys(): IntArray {
@@ -356,8 +363,8 @@ class IngameController(val terrarumIngame: TerrarumIngame) : InputAdapter() {
}
private fun arrayEq(a: IntArray, b: IntArray): Boolean {
for (i in 0..a.size) {
if (a[i] != b[i]) return false
for (i in 0 until a.size) {
if (a[i] != b.getOrNull(i)) return false
}
return true
}