1
0
mirror of https://github.com/ocornut/imgui.git synced 2025-02-02 12:37:20 +01:00

InputText: Fixed a bug where character replacements performed from a callback were not applied when pasting from clipbard. (#8229)

This commit is contained in:
ocornut 2024-12-15 15:46:33 +01:00
parent 324d4bb140
commit f5f11e94be
2 changed files with 14 additions and 10 deletions

View File

@ -43,6 +43,8 @@ Breaking changes:
Other changes: Other changes:
- InputText: Fixed a bug where character replacements performed from a callback
were not applied when pasting from clipbard. (#8229)
- Drags: Added ImGuiSliderFlags_NoSpeedTweaks flag to disable keyboard - Drags: Added ImGuiSliderFlags_NoSpeedTweaks flag to disable keyboard
modifiers altering the tweak speed. Useful if you want to alter tweak speed modifiers altering the tweak speed. Useful if you want to alter tweak speed
yourself based on your own logic. (#8223) yourself based on your own logic. (#8223)

View File

@ -4895,25 +4895,27 @@ bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_
{ {
// Filter pasted buffer // Filter pasted buffer
const int clipboard_len = (int)strlen(clipboard); const int clipboard_len = (int)strlen(clipboard);
char* clipboard_filtered = (char*)IM_ALLOC(clipboard_len + 1); ImVector<char> clipboard_filtered;
int clipboard_filtered_len = 0; clipboard_filtered.reserve(clipboard_len + 1);
for (const char* s = clipboard; *s != 0; ) for (const char* s = clipboard; *s != 0; )
{ {
unsigned int c; unsigned int c;
int len = ImTextCharFromUtf8(&c, s, NULL); int in_len = ImTextCharFromUtf8(&c, s, NULL);
s += len; s += in_len;
if (!InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, true)) if (!InputTextFilterCharacter(&g, &c, flags, callback, callback_user_data, true))
continue; continue;
memcpy(clipboard_filtered + clipboard_filtered_len, s - len, len); char c_utf8[5];
clipboard_filtered_len += len; ImTextCharToUtf8(c_utf8, c);
int out_len = (int)strlen(c_utf8);
clipboard_filtered.resize(clipboard_filtered.Size + out_len);
memcpy(clipboard_filtered.Data + clipboard_filtered.Size - out_len, c_utf8, out_len);
} }
clipboard_filtered[clipboard_filtered_len] = 0; if (clipboard_filtered.Size > 0) // If everything was filtered, ignore the pasting operation
if (clipboard_filtered_len > 0) // If everything was filtered, ignore the pasting operation
{ {
stb_textedit_paste(state, state->Stb, clipboard_filtered, clipboard_filtered_len); clipboard_filtered.push_back(0);
stb_textedit_paste(state, state->Stb, clipboard_filtered.Data, clipboard_filtered.Size - 1);
state->CursorFollow = true; state->CursorFollow = true;
} }
MemFree(clipboard_filtered);
} }
} }