@@ -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 ();
@@ -2589,6 +2597,8 @@ bool LineEdit::is_text_field() const {
25892597}
25902598
25912599void LineEdit::menu_option (int p_option) {
2600+ int prev_len = text.length ();
2601+ bool inserted_control_char = false ;
25922602 switch (p_option) {
25932603 case MENU_CUT: {
25942604 if (editable) {
@@ -2639,87 +2649,111 @@ void LineEdit::menu_option(int p_option) {
26392649 case MENU_INSERT_LRM: {
26402650 if (editable) {
26412651 insert_text_at_caret (String::chr (0x200E ));
2652+ inserted_control_char = true ;
26422653 }
26432654 } break ;
26442655 case MENU_INSERT_RLM: {
26452656 if (editable) {
26462657 insert_text_at_caret (String::chr (0x200F ));
2658+ inserted_control_char = true ;
26472659 }
26482660 } break ;
26492661 case MENU_INSERT_LRE: {
26502662 if (editable) {
26512663 insert_text_at_caret (String::chr (0x202A ));
2664+ inserted_control_char = true ;
26522665 }
26532666 } break ;
26542667 case MENU_INSERT_RLE: {
26552668 if (editable) {
26562669 insert_text_at_caret (String::chr (0x202B ));
2670+ inserted_control_char = true ;
26572671 }
26582672 } break ;
26592673 case MENU_INSERT_LRO: {
26602674 if (editable) {
26612675 insert_text_at_caret (String::chr (0x202D ));
2676+ inserted_control_char = true ;
26622677 }
26632678 } break ;
26642679 case MENU_INSERT_RLO: {
26652680 if (editable) {
26662681 insert_text_at_caret (String::chr (0x202E ));
2682+ inserted_control_char = true ;
26672683 }
26682684 } break ;
26692685 case MENU_INSERT_PDF: {
26702686 if (editable) {
26712687 insert_text_at_caret (String::chr (0x202C ));
2688+ inserted_control_char = true ;
26722689 }
26732690 } break ;
26742691 case MENU_INSERT_ALM: {
26752692 if (editable) {
26762693 insert_text_at_caret (String::chr (0x061C ));
2694+ inserted_control_char = true ;
26772695 }
26782696 } break ;
26792697 case MENU_INSERT_LRI: {
26802698 if (editable) {
26812699 insert_text_at_caret (String::chr (0x2066 ));
2700+ inserted_control_char = true ;
26822701 }
26832702 } break ;
26842703 case MENU_INSERT_RLI: {
26852704 if (editable) {
26862705 insert_text_at_caret (String::chr (0x2067 ));
2706+ inserted_control_char = true ;
26872707 }
26882708 } break ;
26892709 case MENU_INSERT_FSI: {
26902710 if (editable) {
26912711 insert_text_at_caret (String::chr (0x2068 ));
2712+ inserted_control_char = true ;
26922713 }
26932714 } break ;
26942715 case MENU_INSERT_PDI: {
26952716 if (editable) {
26962717 insert_text_at_caret (String::chr (0x2069 ));
2718+ inserted_control_char = true ;
26972719 }
26982720 } break ;
26992721 case MENU_INSERT_ZWJ: {
27002722 if (editable) {
27012723 insert_text_at_caret (String::chr (0x200D ));
2724+ inserted_control_char = true ;
27022725 }
27032726 } break ;
27042727 case MENU_INSERT_ZWNJ: {
27052728 if (editable) {
27062729 insert_text_at_caret (String::chr (0x200C ));
2730+ inserted_control_char = true ;
27072731 }
27082732 } break ;
27092733 case MENU_INSERT_WJ: {
27102734 if (editable) {
27112735 insert_text_at_caret (String::chr (0x2060 ));
2736+ inserted_control_char = true ;
27122737 }
27132738 } break ;
27142739 case MENU_INSERT_SHY: {
27152740 if (editable) {
27162741 insert_text_at_caret (String::chr (0x00AD ));
2742+ inserted_control_char = true ;
27172743 }
27182744 } break ;
27192745 case MENU_EMOJI_AND_SYMBOL: {
27202746 show_emoji_and_symbol_picker ();
27212747 } break ;
27222748 }
2749+
2750+ // Mirror paste/drag behavior, emit text_changed signal if a control character was inserted.
2751+ if (inserted_control_char && !text_changed_dirty) {
2752+ if (is_inside_tree () && text.length () != prev_len) {
2753+ callable_mp (this , &LineEdit::_text_changed).call_deferred ();
2754+ }
2755+ text_changed_dirty = true ;
2756+ }
27232757}
27242758
27252759void LineEdit::set_context_menu_enabled (bool p_enable) {
0 commit comments