diff --git a/src/events/SDL_keyboard.c b/src/events/SDL_keyboard.c index f6969e37ed..53508fd53f 100644 --- a/src/events/SDL_keyboard.c +++ b/src/events/SDL_keyboard.c @@ -784,11 +784,33 @@ void SDL_SendKeyboardText(const char *text) event.type = SDL_EVENT_TEXT_INPUT; event.common.timestamp = 0; event.text.windowID = keyboard->focus ? keyboard->focus->id : 0; - event.text.text = SDL_CreateTemporaryString(text); - if (!event.text.text) { - return; + + if (SDL_GetHintBoolean("SDL2_COMPAT", false)) { + size_t pos = 0, advance, length = SDL_strlen(text); + + // Limit SDL_EVENT_TEXT_INPUT events to 32 bytes for SDL2 compatibility + while (pos < length) { + char trimmed_text[32]; + + advance = SDL_utf8strlcpy(trimmed_text, text + pos, SDL_arraysize(trimmed_text)); + if (!advance) { + break; + } + pos += advance; + + event.text.text = SDL_CreateTemporaryString(trimmed_text); + if (!event.text.text) { + return; + } + SDL_PushEvent(&event); + } + } else { + event.text.text = SDL_CreateTemporaryString(text); + if (!event.text.text) { + return; + } + SDL_PushEvent(&event); } - SDL_PushEvent(&event); } }