diff --git a/Core/ControlMapper.cpp b/Core/ControlMapper.cpp index 17c8e9ff9e9e..33a9395fc1eb 100644 --- a/Core/ControlMapper.cpp +++ b/Core/ControlMapper.cpp @@ -231,6 +231,42 @@ void ControlMapper::ForceReleaseVKey(int vkey) { KeyMap::UnlockMappings(); } +void ControlMapper::ReleaseAll() { + std::vector axes; + std::vector keys; + + { + std::lock_guard guard(mutex_); + + for (const auto &input : curInput_) { + if (input.first.IsAxis()) { + if (input.second.value != 0.0f) { + AxisInput axis; + axis.deviceId = input.first.deviceId; + int dir; + axis.axisId = (InputAxis)input.first.Axis(&dir); + axis.value = 0.0; + axes.push_back(axis); + } + } else { + if (input.second.value != 0.0) { + KeyInput key; + key.deviceId = input.first.deviceId; + key.flags = KEY_UP; + key.keyCode = (InputKeyCode)input.first.keyCode; + keys.push_back(key); + } + } + } + } + + Axis(axes.data(), axes.size());; + for (const auto &key : keys) { + Key(key, nullptr); + } +} + + static int RotatePSPKeyCode(int x) { switch (x) { case CTRL_UP: return CTRL_RIGHT; diff --git a/Core/ControlMapper.h b/Core/ControlMapper.h index d7f2414e429d..313453bac070 100644 --- a/Core/ControlMapper.h +++ b/Core/ControlMapper.h @@ -40,6 +40,9 @@ class ControlMapper { // Might replace this later by allowing through "key-up" and similar events to lower screens. void ForceReleaseVKey(int vkey); + // Call when the emu screen gets pushed behind some other screen, like the pause screen, to release all "down" inputs. + void ReleaseAll(); + void GetDebugString(char *buffer, size_t bufSize) const; struct InputSample { diff --git a/UI/EmuScreen.cpp b/UI/EmuScreen.cpp index 11bc8b26eb3f..2075fb33381a 100644 --- a/UI/EmuScreen.cpp +++ b/UI/EmuScreen.cpp @@ -496,6 +496,7 @@ void EmuScreen::focusChanged(ScreenFocusChange focusChange) { switch (focusChange) { case ScreenFocusChange::FOCUS_LOST_TOP: g_Config.TimeTracker().Stop(gameID); + controlMapper_.ReleaseAll(); break; case ScreenFocusChange::FOCUS_BECAME_TOP: g_Config.TimeTracker().Start(gameID);