@@ -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
25882596void 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
27222756void LineEdit::set_context_menu_enabled (bool p_enable) {
0 commit comments