From 79669b5a9451b4ed6b61a565e69ed919e784104f Mon Sep 17 00:00:00 2001 From: y5nw <37980625+y5nw@users.noreply.github.com> Date: Sun, 25 May 2025 16:30:53 +0200 Subject: [PATCH] partial --- irr/include/IEventReceiver.h | 21 +++++++++++++++++++++ irr/src/CIrrDeviceSDL.cpp | 14 +++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/irr/include/IEventReceiver.h b/irr/include/IEventReceiver.h index 332b23158..d644911ee 100644 --- a/irr/include/IEventReceiver.h +++ b/irr/include/IEventReceiver.h @@ -37,6 +37,13 @@ enum EEVENT_TYPE /** This event is created when multiple characters are sent at a time (e.g. using an IME). */ EET_STRING_INPUT_EVENT, + //! A string composition event. + /** This event is created when the user "composes" characters (e.g. using an IME) before entering + the complete text. + See https://wiki.libsdl.org/SDL2/SDL_TextEditingExtEvent + */ + EET_STRING_COMPOSITION_EVENT, + //! A touch input event. EET_TOUCH_INPUT_EVENT, @@ -382,6 +389,19 @@ struct SEvent core::stringw *Str; }; + //! String composition event. + struct SStringComposition + { + //! The string that is composed. + core::stringw *Str; + + //! The position within the composition where further text would be inserted. + s32 Start; + + //! The number of characters that would be replaced by further typing. + s32 Length; + }; + //! Any kind of touch event. struct STouchInput { @@ -532,6 +552,7 @@ struct SEvent struct SMouseInput MouseInput; struct SKeyInput KeyInput; struct SStringInput StringInput; + struct SStringComposition StringComposition; struct STouchInput TouchInput; struct SAccelerometerEvent AccelerometerEvent; struct SGyroscopeEvent GyroscopeEvent; diff --git a/irr/src/CIrrDeviceSDL.cpp b/irr/src/CIrrDeviceSDL.cpp index bc7627f73..2b8893541 100644 --- a/irr/src/CIrrDeviceSDL.cpp +++ b/irr/src/CIrrDeviceSDL.cpp @@ -340,7 +340,7 @@ CIrrDeviceSDL::CIrrDeviceSDL(const SIrrlichtCreationParameters ¶m) : #endif // Set IME hints - SDL_SetHint(SDL_HINT_IME_INTERNAL_EDITING, "1"); + SDL_SetHint(SDL_HINT_IME_INTERNAL_EDITING, "0"); #if defined(SDL_HINT_IME_SHOW_UI) SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); #endif @@ -885,6 +885,18 @@ bool CIrrDeviceSDL::run() irrevent.StringInput.Str = NULL; } break; + case SDL_TEXTEDITING: { + irrevent.EventType = irr::EET_STRING_COMPOSITION_EVENT; + irrevent.StringComposition.Str = new core::stringw(); + irr::core::utf8ToWString(*irrevent.StringInput.Str, SDL_event.edit.text); + irrevent.StringComposition.Start = SDL_event.edit.start; + irrevent.StringComposition.Length = SDL_event.edit.length; + postEventFromUser(irrevent); + delete irrevent.StringInput.Str; + irrevent.StringInput.Str = NULL; + break; + } + case SDL_KEYDOWN: case SDL_KEYUP: { auto keysym = SDL_event.key.keysym.sym;