From 4daeb0e15c636c277af70072d5abdbfc204ba37b Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Thu, 14 May 2026 10:21:33 +0200 Subject: [PATCH] =?UTF-8?q?feat(menu):=20ESC=20tanca=20el=20joc=20tamb?= =?UTF-8?q?=C3=A9=20amb=20el=20men=C3=BA=20obert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/core/system/director.cpp | 7 ++++--- source/game/ui/service_menu.cpp | 16 +++++++++------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/source/core/system/director.cpp b/source/core/system/director.cpp index 1ef6dc2..a010c14 100644 --- a/source/core/system/director.cpp +++ b/source/core/system/director.cpp @@ -448,9 +448,10 @@ void Director::processGamepadEvents() { void Director::processMenuInput() { // Intercepta input abans que l'escena vegi els events. Amb el menú // obert, `handleEvent` consumeix tot KEY_DOWN excepte les F-keys - // (F1–F12), que són hotkeys d'UI omnipresents i passen avall a - // GlobalInputs. Quan el menú està tancat, la branca de baix detecta - // `menu_toggle` (F12 per defecte) i obre el menú. + // (F1–F12) i ESC, que són hotkeys d'UI omnipresents i passen avall + // a GlobalInputs (ESC manté la doble pulsació per a confirmar l'exit + // independentment del context). Quan el menú està tancat, la branca + // de baix detecta `menu_toggle` (F12 per defecte) i obre el menú. // Erase invalida iteradors, per això actualitzem `it` a cada branca. for (auto it = EventBuffer::events.begin(); it != EventBuffer::events.end();) { if (ServiceMenu::get().isOpen() && ServiceMenu::get().handleEvent(*it)) { diff --git a/source/game/ui/service_menu.cpp b/source/game/ui/service_menu.cpp index e435a15..ffbf6e8 100644 --- a/source/game/ui/service_menu.cpp +++ b/source/game/ui/service_menu.cpp @@ -661,7 +661,6 @@ auto ServiceMenu::handleEvent(const SDL_Event& ev) -> bool { playAcceptSound(); break; case SDL_SCANCODE_BACKSPACE: - case SDL_SCANCODE_ESCAPE: popPage(); playSelectSound(); break; @@ -669,13 +668,16 @@ auto ServiceMenu::handleEvent(const SDL_Event& ev) -> bool { break; } // Context d'entrada exclusiu: amb el menú obert, el teclat va al menú - // i les escenes no veuen res. Les F-keys (F1–F12) són hotkeys d'UI - // omnipresents (zoom, shader, screenshot, render info, menu_toggle…) - // i passen avall a GlobalInputs. Tota la resta queda absorbida — - // inclús tecles que el menú no fa servir — perquè una J en LogoScene - // no salti la secció mentre l'usuari està al menú. + // i les escenes no veuen res. Les F-keys (F1–F12) i ESC són hotkeys + // d'UI omnipresents (zoom, shader, screenshot, render info, + // menu_toggle, exit) i passen avall a GlobalInputs perquè es + // comporten igual amb el menú obert o tancat. La navegació enrere + // dins del menú queda exclusivament a BACKSPACE. Tota la resta queda + // absorbida — inclús tecles que el menú no fa servir — perquè una J + // en LogoScene no salti la secció mentre l'usuari està al menú. const bool IS_FUNCTION_KEY = SC >= SDL_SCANCODE_F1 && SC <= SDL_SCANCODE_F12; - return !IS_FUNCTION_KEY; + const bool IS_PASSTHROUGH = IS_FUNCTION_KEY || SC == SDL_SCANCODE_ESCAPE; + return !IS_PASSTHROUGH; } // --- Builders de pàgines ---