From 91614fc545fdedfba61b0c1d4f15ffd9166d6ff1 Mon Sep 17 00:00:00 2001 From: Sergio Valor Date: Sat, 25 Apr 2026 10:36:55 +0200 Subject: [PATCH] fix(input): mou gamecontrollerdb.txt a l'arrel i el copia al build/ via CMake --- CMakeLists.txt | 20 +++++++++++++++++++ Makefile | 9 +++++---- ...mecontrollerdb.txt => gamecontrollerdb.txt | 0 source/core/input/gamepad_manager.cpp | 20 ++++++++++++------- 4 files changed, 38 insertions(+), 11 deletions(-) rename data/input/gamecontrollerdb.txt => gamecontrollerdb.txt (100%) diff --git a/CMakeLists.txt b/CMakeLists.txt index f5944c1..49bcd8b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -203,6 +203,26 @@ add_custom_command( add_custom_target(resource_pack ALL DEPENDS ${RESOURCE_PACK}) add_dependencies(${PROJECT_NAME} resource_pack) +# --- CÒPIA DE gamecontrollerdb.txt AL COSTAT DEL BINARI --- +# SDL_AddGamepadMappingsFromFile només llegeix del filesystem real (no del +# pack), així que el fitxer ha de viure al directori del binari. Es copia +# només si existeix per no fallar la build d'algú que encara no ha fet +# `make controllerdb`. +if(EXISTS "${CMAKE_SOURCE_DIR}/gamecontrollerdb.txt") + set(CONTROLLER_DB "${CMAKE_BINARY_DIR}/gamecontrollerdb.txt") + add_custom_command( + OUTPUT ${CONTROLLER_DB} + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${CMAKE_SOURCE_DIR}/gamecontrollerdb.txt" + "${CONTROLLER_DB}" + DEPENDS "${CMAKE_SOURCE_DIR}/gamecontrollerdb.txt" + COMMENT "Copiant gamecontrollerdb.txt → build/" + VERBATIM + ) + add_custom_target(controller_db ALL DEPENDS ${CONTROLLER_DB}) + add_dependencies(${PROJECT_NAME} controller_db) +endif() + target_compile_options(${PROJECT_NAME} PRIVATE -Wall -Wextra -Wpedantic) target_compile_definitions(${PROJECT_NAME} PRIVATE $<$:_DEBUG> diff --git a/Makefile b/Makefile index ae4056b..0b62e8e 100644 --- a/Makefile +++ b/Makefile @@ -62,12 +62,13 @@ pack: @./$(BUILDDIR)/pack_resources data $(BUILDDIR)/resources.pack # Descàrrega de la base de dades de mappings de mandos. SDL només pot -# obrir-la des del filesystem (no del pack), per això viu a data/input/. +# obrir-la des del filesystem (no del pack), per això viu a l'arrel del +# projecte i CMake la copia al costat del binari a cada build. controllerdb: @echo "Descarregant gamecontrollerdb.txt..." @curl -fsSL https://raw.githubusercontent.com/mdqinc/SDL_GameControllerDB/master/gamecontrollerdb.txt \ - -o data/input/gamecontrollerdb.txt - @echo "data/input/gamecontrollerdb.txt actualitzat" + -o gamecontrollerdb.txt + @echo "gamecontrollerdb.txt actualitzat" # ============================================================================== # CODE QUALITY (delegados a cmake) @@ -118,7 +119,7 @@ help: @echo "" @echo " Recursos:" @echo " make pack - Empaquetar data/ a $(BUILDDIR)/resources.pack (format AE26)" - @echo " make controllerdb - Descarregar data/input/gamecontrollerdb.txt actualitzat" + @echo " make controllerdb - Descarregar gamecontrollerdb.txt actualitzat (arrel)" @echo "" @echo " Qualitat de codi:" @echo " make format - Formatar codi amb clang-format" diff --git a/data/input/gamecontrollerdb.txt b/gamecontrollerdb.txt similarity index 100% rename from data/input/gamecontrollerdb.txt rename to gamecontrollerdb.txt diff --git a/source/core/input/gamepad_manager.cpp b/source/core/input/gamepad_manager.cpp index b9bff2f..d7e9073 100644 --- a/source/core/input/gamepad_manager.cpp +++ b/source/core/input/gamepad_manager.cpp @@ -149,16 +149,22 @@ void GamepadManager::init() { << SDL_GetError() << '\n'; return; } - // `gamecontrollerdb.txt` és opcional. Si no existeix, SDL retorna -1 i - // 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); + // `gamecontrollerdb.txt` és opcional. Viu a l'arrel del projecte + // (no a `data/`) perquè SDL_AddGamepadMappingsFromFile només sap + // llegir del filesystem real, no del pack. CMake el copia al costat + // del binari a cada build perquè SDL_GetBasePath el trobi tant en + // dev com en release. Sempre informem del resultat per facilitar el + // diagnòstic de mandos no reconeguts. + std::string db_path = "gamecontrollerdb.txt"; + if (const char* base = SDL_GetBasePath()) { + db_path = std::string(base) + "gamecontrollerdb.txt"; + } + const int ADDED = SDL_AddGamepadMappingsFromFile(db_path.c_str()); if (ADDED < 0) { - std::cout << "GamepadManager: no s'ha pogut carregar " << DB_PATH + std::cout << "GamepadManager: no s'ha pogut carregar " << db_path << ": " << SDL_GetError() << '\n'; } else { - std::cout << "GamepadManager: " << ADDED << " mappings carregats de " << DB_PATH << '\n'; + std::cout << "GamepadManager: " << ADDED << " mappings carregats de " << db_path << '\n'; } int count = 0;