Skip to content

Commit 437cc7b

Browse files
committed
Fix: Multi keyboard layout mapping
1 parent d99d1e7 commit 437cc7b

File tree

2 files changed

+40
-4
lines changed

2 files changed

+40
-4
lines changed

common/src/main/kotlin/com/lambda/gui/api/LambdaGui.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ abstract class LambdaGui(
8080
}
8181

8282
final override fun keyPressed(keyCode: Int, scanCode: Int, modifiers: Int): Boolean {
83-
KeyCode.fromKeyCodeOrNull(keyCode)?.let {
83+
KeyCode.translateKeyCode(keyCode, scanCode).let {
8484
onEvent(GuiEvent.KeyPress(it))
8585
}
8686

common/src/main/kotlin/com/lambda/util/KeyCode.kt

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@ package com.lambda.util
22

33
import com.lambda.util.primitives.extension.displayValue
44
import org.lwjgl.glfw.GLFW
5+
import java.util.*
6+
7+
const val charNames = "`-=[]\\,;\'./"
8+
val charKeys = intArrayOf(
9+
GLFW.GLFW_KEY_GRAVE_ACCENT, GLFW.GLFW_KEY_MINUS, GLFW.GLFW_KEY_EQUAL,
10+
GLFW.GLFW_KEY_LEFT_BRACKET, GLFW.GLFW_KEY_RIGHT_BRACKET, GLFW.GLFW_KEY_BACKSLASH,
11+
GLFW.GLFW_KEY_COMMA, GLFW.GLFW_KEY_SEMICOLON, GLFW.GLFW_KEY_APOSTROPHE,
12+
GLFW.GLFW_KEY_PERIOD, GLFW.GLFW_KEY_SLASH, 0
13+
)
514

615
enum class KeyCode(val keyCode: Int) {
716
Unbound(GLFW.GLFW_KEY_UNKNOWN),
@@ -130,10 +139,37 @@ enum class KeyCode(val keyCode: Int) {
130139
val localizedName by lazy { GLFW.glfwGetKeyName(keyCode, 0)?.uppercase() ?: displayValue }
131140

132141
companion object {
133-
fun fromKeyCodeOrNull(keyCode: Int) = entries.firstOrNull { it.keyCode == keyCode }
142+
private val keyCodeMap: Map<Int, KeyCode> = entries.associateBy { it.keyCode }
143+
private val nameMap: Map<String, KeyCode> = entries.associateBy { it.name.lowercase(Locale.getDefault()) }
144+
145+
fun fromKeyCodeOrNull(keyCode: Int) = keyCodeMap[keyCode]
134146
fun fromKeyCode(keyCode: Int) = fromKeyCodeOrNull(keyCode) ?: Unbound
135147

136-
fun fromNameOrNull(name: String) = entries.firstOrNull { it.name.equals(name, true) }
148+
fun fromNameOrNull(name: String) = nameMap[name.lowercase(Locale.getDefault())]
137149
fun fromName(name: String) = fromNameOrNull(name) ?: Unbound
150+
151+
fun translateKeyCode(key: Int, scanCode: Int): KeyCode {
152+
if (key in GLFW.GLFW_KEY_KP_0..GLFW.GLFW_KEY_KP_EQUAL) {
153+
return fromKeyCode(key)
154+
}
155+
156+
val keyName = GLFW.glfwGetKeyName(key, scanCode) ?: return fromKeyCode(key)
157+
158+
if (keyName.length == 1) {
159+
when (val char = keyName[0]) {
160+
in '0'..'9' -> return fromKeyCode(GLFW.GLFW_KEY_0 + (char - '0'))
161+
in 'A'..'Z' -> return fromKeyCode(GLFW.GLFW_KEY_A + (char - 'A'))
162+
in 'a'..'z' -> return fromKeyCode(GLFW.GLFW_KEY_A + (char - 'a'))
163+
else -> {
164+
val index = charNames.indexOf(char)
165+
if (index != -1) {
166+
return fromKeyCode(charKeys[index])
167+
}
168+
}
169+
}
170+
}
171+
172+
return fromKeyCode(key)
173+
}
138174
}
139-
}
175+
}

0 commit comments

Comments
 (0)