add kle numpad recognition

This commit is contained in:
Teatov 2025-07-31 04:30:32 +10:00
parent 702c83afb2
commit b41ee1d85d

View File

@ -25,15 +25,20 @@ const LABEL_TO_KEYCODE_MAP: Dictionary[String, Key] = {
"PgDn": KEY_PAGEDOWN, "PgDn": KEY_PAGEDOWN,
"Page Down": KEY_PAGEDOWN, "Page Down": KEY_PAGEDOWN,
"Num Lock": KEY_NUMLOCK, "Num Lock": KEY_NUMLOCK,
"*": KEY_KP_MULTIPLY,
"+": KEY_KP_ADD,
"Del": KEY_KP_PERIOD,
"": KEY_UP, "": KEY_UP,
"": KEY_LEFT, "": KEY_LEFT,
"": KEY_DOWN, "": KEY_DOWN,
"": KEY_RIGHT, "": KEY_RIGHT,
} }
const LABEL_TO_NUMPAD_KEYCODE_MAP: Dictionary[String, Key] = {
"/": KEY_KP_DIVIDE,
"*": KEY_KP_MULTIPLY,
"-": KEY_KP_SUBTRACT,
"+": KEY_KP_ADD,
".": KEY_KP_PERIOD,
}
const W := "w" const W := "w"
const H := "h" const H := "h"
const X := "x" const X := "x"
@ -123,7 +128,9 @@ func _deserialize_row(data_row: Array) -> Array[Dictionary]:
if key_data is String: if key_data is String:
var key_dict := { var key_dict := {
KeyProps.KEY: KeyProps.KEY:
_get_keycode_from_legend(key_data as String, current_key_data_dict) _get_keycode_from_legend(
(key_data as String).split("\n"), current_key_data_dict
)
} }
key_dict.merge(_deserialize_key(current_key_data_dict)) key_dict.merge(_deserialize_key(current_key_data_dict))
layout_row.append(key_dict) layout_row.append(key_dict)
@ -168,28 +175,48 @@ func _cleanup_key_data_dict(data_key: Dictionary) -> Dictionary:
return data_key return data_key
func _get_keycode_from_legend(legend: String, data_key: Dictionary) -> Key: func _get_keycode_from_legend(legend: Array[String], data_key: Dictionary) -> Key:
if legend == "" and data_key.has(W) and data_key[W] > 1: if legend.size() == 1 and legend[0] == "" and data_key.has(W) and data_key[W] > 1:
return KEY_SPACE return KEY_SPACE
var labels := legend.split("\n") var keycode := KEY_NONE
var keycode := OS.find_keycode_from_string(labels[0]) keycode = _get_numpad_keycode_from_legend(legend)
if keycode == KEY_NONE and labels.size() == 2: if keycode == KEY_NONE:
keycode = OS.find_keycode_from_string(labels[1]) keycode = OS.find_keycode_from_string(legend[0])
if keycode == KEY_NONE and legend.size() == 2:
keycode = OS.find_keycode_from_string(legend[1])
if keycode == KEY_NONE and legend.size() == 2:
if LABEL_TO_KEYCODE_MAP.has(legend[1]):
keycode = LABEL_TO_KEYCODE_MAP[legend[1]]
elif LABEL_TO_KEYCODE_MAP.has(legend[0]):
keycode = LABEL_TO_KEYCODE_MAP[legend[0]]
if ( if (
keycode == KEY_NONE keycode == KEY_NONE
and LABEL_TO_KEYCODE_MAP.has(labels[1] if labels.size() == 2 else labels[0]) and legend.size() == 1
and LABEL_TO_KEYCODE_MAP.has(legend[0])
): ):
keycode = LABEL_TO_KEYCODE_MAP[labels[1] if labels.size() == 2 else labels[0]] keycode = LABEL_TO_KEYCODE_MAP[legend[0]]
if keycode == KEY_NONE and labels.size() == 2:
keycode = LABEL_TO_KEYCODE_MAP[labels[0]]
if keycode == KEY_NONE: if keycode == KEY_NONE:
printerr("could not recognize key label %s" % labels) printerr("%s: could not recognize key label %s" % [_name, str(legend)])
return KEY_UNKNOWN return KEY_UNKNOWN
return keycode return keycode
func _get_numpad_keycode_from_legend(legend: Array[String]) -> Key:
if legend.size() == 1 or legend.size() == 2:
if legend[0].length() == 1 and legend[0].is_valid_int():
return KEY_KP_0 + int(legend[0]) as Key
if (
LABEL_TO_NUMPAD_KEYCODE_MAP.has(legend[0])
and not (legend.size() == 2 and legend[1].length() == 1)
):
return LABEL_TO_NUMPAD_KEYCODE_MAP[legend[0]]
return KEY_NONE