@@ -2,6 +2,15 @@ package com.lambda.util
22
33import com.lambda.util.primitives.extension.displayValue
44import 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
615enum 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