Skip to content

Commit d7943ae

Browse files
committed
Merge pull request godotengine#111190 from SantiagoDaza3/Open-Source-Contribution
Fix 'LineEdit' Unicode code-point/control character insertion failing to emit text_changed
2 parents 414a497 + 01b9208 commit d7943ae

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

scene/gui/line_edit.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,6 +819,7 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
819819
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)))) {
820820
alt_start = false;
821821
alt_start_no_hold = false;
822+
int prev_len = text.length();
822823
if ((alt_code > 0x31 && alt_code < 0xd800) || (alt_code > 0xdfff)) {
823824
ime_text = String();
824825
ime_selection = Vector2i();
@@ -845,6 +846,13 @@ void LineEdit::gui_input(const Ref<InputEvent> &p_event) {
845846
}
846847
}
847848
alt_mode = ALT_INPUT_NONE;
849+
// Mirror paste behavior: defer _text_changed once per frame while emitting text_changed signal.
850+
if (!text_changed_dirty) {
851+
if (is_inside_tree() && text.length() != prev_len) {
852+
callable_mp(this, &LineEdit::_text_changed).call_deferred();
853+
}
854+
text_changed_dirty = true;
855+
}
848856
} else {
849857
ime_text = String();
850858
ime_selection = Vector2i();
@@ -2586,6 +2594,8 @@ bool LineEdit::is_text_field() const {
25862594
}
25872595

25882596
void LineEdit::menu_option(int p_option) {
2597+
int prev_len = text.length();
2598+
bool inserted_control_char = false;
25892599
switch (p_option) {
25902600
case MENU_CUT: {
25912601
if (editable) {
@@ -2636,87 +2646,111 @@ void LineEdit::menu_option(int p_option) {
26362646
case MENU_INSERT_LRM: {
26372647
if (editable) {
26382648
insert_text_at_caret(String::chr(0x200E));
2649+
inserted_control_char = true;
26392650
}
26402651
} break;
26412652
case MENU_INSERT_RLM: {
26422653
if (editable) {
26432654
insert_text_at_caret(String::chr(0x200F));
2655+
inserted_control_char = true;
26442656
}
26452657
} break;
26462658
case MENU_INSERT_LRE: {
26472659
if (editable) {
26482660
insert_text_at_caret(String::chr(0x202A));
2661+
inserted_control_char = true;
26492662
}
26502663
} break;
26512664
case MENU_INSERT_RLE: {
26522665
if (editable) {
26532666
insert_text_at_caret(String::chr(0x202B));
2667+
inserted_control_char = true;
26542668
}
26552669
} break;
26562670
case MENU_INSERT_LRO: {
26572671
if (editable) {
26582672
insert_text_at_caret(String::chr(0x202D));
2673+
inserted_control_char = true;
26592674
}
26602675
} break;
26612676
case MENU_INSERT_RLO: {
26622677
if (editable) {
26632678
insert_text_at_caret(String::chr(0x202E));
2679+
inserted_control_char = true;
26642680
}
26652681
} break;
26662682
case MENU_INSERT_PDF: {
26672683
if (editable) {
26682684
insert_text_at_caret(String::chr(0x202C));
2685+
inserted_control_char = true;
26692686
}
26702687
} break;
26712688
case MENU_INSERT_ALM: {
26722689
if (editable) {
26732690
insert_text_at_caret(String::chr(0x061C));
2691+
inserted_control_char = true;
26742692
}
26752693
} break;
26762694
case MENU_INSERT_LRI: {
26772695
if (editable) {
26782696
insert_text_at_caret(String::chr(0x2066));
2697+
inserted_control_char = true;
26792698
}
26802699
} break;
26812700
case MENU_INSERT_RLI: {
26822701
if (editable) {
26832702
insert_text_at_caret(String::chr(0x2067));
2703+
inserted_control_char = true;
26842704
}
26852705
} break;
26862706
case MENU_INSERT_FSI: {
26872707
if (editable) {
26882708
insert_text_at_caret(String::chr(0x2068));
2709+
inserted_control_char = true;
26892710
}
26902711
} break;
26912712
case MENU_INSERT_PDI: {
26922713
if (editable) {
26932714
insert_text_at_caret(String::chr(0x2069));
2715+
inserted_control_char = true;
26942716
}
26952717
} break;
26962718
case MENU_INSERT_ZWJ: {
26972719
if (editable) {
26982720
insert_text_at_caret(String::chr(0x200D));
2721+
inserted_control_char = true;
26992722
}
27002723
} break;
27012724
case MENU_INSERT_ZWNJ: {
27022725
if (editable) {
27032726
insert_text_at_caret(String::chr(0x200C));
2727+
inserted_control_char = true;
27042728
}
27052729
} break;
27062730
case MENU_INSERT_WJ: {
27072731
if (editable) {
27082732
insert_text_at_caret(String::chr(0x2060));
2733+
inserted_control_char = true;
27092734
}
27102735
} break;
27112736
case MENU_INSERT_SHY: {
27122737
if (editable) {
27132738
insert_text_at_caret(String::chr(0x00AD));
2739+
inserted_control_char = true;
27142740
}
27152741
} break;
27162742
case MENU_EMOJI_AND_SYMBOL: {
27172743
show_emoji_and_symbol_picker();
27182744
} break;
27192745
}
2746+
2747+
// Mirror paste/drag behavior, emit text_changed signal if a control character was inserted.
2748+
if (inserted_control_char && !text_changed_dirty) {
2749+
if (is_inside_tree() && text.length() != prev_len) {
2750+
callable_mp(this, &LineEdit::_text_changed).call_deferred();
2751+
}
2752+
text_changed_dirty = true;
2753+
}
27202754
}
27212755

27222756
void LineEdit::set_context_menu_enabled(bool p_enable) {

0 commit comments

Comments
 (0)