diff --git a/es-core/src/components/TextEditComponent.cpp b/es-core/src/components/TextEditComponent.cpp
index 1bf67ad1b..87475188b 100644
--- a/es-core/src/components/TextEditComponent.cpp
+++ b/es-core/src/components/TextEditComponent.cpp
@@ -130,6 +130,9 @@ std::string TextEditComponent::getValue() const
 
 void TextEditComponent::startEditing()
 {
+    if (mEditing)
+        return;
+
     SDL_StartTextInput();
     mEditing = true;
     updateHelpPrompts();
@@ -138,6 +141,9 @@ void TextEditComponent::startEditing()
 
 void TextEditComponent::stopEditing()
 {
+    if (!mEditing)
+        return;
+
     SDL_StopTextInput();
     mEditing = false;
     mMaskInput = false;
@@ -215,7 +221,7 @@ bool TextEditComponent::input(InputConfig* config, Input input)
             moveCursor(mCursorRepeatDir);
             return false;
         }
-        else if (cursorDown) {
+        else if (cursorDown && isEditing()) {
             // Stop editing and let the button down event be captured by the parent component.
             stopEditing();
             return false;
@@ -238,6 +244,9 @@ bool TextEditComponent::input(InputConfig* config, Input input)
             return true;
         }
 
+        if (config->isMappedTo("b", input))
+            stopEditing();
+
         // Consume all input when editing text.
         mMaskInput = false;
         return true;
diff --git a/es-core/src/guis/GuiTextEditKeyboardPopup.cpp b/es-core/src/guis/GuiTextEditKeyboardPopup.cpp
index fec7081fd..4611adced 100644
--- a/es-core/src/guis/GuiTextEditKeyboardPopup.cpp
+++ b/es-core/src/guis/GuiTextEditKeyboardPopup.cpp
@@ -378,15 +378,15 @@ bool GuiTextEditKeyboardPopup::input(InputConfig* config, Input input)
                 "", nullptr, nullptr, true));
         }
         else {
+            if (mText->isEditing())
+                mText->stopEditing();
             delete this;
             return true;
         }
     }
 
-    if (mText->isEditing() && config->isMappedLike("down", input) && input.value) {
-        mText->stopEditing();
+    if (mText->isEditing() && config->isMappedLike("down", input) && input.value)
         mGrid.setCursorTo(mGrid.getSelectedComponent());
-    }
 
     // Left trigger button outside text editing field toggles Shift key.
     if (!mText->isEditing() && config->isMappedLike("lefttrigger", input) && input.value)
diff --git a/es-core/src/guis/GuiTextEditPopup.cpp b/es-core/src/guis/GuiTextEditPopup.cpp
index 0d95eada9..55b1c22d0 100644
--- a/es-core/src/guis/GuiTextEditPopup.cpp
+++ b/es-core/src/guis/GuiTextEditPopup.cpp
@@ -205,15 +205,15 @@ bool GuiTextEditPopup::input(InputConfig* config, Input input)
                 "", nullptr, nullptr, true));
         }
         else {
+            if (mText->isEditing())
+                mText->stopEditing();
             delete this;
             return true;
         }
     }
 
-    if (mText->isEditing() && config->isMappedLike("down", input) && input.value) {
-        mText->stopEditing();
+    if (mText->isEditing() && config->isMappedLike("down", input) && input.value)
         mGrid.setCursorTo(mGrid.getSelectedComponent());
-    }
 
     // Left shoulder button deletes a character (backspace).
     if (config->isMappedTo("leftshoulder", input)) {