diff --git a/include/panda_sdl/frontend_sdl.hpp b/include/panda_sdl/frontend_sdl.hpp index 7d131899..c34af953 100644 --- a/include/panda_sdl/frontend_sdl.hpp +++ b/include/panda_sdl/frontend_sdl.hpp @@ -64,6 +64,11 @@ class FrontendSDL { bool keyboardAnalogY = false; bool emuPaused = false; bool returnToSelector = false; + #ifdef IMGUI_FRONTEND + bool controllerStartHeld = false; + bool controllerSelectHeld = false; + bool controllerPauseComboArmed = true; + #endif private: void setupControllerSensors(SDL_GameController* controller); diff --git a/include/panda_sdl/imgui_layer.hpp b/include/panda_sdl/imgui_layer.hpp index a7341f3b..f17df63c 100644 --- a/include/panda_sdl/imgui_layer.hpp +++ b/include/panda_sdl/imgui_layer.hpp @@ -27,6 +27,7 @@ class ImGuiLayer { void setPauseCallback(std::function callback) { onPauseChange = std::move(callback); } void setVsyncCallback(std::function callback) { onVsyncChange = std::move(callback); } void setExitToSelectorCallback(std::function callback) { onExitToSelector = std::move(callback); } + void showPauseMenuFromController(); private: void drawDebugPanel(); diff --git a/src/panda_sdl/frontend_sdl.cpp b/src/panda_sdl/frontend_sdl.cpp index 5380cdb1..7e970e9d 100644 --- a/src/panda_sdl/frontend_sdl.cpp +++ b/src/panda_sdl/frontend_sdl.cpp @@ -317,6 +317,9 @@ void FrontendSDL::run() { #ifdef IMGUI_FRONTEND int lastDrawableW = -1; int lastDrawableH = -1; + controllerStartHeld = false; + controllerSelectHeld = false; + controllerPauseComboArmed = true; #endif while (programRunning) { @@ -523,6 +526,24 @@ void FrontendSDL::run() { case SDL_CONTROLLER_BUTTON_START: key = Keys::Start; break; } + #ifdef IMGUI_FRONTEND + if (event.cbutton.button == SDL_CONTROLLER_BUTTON_START) { + controllerStartHeld = event.cbutton.state == SDL_PRESSED; + } + if (event.cbutton.button == SDL_CONTROLLER_BUTTON_BACK) { + controllerSelectHeld = event.cbutton.state == SDL_PRESSED; + } + if (event.cbutton.state == SDL_PRESSED && controllerStartHeld && controllerSelectHeld && controllerPauseComboArmed) { + controllerPauseComboArmed = false; + if (imgui) { + imgui->showPauseMenuFromController(); + } + } + if (event.cbutton.state == SDL_RELEASED && (!controllerStartHeld && !controllerSelectHeld)) { + controllerPauseComboArmed = true; + } + #endif + if (key != 0) { if (event.cbutton.state == SDL_PRESSED) { hid.pressKey(key); diff --git a/src/panda_sdl/imgui_layer.cpp b/src/panda_sdl/imgui_layer.cpp index d1451a5c..4357e601 100644 --- a/src/panda_sdl/imgui_layer.cpp +++ b/src/panda_sdl/imgui_layer.cpp @@ -236,6 +236,16 @@ void ImGuiLayer::handleHotkey(const SDL_Event& event) { } } +void ImGuiLayer::showPauseMenuFromController() { + if (!showPauseMenu) { + showPauseMenu = true; + if (onPauseChange) { + isPaused = true; + onPauseChange(true); + } + } +} + std::optional ImGuiLayer::runGameSelector() { std::vector games = scanAllGames(); bool showNoRom = games.empty();