fix bug with SDL text input that occurs when multiple responders occur on the screen. (Tested with 2 responders.)

This commit is contained in:
Jeff Hutchinson 2016-12-11 19:10:51 -05:00
parent f6b8ef126d
commit 3ecbb4b7e5
3 changed files with 31 additions and 1 deletions

View file

@ -486,6 +486,19 @@ void PlatformWindowSDL::_triggerKeyNotify(const SDL_Event& evt)
{
keyEvent.trigger(getWindowId(), torqueModifiers, inputAction, torqueKey);
//Con::printf("Key %d : %d", tKey.sym, inputAction);
if (inputAction == IA_MAKE && SDL_IsTextInputActive())
{
// We have to check if we already have a first responder active.
// We don't want to type the character if it actually creates another responder!
if (mWindowInputGenerator->lastKeyWasGlobalActionMap())
{
// Turn off Text input, and the next frame turn it back on. This tells SDL
// to not generate a text event for this global action map key.
SDL_StopTextInput();
mOwningManager->updateSDLTextInputState(PlatformWindowManagerSDL::KeyboardInputState::TEXT_INPUT);
}
}
}
}

View file

@ -39,7 +39,8 @@ WindowInputGenerator::WindowInputGenerator( PlatformWindow *window ) :
mLastCursorPos(0,0),
mClampToWindow(true),
mFocused(false),
mPixelsPerMickey(1.0f)
mPixelsPerMickey(1.0f),
mLastPressWasGlobalActionMap(false)
{
AssertFatal(mWindow, "NULL PlatformWindow on WindowInputGenerator creation");
@ -82,6 +83,9 @@ WindowInputGenerator::~WindowInputGenerator()
//-----------------------------------------------------------------------------
void WindowInputGenerator::generateInputEvent( InputEventInfo &inputEvent )
{
// Reset last press being global
mLastPressWasGlobalActionMap = false;
if (!mInputController)// || !mFocused)
return;
@ -102,7 +106,10 @@ void WindowInputGenerator::generateInputEvent( InputEventInfo &inputEvent )
// Give the ActionMap first shot.
if (ActionMap::handleEventGlobal(&inputEvent))
{
mLastPressWasGlobalActionMap = true;
return;
}
if (mInputController->processInputEvent(inputEvent))
return;

View file

@ -51,6 +51,9 @@ class WindowInputGenerator
/// (one unit of mouse movement is a mickey) to units in the GUI.
F32 mPixelsPerMickey;
/// This tells us if the last key we pressed was used from the global action map.
bool mLastPressWasGlobalActionMap;
// Event Handlers
void handleMouseButton(WindowId did, U32 modifier, U32 action, U16 button);
void handleMouseWheel (WindowId did, U32 modifier, S32 wheelDeltaX, S32 wheelDeltaY);
@ -83,6 +86,13 @@ class WindowInputGenerator
/// event even if it maps to a character input event.
bool wantAsKeyboardEvent( U32 modifiers, U32 key );
/// Tells us if the last key was used within the global action map.
/// @return true if the key was a global action map key, false otherwise.
/// @note Useful and currently used to tell if we just opened the console
/// by using the console key. Currently this is used to fix a bug in SDL
/// but it is not limited to that use.
bool lastKeyWasGlobalActionMap() const { return mLastPressWasGlobalActionMap; }
void addAcceleratorKey( void *hnd, const String &cmd, U32 keycode, U32 modifier)
{
AccKeyMap acc;