correccions en la detecció de mandos
This commit is contained in:
@@ -125,8 +125,8 @@ void Director::init() {
|
||||
Options::video.fullscreen = true;
|
||||
Options::video.integer_scale = true;
|
||||
#endif
|
||||
loadParams(); // Carga los parámetros del programa
|
||||
loadScoreFile(); // Carga el archivo de puntuaciones
|
||||
loadParams(); // Carga los parámetros del programa
|
||||
loadScoreFile(); // Carga el archivo de puntuaciones
|
||||
|
||||
// Inicialización de subsistemas principales
|
||||
Lang::setLanguage(Options::settings.language); // Carga el archivo de idioma
|
||||
@@ -435,6 +435,15 @@ auto Director::iterate() -> SDL_AppResult {
|
||||
return SDL_APP_SUCCESS;
|
||||
}
|
||||
|
||||
// En el primer frame, SDL ya ha drenado los SDL_EVENT_GAMEPAD_ADDED de los
|
||||
// mandos conectados al iniciar. A partir de ahora los eventos sí son hotplug
|
||||
// real y deben mostrar notificación.
|
||||
static bool first_iterate = true;
|
||||
if (first_iterate) {
|
||||
first_iterate = false;
|
||||
GlobalEvents::markStartupComplete();
|
||||
}
|
||||
|
||||
// Gestiona las transiciones entre secciones (destruye la anterior y construye la nueva)
|
||||
handleSectionTransition();
|
||||
|
||||
|
||||
@@ -17,12 +17,28 @@
|
||||
#include "game/ui/service_menu.hpp" // Para ServiceMenu
|
||||
|
||||
namespace GlobalEvents {
|
||||
namespace {
|
||||
// Durante el arranque se drenan los SDL_EVENT_GAMEPAD_ADDED de los mandos
|
||||
// ya conectados. Esos eventos sí deben reasignar mandos a jugadores, pero
|
||||
// no deben mostrar notificación: no son hotplug, son detección inicial.
|
||||
bool startup_in_progress = true;
|
||||
} // namespace
|
||||
|
||||
// Comprueba los eventos de Input y muestra notificaciones
|
||||
void handleInputEvents(const SDL_Event& event) {
|
||||
if (event.type != SDL_EVENT_GAMEPAD_ADDED && event.type != SDL_EVENT_GAMEPAD_REMOVED) {
|
||||
return;
|
||||
}
|
||||
|
||||
static auto* input_ = Input::get();
|
||||
auto message = input_->handleEvent(event);
|
||||
|
||||
if (message.empty()) {
|
||||
// Reasignar siempre: tanto en arranque como en hotplug en caliente.
|
||||
Options::gamepad_manager.assignAndLinkGamepads();
|
||||
Options::gamepad_manager.resyncGamepadsWithPlayers();
|
||||
ServiceMenu::get()->refresh();
|
||||
|
||||
if (startup_in_progress || message.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -35,10 +51,11 @@ namespace GlobalEvents {
|
||||
message.replace(pos, std::string(" DISCONNECTED").length(), " " + Lang::getText("[NOTIFICATIONS] DISCONNECTED"));
|
||||
}
|
||||
|
||||
Options::gamepad_manager.assignAndLinkGamepads();
|
||||
Options::gamepad_manager.resyncGamepadsWithPlayers();
|
||||
Notifier::get()->show({message});
|
||||
ServiceMenu::get()->refresh();
|
||||
}
|
||||
|
||||
void markStartupComplete() {
|
||||
startup_in_progress = false;
|
||||
}
|
||||
|
||||
// Comprueba los eventos que se pueden producir en cualquier sección del juego
|
||||
|
||||
@@ -6,4 +6,10 @@
|
||||
namespace GlobalEvents {
|
||||
// --- Funciones ---
|
||||
void handle(const SDL_Event& event); // Comprueba los eventos que se pueden producir en cualquier sección del juego
|
||||
|
||||
// Marca el fin del arranque: a partir de aquí, los eventos de mando
|
||||
// generan notificaciones en pantalla. Se debe llamar desde Director::iterate
|
||||
// en el primer fotograma, después de que SDL haya drenado los
|
||||
// SDL_EVENT_GAMEPAD_ADDED de los mandos ya conectados al iniciar.
|
||||
void markStartupComplete();
|
||||
} // namespace GlobalEvents
|
||||
Reference in New Issue
Block a user