mirror of
https://github.com/hrydgard/ppsspp.git
synced 2024-11-22 21:09:52 +00:00
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:
parent
f02142c5c0
commit
7920d3a44b
@ -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;
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user