fix(define-inputs): deixa passar QUIT i ESC al pipeline global

L'overlay de redefinicio engolia tots els events mentre estava actiu, fet
que impedia tancar la finestra amb l'aspa (SDL_EVENT_QUIT) i deixava
prendre ESC com a cancel-lacio del rebind. Ara:
- QUIT i WINDOW_CLOSE_REQUESTED passen sempre al global per tancar
  l'aplicacio des de l'aspa.
- ESC ja no cancel-la la sequencia; cau al global on obre el prompt
  d'eixida com a la resta del joc.
- isReservedScancode (ESC/F1-F12/RETURN/BACKSPACE/TAB) deixa passar.

Tambe ajusta DISPAR -> DISPARAR a ca.yaml i treu el hint "ESC PER
CANCEL-LAR" del modal i les claus de locale corresponents.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-24 21:20:25 +02:00
parent 120c5502fd
commit 85050c8da4
4 changed files with 21 additions and 22 deletions
+1 -2
View File
@@ -103,11 +103,10 @@ define:
press_button: "PREMEU UN BOTO" press_button: "PREMEU UN BOTO"
complete: "CONFIGURACIO COMPLETA" complete: "CONFIGURACIO COMPLETA"
no_gamepad: "CAP MANDO ASSIGNAT AL JUGADOR" no_gamepad: "CAP MANDO ASSIGNAT AL JUGADOR"
cancel_hint: "ESC PER CANCEL-LAR"
action: action:
left: "ESQUERRA" left: "ESQUERRA"
right: "DRETA" right: "DRETA"
fire: "DISPAR" fire: "DISPARAR"
accelerate: "ACCELERAR" accelerate: "ACCELERAR"
start: "START" start: "START"
menu: "MENU" menu: "MENU"
-1
View File
@@ -102,7 +102,6 @@ define:
press_button: "PRESS A BUTTON" press_button: "PRESS A BUTTON"
complete: "CONFIGURATION COMPLETE" complete: "CONFIGURATION COMPLETE"
no_gamepad: "NO GAMEPAD ASSIGNED TO PLAYER" no_gamepad: "NO GAMEPAD ASSIGNED TO PLAYER"
cancel_hint: "ESC TO CANCEL"
action: action:
left: "LEFT" left: "LEFT"
right: "RIGHT" right: "RIGHT"
+15 -16
View File
@@ -252,22 +252,20 @@ namespace System {
return true; // Empassem la resta sense fer res return true; // Empassem la resta sense fer res
} }
const SDL_Scancode SC = event.key.scancode; const SDL_Scancode SC = event.key.scancode;
if (SC == SDL_SCANCODE_ESCAPE) {
cancel();
return true;
}
if (isReservedScancode(SC)) { if (isReservedScancode(SC)) {
return true; // Ignorada // ESC, F1-F12, RETURN, BACKSPACE, TAB es deixen passar al pipeline
// global (ESC obre el prompt d'eixida; F1-F12 hotkeys, etc.).
return false;
} }
captureAndAdvance(scancodeToInt(SC)); captureAndAdvance(scancodeToInt(SC));
return true; return true;
} }
auto DefineInputs::handleGamepadEvent(const SDL_Event& event) -> bool { auto DefineInputs::handleGamepadEvent(const SDL_Event& event) -> bool {
// ESC al teclat tambe cancel·la durant rebind del mando. // KEY_DOWN no es per al rebind de mando: deixem que el global el
if (event.type == SDL_EVENT_KEY_DOWN && event.key.scancode == SDL_SCANCODE_ESCAPE) { // gestioni (ex. ESC → prompt d'eixida, F12 → tanca menu, etc.).
cancel(); if (event.type == SDL_EVENT_KEY_DOWN) {
return true; return false;
} }
// Filtrar events al pad del jugador actiu. // Filtrar events al pad del jugador actiu.
@@ -312,8 +310,15 @@ namespace System {
if (phase_ == Phase::INACTIVE) { if (phase_ == Phase::INACTIVE) {
return false; return false;
} }
// SDL_EVENT_QUIT i WINDOW_CLOSE_REQUESTED han de poder tancar la
// finestra encara que el modal estiga obert; els passem al pipeline.
if (event.type == SDL_EVENT_QUIT ||
event.type == SDL_EVENT_WINDOW_CLOSE_REQUESTED) {
return false;
}
if (phase_ == Phase::COMPLETE) { if (phase_ == Phase::COMPLETE) {
// Mentre mostrem el missatge OK, empassem els events sense capturar. // Mentre mostrem el missatge OK, empassem la resta d'events sense
// capturar perque l'usuari no puga avançar accions sense voler.
return true; return true;
} }
if (mode_ == Mode::KEYBOARD) { if (mode_ == Mode::KEYBOARD) {
@@ -390,12 +395,6 @@ namespace System {
const float PROG_X = BOX_X + ((BOX_W - PROG_W) * 0.5F); const float PROG_X = BOX_X + ((BOX_W - PROG_W) * 0.5F);
const float PROG_Y = BOX_Y + 200.0F; const float PROG_Y = BOX_Y + 200.0F;
text_.render(PROGRESS, Vec2{.x = PROG_X, .y = PROG_Y}, PROG_SCALE, TEXT_SPACING, 1.0F, LABEL_COLOR); text_.render(PROGRESS, Vec2{.x = PROG_X, .y = PROG_Y}, PROG_SCALE, TEXT_SPACING, 1.0F, LABEL_COLOR);
const std::string CANCEL_HINT = Locale::get().text("define.cancel_hint");
const float CH_W = Graphics::VectorText::getTextWidth(CANCEL_HINT, PROG_SCALE, TEXT_SPACING);
const float CH_X = BOX_X + ((BOX_W - CH_W) * 0.5F);
const float CH_Y = BOX_Y + BOX_H - 30.0F;
text_.render(CANCEL_HINT, Vec2{.x = CH_X, .y = CH_Y}, PROG_SCALE, TEXT_SPACING, 1.0F, SEPARATOR_COLOR);
} }
} // namespace System } // namespace System
+5 -3
View File
@@ -51,14 +51,16 @@ namespace GlobalEvents {
return false; return false;
} }
// Si l'overlay de redefinicio esta actiu, engoleix tots els events. // Engoleix els events que DefineInputs vol consumir mentre l'overlay
// es actiu. Els events que el modul torna a passar (QUIT, ESC) cauen
// cap al pipeline normal i poden tancar la finestra o obrir el prompt
// d'eixida sense haver de completar la sequencia.
auto consumeIfDefineActive(const SDL_Event& event) -> bool { auto consumeIfDefineActive(const SDL_Event& event) -> bool {
auto* di = System::DefineInputs::get(); auto* di = System::DefineInputs::get();
if (di == nullptr || !di->isActive()) { if (di == nullptr || !di->isActive()) {
return false; return false;
} }
di->handleEvent(event); return di->handleEvent(event);
return true;
} }
// Botó MENU al mando d'algun jugador → alterna el menú de servei // Botó MENU al mando d'algun jugador → alterna el menú de servei