mirror of
https://github.com/curioustorvald/Terrarum.git
synced 2026-06-15 21:14:04 +09:00
text input pane wip
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user