[SDL] Avoid unnecessarily "restarting" text input
This commit is contained in:
		| @@ -219,17 +219,29 @@ void CIrrDeviceSDL::resetReceiveTextInputEvents() { | ||||
| 	gui::IGUIElement *elem = GUIEnvironment->getFocus(); | ||||
| 	if (elem && elem->acceptsIME()) | ||||
| 	{ | ||||
| 		core::rect<s32> pos = elem->getAbsolutePosition(); | ||||
| 		SDL_Rect rect; | ||||
| 		rect.x = pos.UpperLeftCorner.X; | ||||
| 		rect.y = pos.UpperLeftCorner.Y; | ||||
| 		rect.w = pos.getWidth(); | ||||
| 		rect.h = pos.getHeight(); | ||||
| 		SDL_SetTextInputRect(&rect); | ||||
| 		SDL_StartTextInput(); | ||||
| 		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(); | ||||
| 			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); | ||||
|   | ||||
| @@ -303,6 +303,8 @@ namespace irr | ||||
|  | ||||
| 		bool Resizable; | ||||
|  | ||||
| 		core::rect<s32> *lastElemPos; | ||||
|  | ||||
| 		struct SKeyMap | ||||
| 		{ | ||||
| 			SKeyMap() {} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user