[SDL] Avoid unnecessarily "restarting" text input

This commit is contained in:
y5nw
2024-02-08 00:36:00 +01:00
parent 0e8efb6225
commit 1930b11346
2 changed files with 27 additions and 8 deletions

View File

@ -219,17 +219,29 @@ void CIrrDeviceSDL::resetReceiveTextInputEvents() {
gui::IGUIElement *elem = GUIEnvironment->getFocus();
if (elem && elem->acceptsIME())
{
core::rect<s32> pos = elem->getAbsolutePosition();
core::rect<s32> *pos = new core::rect<s32>(elem->getAbsolutePosition());
if (lastElemPos == NULL || *lastElemPos != *pos)
{
if (lastElemPos != NULL)
delete lastElemPos;
lastElemPos = pos;
SDL_Rect rect;
rect.x = pos.UpperLeftCorner.X;
rect.y = pos.UpperLeftCorner.Y;
rect.w = pos.getWidth();
rect.h = pos.getHeight();
rect.x = pos->UpperLeftCorner.X;
rect.y = pos->UpperLeftCorner.Y;
rect.w = pos->getWidth();
rect.h = pos->getHeight();
SDL_SetTextInputRect(&rect);
SDL_StartTextInput();
}
else
{
delete pos;
}
}
else
{
delete lastElemPos;
lastElemPos = NULL;
SDL_StopTextInput();
}
}
@ -310,6 +322,8 @@ CIrrDeviceSDL::CIrrDeviceSDL(const SIrrlichtCreationParameters& param)
createGUIAndScene();
VideoDriver->OnResize(core::dimension2d<u32>(Width, Height));
}
lastElemPos = NULL;
}
@ -323,6 +337,9 @@ CIrrDeviceSDL::~CIrrDeviceSDL()
for (u32 i=0; i<numJoysticks; ++i)
SDL_JoystickClose(Joysticks[i]);
#endif
if (lastElemPos != NULL) {
delete lastElemPos;
}
if (Window)
{
SDL_GL_MakeCurrent(Window, NULL);

View File

@ -303,6 +303,8 @@ namespace irr
bool Resizable;
core::rect<s32> *lastElemPos;
struct SKeyMap
{
SKeyMap() {}