1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-12 13:20:55 +00:00

[TextEdit / LineEdit] Add support for OEM Alt codes input.

This commit is contained in:
bruvzg
2024-06-22 15:16:11 +03:00
committed by Pāvels Nadtočajevs
parent c374ce211c
commit aa0ade5b49
7 changed files with 257 additions and 25 deletions

View File

@@ -1947,13 +1947,14 @@ void TextEdit::unhandled_key_input(const Ref<InputEvent> &p_event) {
bool TextEdit::alt_input(const Ref<InputEvent> &p_gui_input) {
Ref<InputEventKey> k = p_gui_input;
if (k.is_valid()) {
// Start Unicode input (hold).
// Start Unicode Alt input (hold).
if (k->is_alt_pressed() && k->get_keycode() == Key::KP_ADD && !alt_start && !alt_start_no_hold) {
if (has_selection()) {
delete_selection();
}
alt_start = true;
alt_code = 0;
alt_mode = ALT_INPUT_UNICODE;
ime_text = "u";
ime_selection = Vector2i(0, -1);
_update_ime_text();
@@ -1967,43 +1968,104 @@ bool TextEdit::alt_input(const Ref<InputEvent> &p_gui_input) {
}
alt_start_no_hold = true;
alt_code = 0;
alt_mode = ALT_INPUT_UNICODE;
ime_text = "u";
ime_selection = Vector2i(0, -1);
_update_ime_text();
return true;
}
// Start OEM Alt input (hold).
if (k->is_alt_pressed() && k->get_keycode() >= Key::KP_1 && k->get_keycode() <= Key::KP_9 && !alt_start && !alt_start_no_hold) {
if (has_selection()) {
delete_selection();
}
alt_start = true;
alt_code = (uint32_t)(k->get_keycode() - Key::KP_0);
alt_mode = ALT_INPUT_OEM;
ime_text = vformat("o%s", String::num_int64(alt_code, 10));
ime_selection = Vector2i(0, -1);
_update_ime_text();
return true;
}
// Start Windows Alt input (hold).
if (k->is_alt_pressed() && k->get_keycode() == Key::KP_0 && !alt_start && !alt_start_no_hold) {
if (has_selection()) {
delete_selection();
}
alt_start = true;
alt_mode = ALT_INPUT_WIN;
alt_code = 0;
ime_text = "w";
ime_selection = Vector2i(0, -1);
_update_ime_text();
return true;
}
// Update Unicode input.
if (k->is_pressed() && ((k->is_alt_pressed() && alt_start) || alt_start_no_hold)) {
if (k->get_keycode() >= Key::KEY_0 && k->get_keycode() <= Key::KEY_9) {
alt_code = alt_code << 4;
if (alt_mode == ALT_INPUT_UNICODE) {
alt_code = alt_code << 4;
} else {
alt_code = alt_code * 10;
}
alt_code += (uint32_t)(k->get_keycode() - Key::KEY_0);
} else if (k->get_keycode() >= Key::KP_0 && k->get_keycode() <= Key::KP_9) {
alt_code = alt_code << 4;
if (alt_mode == ALT_INPUT_UNICODE) {
alt_code = alt_code << 4;
} else {
alt_code = alt_code * 10;
}
alt_code += (uint32_t)(k->get_keycode() - Key::KP_0);
} else if (k->get_keycode() >= Key::A && k->get_keycode() <= Key::F) {
} else if (alt_mode == ALT_INPUT_UNICODE && k->get_keycode() >= Key::A && k->get_keycode() <= Key::F) {
alt_code = alt_code << 4;
alt_code += (uint32_t)(k->get_keycode() - Key::A) + 10;
} else if ((Key)k->get_unicode() >= Key::KEY_0 && (Key)k->get_unicode() <= Key::KEY_9) {
alt_code = alt_code << 4;
if (alt_mode == ALT_INPUT_UNICODE) {
alt_code = alt_code << 4;
} else {
alt_code = alt_code * 10;
}
alt_code += (uint32_t)((Key)k->get_unicode() - Key::KEY_0);
} else if ((Key)k->get_unicode() >= Key::A && (Key)k->get_unicode() <= Key::F) {
} else if (alt_mode == ALT_INPUT_UNICODE && (Key)k->get_unicode() >= Key::A && (Key)k->get_unicode() <= Key::F) {
alt_code = alt_code << 4;
alt_code += (uint32_t)((Key)k->get_unicode() - Key::A) + 10;
} else if (k->get_physical_keycode() >= Key::KEY_0 && k->get_physical_keycode() <= Key::KEY_9) {
alt_code = alt_code << 4;
if (alt_mode == ALT_INPUT_UNICODE) {
alt_code = alt_code << 4;
} else {
alt_code = alt_code * 10;
}
alt_code += (uint32_t)(k->get_physical_keycode() - Key::KEY_0);
}
if (k->get_keycode() == Key::BACKSPACE) {
alt_code = alt_code >> 4;
if (alt_mode == ALT_INPUT_UNICODE) {
alt_code = alt_code >> 4;
} else {
alt_code = alt_code / 10;
}
}
if (alt_code > 0x10ffff) {
alt_code = 0x10ffff;
}
if (alt_code > 0) {
ime_text = vformat("u%s", String::num_int64(alt_code, 16, true));
if (alt_mode == ALT_INPUT_UNICODE) {
ime_text = vformat("u%s", String::num_int64(alt_code, 16, true));
} else if (alt_mode == ALT_INPUT_OEM) {
ime_text = vformat("o%s", String::num_int64(alt_code, 10));
} else if (alt_mode == ALT_INPUT_WIN) {
ime_text = vformat("w%s", String::num_int64(alt_code, 10));
}
} else {
ime_text = "u";
if (alt_mode == ALT_INPUT_UNICODE) {
ime_text = "u";
} else if (alt_mode == ALT_INPUT_OEM) {
ime_text = "o";
} else if (alt_mode == ALT_INPUT_WIN) {
ime_text = "w";
}
}
ime_selection = Vector2i(0, -1);
_update_ime_text();
@@ -2014,10 +2076,27 @@ bool TextEdit::alt_input(const Ref<InputEvent> &p_gui_input) {
if ((!k->is_pressed() && alt_start && k->get_keycode() == Key::ALT) || (alt_start_no_hold && (k->is_action("ui_text_submit", true) || k->is_action("ui_accept", true)))) {
alt_start = false;
alt_start_no_hold = false;
if ((alt_code > 0x31 && alt_code < 0xd800) || (alt_code > 0xdfff && alt_code <= 0x10ffff)) {
if ((alt_code > 0x31 && alt_code < 0xd800) || (alt_code > 0xdfff)) {
ime_text = String();
ime_selection = Vector2i();
handle_unicode_input(alt_code);
if (alt_mode == ALT_INPUT_UNICODE) {
if ((alt_code > 0x31 && alt_code < 0xd800) || (alt_code > 0xdfff)) {
handle_unicode_input(alt_code);
}
} else if (alt_mode == ALT_INPUT_OEM) {
if (alt_code > 0x00 && alt_code <= 0xff) {
handle_unicode_input(alt_code_oem437[alt_code]);
} else if ((alt_code > 0xff && alt_code < 0xd800) || (alt_code > 0xdfff)) {
handle_unicode_input(alt_code);
}
} else if (alt_mode == ALT_INPUT_WIN) {
if (alt_code > 0x00 && alt_code <= 0xff) {
handle_unicode_input(alt_code_cp1252[alt_code]);
} else if ((alt_code > 0xff && alt_code < 0xd800) || (alt_code > 0xdfff)) {
handle_unicode_input(alt_code);
}
}
alt_mode = ALT_INPUT_NONE;
} else {
ime_text = String();
ime_selection = Vector2i();
@@ -2030,6 +2109,7 @@ bool TextEdit::alt_input(const Ref<InputEvent> &p_gui_input) {
if (alt_start_no_hold && k->is_action("ui_cancel", true)) {
alt_start = false;
alt_start_no_hold = false;
alt_mode = ALT_INPUT_NONE;
ime_text = String();
ime_selection = Vector2i();
_update_ime_text();