feat(input): carrega gamecontrollerdb i corregeix l'ordre d'assignació de mandos

This commit is contained in:
JailDesigner committed 2026-04-25 10:32:09 +02:00
1 parent 4f1a3260a5
commit c77f90f6b6
5 files changed
+2276 -16

No files matched your search

+19 -4
View File
@@ -150,10 +150,15 @@ void GamepadManager::init() {
return;
}
// `gamecontrollerdb.txt` és opcional. Si no existeix, SDL retorna -1 i
// continuem amb les definicions internes del sistema.
const int ADDED = SDL_AddGamepadMappingsFromFile("data/input/gamecontrollerdb.txt");
if (ADDED > 0) {
std::cout << "GamepadManager: " << ADDED << " mappings de gamecontrollerdb.txt\n";
// continuem amb les definicions internes del sistema. Sempre informem
// del resultat per facilitar el diagnòstic de mandos no reconeguts.
static constexpr const char* DB_PATH = "data/input/gamecontrollerdb.txt";
const int ADDED = SDL_AddGamepadMappingsFromFile(DB_PATH);
if (ADDED < 0) {
std::cout << "GamepadManager: no s'ha pogut carregar " << DB_PATH
<< ": " << SDL_GetError() << '\n';
} else {
std::cout << "GamepadManager: " << ADDED << " mappings carregats de " << DB_PATH << '\n';
}
int count = 0;
@@ -164,6 +169,7 @@ void GamepadManager::init() {
}
SDL_free(ids);
}
std::cout << "GamepadManager: " << entries_.size() << " mando(s) detectat(s) a l'inici\n";
initialized_ = true;
}
@@ -262,6 +268,15 @@ void GamepadManager::assignToPlayer(int player_id, const std::string& name, cons
}
}
}
// Traç de l'assignació persistida (vinculada o pendent) perquè quede
// visible a la consola igual que les autoassignacions.
if (a.pad != nullptr) {
std::cout << "GamepadManager: assignat " << a.name
<< " → P" << (player_id + 1) << '\n';
} else {
std::cout << "GamepadManager: P" << (player_id + 1) << " pendent ("
<< (a.name.empty() ? a.path : a.name) << " no connectat)\n";
}
}
void GamepadManager::unassignFromPlayer(int player_id) {
+10 -5
View File
@@ -65,6 +65,16 @@ Director::Director() {
// Prepara la carpeta de sistema (~/.config/jailgames/aee_2026/) i carrega
// les opcions; si no existeix config.yaml el crea amb els defaults.
createSystemFolder();
// Gamepad: descobreix mandos presents silenciosament. Cal fer-ho ABANS
// de `Options::loadFromFile`, ja que aquesta crida internament a
// `applyControlsToGamepadManager` (rebind d'assignacions persistides +
// auto-assign de slots buits) i necessita que `entries_` ja estiga
// poblat per a poder casar mandos↔jugadors. A partir d'ara els events
// SDL_EVENT_GAMEPAD_ADDED/REMOVED arribaran via `processGamepadEvents()`
// i dispararan notificacions.
GamepadManager::get().init();
Options::setConfigFile(system_folder_ + "config.yaml");
if (!Options::loadFromFile()) {
std::cerr << "Director: no s'ha pogut carregar ni desar config.yaml a " << system_folder_ << '\n';
@@ -121,11 +131,6 @@ Director::Director() {
// JA_Music_t que continga, així que no queden streams orfes.
Audio::init(Options::buildAudioConfig());
// Gamepad: descobreix mandos presents silenciosament. A partir d'ara
// els events SDL_EVENT_GAMEPAD_ADDED/REMOVED arribaran via
// `processGamepadEvents()` i dispararan notificacions.
GamepadManager::get().init();
// Font compartida pels overlays: construïm una sola instància de Text
// i la injectem als consumidors (Notifier, RenderInfo) per a que cap
// d'ells hagi de conèixer els noms dels recursos concrets.