@@ -127,14 +127,34 @@ enum class KeyCode(val keyCode: Int) {
127127 LAST (GLFW .GLFW_KEY_LAST );
128128
129129 companion object {
130- private val keyCodeMap: Map <Int , KeyCode > = entries.associateBy { it.keyCode }
131- private val nameMap: Map <String , KeyCode > = entries.associateBy { it.name.lowercase() }
130+ private const val printablePool = " `-=[]\\ ,;\' ./"
131+ private val glfwPool = intArrayOf(
132+ GLFW .GLFW_KEY_GRAVE_ACCENT , GLFW .GLFW_KEY_MINUS , GLFW .GLFW_KEY_EQUAL ,
133+ GLFW .GLFW_KEY_LEFT_BRACKET , GLFW .GLFW_KEY_RIGHT_BRACKET , GLFW .GLFW_KEY_BACKSLASH ,
134+ GLFW .GLFW_KEY_COMMA , GLFW .GLFW_KEY_SEMICOLON , GLFW .GLFW_KEY_APOSTROPHE ,
135+ GLFW .GLFW_KEY_PERIOD , GLFW .GLFW_KEY_SLASH , 0
136+ )
132137
133- fun fromKeyCodeOrNull (keyCode : Int ) = keyCodeMap[keyCode]
134- fun fromKeyCode (keyCode : Int ) = fromKeyCodeOrNull(keyCode) ? : UNBOUND
138+ private val keyCodeMap = entries.associateBy { it.keyCode }
139+ private val nameMap = entries.associateBy { it.name.lowercase() }
140+
141+ fun fromKeyCode (keyCode : Int ) = keyCodeMap[keyCode] ? : UNBOUND
135142 fun fromKeyName (name : String ) = nameMap[name.lowercase()] ? : UNBOUND
136143
137- fun fromUS (keyCode : Int , scanCode : Int ) =
138- GLFW .glfwGetKeyName(keyCode, scanCode)?.let { fromKeyName(it) } ? : fromKeyCode(keyCode)
144+ fun virtualMapUS (keyCode : Int , scanCode : Int ): KeyCode {
145+ if (keyCode in GLFW .GLFW_KEY_KP_0 .. GLFW .GLFW_KEY_KP_EQUAL ) return fromKeyCode(keyCode)
146+
147+ val keyName = GLFW .glfwGetKeyName(keyCode, scanCode) ? : return fromKeyCode(keyCode)
148+
149+ return when (
150+ val char = keyName.first()
151+ ) {
152+ in ' 0' .. ' 9' -> return fromKeyCode(GLFW .GLFW_KEY_0 + (char - ' 0' ))
153+ in ' A' .. ' Z' -> return fromKeyCode(GLFW .GLFW_KEY_A + (char - ' A' ))
154+ in ' a' .. ' z' -> return fromKeyCode(GLFW .GLFW_KEY_A + (char - ' a' ))
155+ in printablePool -> fromKeyCode(glfwPool[printablePool.indexOf(char)])
156+ else -> fromKeyCode(keyCode)
157+ }
158+ }
139159 }
140160}
0 commit comments