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 1/2] 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; From f4e6c2b62fcba53683d1c0f2d7be5d5be761353d Mon Sep 17 00:00:00 2001 From: y5nw <37980625+y5nw@users.noreply.github.com> Date: Sun, 25 May 2025 17:00:03 +0200 Subject: [PATCH 2/2] Implement string composition for CGUIEditBox --- irr/src/CGUIEditBox.cpp | 26 ++++++++++++++++++++++++-- irr/src/CGUIEditBox.h | 4 ++++ irr/src/CGUIEnvironment.cpp | 1 + 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/irr/src/CGUIEditBox.cpp b/irr/src/CGUIEditBox.cpp index 6c29e89a9..50f6a449a 100644 --- a/irr/src/CGUIEditBox.cpp +++ b/irr/src/CGUIEditBox.cpp @@ -234,6 +234,10 @@ bool CGUIEditBox::OnEvent(const SEvent &event) inputString(*event.StringInput.Str); return true; break; + case EET_STRING_COMPOSITION_EVENT: + composeString(*event.StringComposition.Str); + return true; + break; default: break; } @@ -1262,10 +1266,10 @@ void CGUIEditBox::inputChar(wchar_t c) inputString(s); } -void CGUIEditBox::inputString(const core::stringw &str) +bool CGUIEditBox::insertString(const core::stringw &str) { if (!isEnabled()) - return; + return false; core::stringw s; u32 len = str.size(); @@ -1324,6 +1328,13 @@ void CGUIEditBox::inputString(const core::stringw &str) } BlinkStartTime = os::Timer::getTime(); + return true; +} + +void CGUIEditBox::inputString(const core::stringw &str) +{ + if (!insertString(str)) + return; setTextMarkers(0, 0); breakText(); @@ -1331,6 +1342,17 @@ void CGUIEditBox::inputString(const core::stringw &str) sendGuiEvent(EGET_EDITBOX_CHANGED); } +void CGUIEditBox::composeString(const core::stringw &str) +{ + if (!insertString(str)) + return; + setTextMarkers(CursorPos-str.size(), CursorPos); + + breakText(); + calculateScrollPos(); + sendGuiEvent(EGET_EDITBOX_CHANGED); +} + // calculate autoscroll void CGUIEditBox::calculateScrollPos() { diff --git a/irr/src/CGUIEditBox.h b/irr/src/CGUIEditBox.h index 35ab5f73e..97fa809de 100644 --- a/irr/src/CGUIEditBox.h +++ b/irr/src/CGUIEditBox.h @@ -144,10 +144,14 @@ protected: void setTextRect(s32 line); //! returns the line number that the cursor is on s32 getLineFromPos(s32 pos); + //! inserts a string to the edit box; used by inputString and composeString + bool insertString(const core::stringw &str); //! adds a letter to the edit box void inputChar(wchar_t c); //! adds a string to the edit box void inputString(const core::stringw &str); + //! compose a string before it is added + void composeString(const core::stringw &str); //! calculates the current scroll position void calculateScrollPos(); //! calculated the FrameRect diff --git a/irr/src/CGUIEnvironment.cpp b/irr/src/CGUIEnvironment.cpp index abfa0aab9..b443c9a3b 100644 --- a/irr/src/CGUIEnvironment.cpp +++ b/irr/src/CGUIEnvironment.cpp @@ -552,6 +552,7 @@ bool CGUIEnvironment::postEventFromUser(const SEvent &event) } } } break; + case EET_STRING_COMPOSITION_EVENT: [[fallthrough]]; case EET_STRING_INPUT_EVENT: if (Focus && Focus->OnEvent(event)) return true;