Release all keys on pause.

Fixes #18767

Not sure about merging for the 1.17 series though, maybe someone really
likes to bring up the pause menu briefly while holding a direction.. we
could actually handle that with some extra logic.
This commit is contained in:
Henrik Rydgård 2024-01-29 18:41:43 +01:00
parent f02142c5c0
commit 7920d3a44b
3 changed files with 40 additions and 0 deletions

View File

@ -231,6 +231,42 @@ void ControlMapper::ForceReleaseVKey(int vkey) {
KeyMap::UnlockMappings();
}
void ControlMapper::ReleaseAll() {
std::vector<AxisInput> axes;
std::vector<KeyInput> keys;
{
std::lock_guard<std::mutex> 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;

View File

@ -40,6 +40,9 @@ public:
// 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 {

View File

@ -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);