mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-07-11 01:25:07 +02:00
Add confirmation popup support on Exit App key
This adds a new mechanism so we can delay "vkey" events until the next frame, making for safer code. Will move a bunch of the virtkeys to this later. Fixes #20020
This commit is contained in:
+11
-11
@@ -147,8 +147,8 @@ void ConvertAnalogStick(float x, float y, float *outX, float *outY) {
|
||||
}
|
||||
|
||||
void ControlMapper::SetCallbacks(
|
||||
std::function<void(int, bool)> onVKey,
|
||||
std::function<void(int, float)> onVKeyAnalog,
|
||||
std::function<void(VirtKey, bool)> onVKey,
|
||||
std::function<void(VirtKey, float)> onVKeyAnalog,
|
||||
std::function<void(uint32_t, uint32_t)> updatePSPButtons,
|
||||
std::function<void(int, float, float)> setPSPAnalog,
|
||||
std::function<void(int, float, float)> setRawAnalog) {
|
||||
@@ -421,7 +421,7 @@ bool ControlMapper::UpdatePSPState(const InputMapping &changedMapping, double no
|
||||
// OK, handle all the virtual keys next. For these we need to do deltas here and send events.
|
||||
// Note that virtual keys include the analog directions, as they are driven by them.
|
||||
for (int i = 0; i < VIRTKEY_COUNT; i++) {
|
||||
int vkId = i + VIRTKEY_FIRST;
|
||||
VirtKey vkId = (VirtKey)(i + VIRTKEY_FIRST);
|
||||
|
||||
uint32_t idForMapping = vkId;
|
||||
SwapMappingIfEnabled(&idForMapping);
|
||||
@@ -578,7 +578,7 @@ void ControlMapper::ToggleSwapAxes() {
|
||||
|
||||
updatePSPButtons_(0, CTRL_LEFT | CTRL_RIGHT | CTRL_UP | CTRL_DOWN);
|
||||
|
||||
for (uint32_t vkey = VIRTKEY_FIRST; vkey < VIRTKEY_LAST; vkey++) {
|
||||
for (VirtKey vkey = VIRTKEY_FIRST; vkey < VIRTKEY_LAST; vkey = (VirtKey)(vkey + 1)) {
|
||||
if (IsSwappableVKey(vkey)) {
|
||||
if (virtKeyOn_[vkey - VIRTKEY_FIRST]) {
|
||||
onVKey_(vkey, false);
|
||||
@@ -668,13 +668,13 @@ void ControlMapper::PSPKey(int deviceId, int pspKeyCode, int flags) {
|
||||
int vk = pspKeyCode - VIRTKEY_FIRST;
|
||||
if (flags & KEY_DOWN) {
|
||||
virtKeys_[vk] = 1.0f;
|
||||
onVKey(pspKeyCode, true);
|
||||
onVKeyAnalog(deviceId, pspKeyCode, 1.0f);
|
||||
onVKey((VirtKey)pspKeyCode, true);
|
||||
onVKeyAnalog(deviceId, (VirtKey)pspKeyCode, 1.0f);
|
||||
}
|
||||
if (flags & KEY_UP) {
|
||||
virtKeys_[vk] = 0.0f;
|
||||
onVKey(pspKeyCode, false);
|
||||
onVKeyAnalog(deviceId, pspKeyCode, 0.0f);
|
||||
onVKey((VirtKey)pspKeyCode, false);
|
||||
onVKeyAnalog(deviceId, (VirtKey)pspKeyCode, 0.0f);
|
||||
}
|
||||
} else {
|
||||
// INFO_LOG(Log::System, "pspKey %d %d", pspKeyCode, flags);
|
||||
@@ -685,7 +685,7 @@ void ControlMapper::PSPKey(int deviceId, int pspKeyCode, int flags) {
|
||||
}
|
||||
}
|
||||
|
||||
void ControlMapper::onVKeyAnalog(int deviceId, int vkey, float value) {
|
||||
void ControlMapper::onVKeyAnalog(int deviceId, VirtKey vkey, float value) {
|
||||
// Unfortunately, for digital->analog inputs to work sanely, we need to sum up
|
||||
// with the opposite value too.
|
||||
int stick = 0;
|
||||
@@ -716,7 +716,7 @@ void ControlMapper::onVKeyAnalog(int deviceId, int vkey, float value) {
|
||||
SetPSPAxis(deviceId, stick, axis, sign * value);
|
||||
}
|
||||
|
||||
void ControlMapper::onVKey(int vkey, bool down) {
|
||||
void ControlMapper::onVKey(VirtKey vkey, bool down) {
|
||||
switch (vkey) {
|
||||
case VIRTKEY_ANALOG_ROTATE_CW:
|
||||
if (down) {
|
||||
@@ -745,7 +745,7 @@ void ControlMapper::onVKey(int vkey, bool down) {
|
||||
|
||||
void ControlMapper::GetDebugString(char *buffer, size_t bufSize) const {
|
||||
std::stringstream str;
|
||||
for (auto iter : curInput_) {
|
||||
for (auto &iter : curInput_) {
|
||||
char temp[256];
|
||||
iter.first.FormatDebug(temp, sizeof(temp));
|
||||
str << temp << ": " << iter.second.value << std::endl;
|
||||
|
||||
@@ -21,8 +21,8 @@ public:
|
||||
// Required callbacks.
|
||||
// TODO: These are so many now that a virtual interface might be more appropriate..
|
||||
void SetCallbacks(
|
||||
std::function<void(int, bool)> onVKey,
|
||||
std::function<void(int, float)> onVKeyAnalog,
|
||||
std::function<void(VirtKey, bool)> onVKey,
|
||||
std::function<void(VirtKey, float)> onVKeyAnalog,
|
||||
std::function<void(uint32_t, uint32_t)> updatePSPButtons,
|
||||
std::function<void(int, float, float)> setPSPAnalog,
|
||||
std::function<void(int, float, float)> setRawAnalog);
|
||||
@@ -58,8 +58,8 @@ private:
|
||||
void SetPSPAxis(int deviceId, int stick, char axis, float value);
|
||||
void UpdateAnalogOutput(int stick);
|
||||
|
||||
void onVKey(int vkey, bool down);
|
||||
void onVKeyAnalog(int deviceId, int vkey, float value);
|
||||
void onVKey(VirtKey vkey, bool down);
|
||||
void onVKeyAnalog(int deviceId, VirtKey vkey, float value);
|
||||
|
||||
void UpdateCurInputAxis(const InputMapping &mapping, float value, double timestamp);
|
||||
float GetDeviceAxisThreshold(int device, const InputMapping &mapping);
|
||||
@@ -93,8 +93,8 @@ private:
|
||||
std::map<InputMapping, InputSample> curInput_;
|
||||
|
||||
// Callbacks
|
||||
std::function<void(int, bool)> onVKey_;
|
||||
std::function<void(int, float)> onVKeyAnalog_;
|
||||
std::function<void(VirtKey, bool)> onVKey_;
|
||||
std::function<void(VirtKey, float)> onVKeyAnalog_;
|
||||
std::function<void(uint32_t, uint32_t)> updatePSPButtons_;
|
||||
std::function<void(int, float, float)> setPSPAnalog_;
|
||||
std::function<void(int, float, float)> setRawAnalog_;
|
||||
|
||||
+1
-1
@@ -31,7 +31,7 @@
|
||||
#define KEYMAP_ERROR_UNKNOWN_KEY 0
|
||||
|
||||
// Don't change any of these - it'll break backwards compatibility with configs.
|
||||
enum {
|
||||
enum VirtKey {
|
||||
VIRTKEY_FIRST = 0x40000001,
|
||||
VIRTKEY_AXIS_X_MIN = 0x40000001,
|
||||
VIRTKEY_AXIS_Y_MIN = 0x40000002,
|
||||
|
||||
+34
-4
@@ -690,7 +690,7 @@ static void ShowFpsLimitNotice() {
|
||||
g_OSD.Show(OSDType::TRANSPARENT_STATUS, temp, "", "I_FASTFORWARD", 1.5f, "altspeed");
|
||||
}
|
||||
|
||||
void EmuScreen::onVKey(int virtualKeyCode, bool down) {
|
||||
void EmuScreen::onVKey(VirtKey virtualKeyCode, bool down) {
|
||||
auto sc = GetI18NCategory(I18NCat::SCREEN);
|
||||
auto mc = GetI18NCategory(I18NCat::MAPPABLECONTROLS);
|
||||
|
||||
@@ -953,13 +953,41 @@ void EmuScreen::onVKey(int virtualKeyCode, bool down) {
|
||||
"%s: %s", n->T("Enable networking"), g_Config.bEnableWlan ? di->T("Enabled") : di->T("Disabled")), 2.0, "toggle_wlan");
|
||||
}
|
||||
break;
|
||||
case VIRTKEY_EXIT_APP:
|
||||
System_ExitApp();
|
||||
default:
|
||||
// To make sure we're not in an async context.
|
||||
if (down) {
|
||||
queuedVirtKey_ = virtualKeyCode;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void EmuScreen::onVKeyAnalog(int virtualKeyCode, float value) {
|
||||
void EmuScreen::ProcessQueuedVKeys() {
|
||||
switch (queuedVirtKey_) {
|
||||
case VIRTKEY_EXIT_APP:
|
||||
{
|
||||
std::string confirmExitMessage = GetConfirmExitMessage();
|
||||
if (!confirmExitMessage.empty()) {
|
||||
auto di = GetI18NCategory(I18NCat::DIALOG);
|
||||
confirmExitMessage += '\n';
|
||||
confirmExitMessage += di->T("Are you sure you want to exit?");
|
||||
screenManager()->push(new PromptScreen(gamePath_, confirmExitMessage, di->T("Yes"), di->T("No"), [=](bool result) {
|
||||
if (result) {
|
||||
System_ExitApp();
|
||||
}
|
||||
}));
|
||||
} else {
|
||||
System_ExitApp();
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
queuedVirtKey_ = (VirtKey)0;
|
||||
}
|
||||
|
||||
void EmuScreen::onVKeyAnalog(VirtKey virtualKeyCode, float value) {
|
||||
if (virtualKeyCode != VIRTKEY_SPEED_ANALOG) {
|
||||
return;
|
||||
}
|
||||
@@ -1478,6 +1506,8 @@ ScreenRenderFlags EmuScreen::render(ScreenRenderMode mode) {
|
||||
|
||||
GamepadUpdateOpacity();
|
||||
|
||||
ProcessQueuedVKeys();
|
||||
|
||||
bool skipBufferEffects = g_Config.bSkipBufferEffects;
|
||||
|
||||
bool framebufferBound = false;
|
||||
|
||||
+6
-2
@@ -82,12 +82,14 @@ private:
|
||||
void runImDebugger();
|
||||
void renderImDebugger();
|
||||
|
||||
void onVKey(int virtualKeyCode, bool down);
|
||||
void onVKeyAnalog(int virtualKeyCode, float value);
|
||||
void onVKey(VirtKey virtualKeyCode, bool down);
|
||||
void onVKeyAnalog(VirtKey virtualKeyCode, float value);
|
||||
|
||||
void autoLoad();
|
||||
bool checkPowerDown();
|
||||
|
||||
void ProcessQueuedVKeys();
|
||||
|
||||
UI::Event OnDevMenu;
|
||||
UI::Event OnChatMenu;
|
||||
bool bootPending_ = true;
|
||||
@@ -144,6 +146,8 @@ private:
|
||||
bool keyAltRight_ = false;
|
||||
|
||||
bool lastImguiEnabled_ = false;
|
||||
|
||||
VirtKey queuedVirtKey_ = (VirtKey)0;
|
||||
};
|
||||
|
||||
bool MustRunBehind();
|
||||
|
||||
Reference in New Issue
Block a user