From d446985f1248fc07ab4804e5641d35aa1949af4d Mon Sep 17 00:00:00 2001 From: itsRevela Date: Mon, 23 Mar 2026 11:57:59 -0500 Subject: [PATCH] Add clipboard paste support to UIControl_TextInput and UIScene_Keyboard (#1298) Resolved conflicts with existing fork paste implementation - adopted upstream's batch sanitize-then-insert approach over char-by-char insertion. --- .../Common/UI/UIControl_TextInput.cpp | 22 ++++++++++++----- .../Common/UI/UIScene_Keyboard.cpp | 24 +++++++++++++------ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/Minecraft.Client/Common/UI/UIControl_TextInput.cpp b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp index 422d8672..5c282a51 100644 --- a/Minecraft.Client/Common/UI/UIControl_TextInput.cpp +++ b/Minecraft.Client/Common/UI/UIControl_TextInput.cpp @@ -216,13 +216,23 @@ UIControl_TextInput::EDirectEditResult UIControl_TextInput::tickDirectEdit() if (g_KBMInput.IsKeyPressed('V') && g_KBMInput.IsKeyDown(VK_CONTROL)) { wstring pasted = Screen::getClipboard(); - for (size_t i = 0; i < pasted.length(); i++) + wstring sanitized; + sanitized.reserve(pasted.length()); + + for (wchar_t pc : pasted) { - wchar_t pc = pasted[i]; - if (pc < 0x20) continue; // skip control characters - if (m_iCharLimit > 0 && (int)m_editBuffer.length() >= m_iCharLimit) break; - m_editBuffer.insert(m_iCursorPos, 1, pc); - m_iCursorPos++; + if (pc >= 0x20) // Keep printable characters + { + if (m_iCharLimit > 0 && (m_editBuffer.length() + sanitized.length()) >= (size_t)m_iCharLimit) + break; + sanitized += pc; + } + } + + if (!sanitized.empty()) + { + m_editBuffer.insert(m_iCursorPos, sanitized); + m_iCursorPos += (int)sanitized.length(); changed = true; } } diff --git a/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp b/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp index 1cdb22a5..35edf17f 100644 --- a/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp +++ b/Minecraft.Client/Common/UI/UIScene_Keyboard.cpp @@ -229,19 +229,29 @@ void UIScene_Keyboard::tick() if (g_KBMInput.IsKeyPressed('V') && g_KBMInput.IsKeyDown(VK_CONTROL)) { wstring pasted = Screen::getClipboard(); - for (size_t i = 0; i < pasted.length(); i++) + wstring sanitized; + sanitized.reserve(pasted.length()); + + for (wchar_t pc : pasted) + { + if (pc >= 0x20) // Keep printable characters + { + if (static_cast(m_win64TextBuffer.length() + sanitized.length()) >= m_win64MaxChars) + break; + sanitized += pc; + } + } + + if (!sanitized.empty()) { - wchar_t pc = pasted[i]; - if (pc < 0x20) continue; // skip control characters - if (static_cast(m_win64TextBuffer.length()) >= m_win64MaxChars) break; if (m_bPCMode) { - m_win64TextBuffer.insert(m_iCursorPos, 1, pc); - m_iCursorPos++; + m_win64TextBuffer.insert(m_iCursorPos, sanitized); + m_iCursorPos += (int)sanitized.length(); } else { - m_win64TextBuffer += pc; + m_win64TextBuffer += sanitized; } changed = true; }