Simple GUI tool to create and modify gamepad mappings for games that use the SDL2 Game Controller API.
Created as an alternative to the Steam Big Picture gamepad configurator.

The codebase follows a modular structure:
src/
main.cpp Entry point
ui/ UI layer (MainWindow, .ui form)
core/ Core logic
SDLPollEvent SDL event loop on a QThread
GamepadMapper Mapping state machine (binding wizard)
GamepadDatabase Controller DB file management
JoystickEnumerator Joystick discovery helper
Logger Centralized logging (console + UI signal)
network/ Network utilities
FileDownloader HTTP GET wrapper
platform/ Platform abstractions
Environment Abstract env var interface (Linux/Mac/Win)
resources/ Icons, images, .qrc files, gamecontrollerdb.txt
tests/ QtTest unit tests (6 suites)
scripts/ Build and packaging scripts
Thread model: MainWindow runs on the main Qt event loop. SDLPollEvent runs SDL_PollEvent on a QThread, communicating via Qt signals and std::atomic<bool> flags.
sudo apt install build-essential cmake qtbase5-dev libqt5network5-dev libsdl2-dev
mkdir build && cd build
cmake ..
make -j$(nproc)
brew install qt@6 sdl2
scripts/build_macos.sh
This produces a universal binary (Intel + Apple Silicon) app bundle at build/src/gamepad-tool.app with Qt frameworks bundled.
To create a distributable DMG:
scripts/package_macos.sh
AppImage (portable, single file):
scripts/package_linux_appimage.sh
Debian package (depends on system Qt5/SDL2):
scripts/package_linux_deb.sh
Tarball with bundled libraries:
scripts/package_linux_tarball.sh
Requires Qt 6 with the MinGW kit installed via the Qt Online Installer.
scripts/build_windows.sh
The script auto-detects Qt and MinGW under C:/Qt. Set QT_BASE, QT_VERSION, MINGW_KIT, or MINGW_DIR to override.
Binary: build/src/gamepad-tool.exe
To create a distributable ZIP:
scripts/package_windows.sh
This runs windeployqt automatically and packages the exe with all required Qt DLLs and plugins into SDL2-Gamepad-Tool-<version>-windows-x64.zip.
cd build
ctest --output-on-failure
Tests cover: SDLPollEvent state transitions, GamepadMapper binding logic, GamepadDatabase file operations, Logger, JoystickEnumerator, and Environment interface.
cd build
sudo make install
This installs the binary to /usr/local/bin/ and the desktop file and icon to the appropriate XDG directories.
ctest --output-on-failure before submittingMIT License. See LICENSE for details.
C++
81.2%
CMake
9.4%
Shell
9.4%
Simple GUI tool to create and modify gamepad mappings for games that use the SDL2 Game Controller API.
Created as an alternative to the Steam Big Picture gamepad configurator.

The codebase follows a modular structure:
src/
main.cpp Entry point
ui/ UI layer (MainWindow, .ui form)
core/ Core logic
SDLPollEvent SDL event loop on a QThread
GamepadMapper Mapping state machine (binding wizard)
GamepadDatabase Controller DB file management
JoystickEnumerator Joystick discovery helper
Logger Centralized logging (console + UI signal)
network/ Network utilities
FileDownloader HTTP GET wrapper
platform/ Platform abstractions
Environment Abstract env var interface (Linux/Mac/Win)
resources/ Icons, images, .qrc files, gamecontrollerdb.txt
tests/ QtTest unit tests (6 suites)
scripts/ Build and packaging scripts
Thread model: MainWindow runs on the main Qt event loop. SDLPollEvent runs SDL_PollEvent on a QThread, communicating via Qt signals and std::atomic<bool> flags.
sudo apt install build-essential cmake qtbase5-dev libqt5network5-dev libsdl2-dev
mkdir build && cd build
cmake ..
make -j$(nproc)
brew install qt@6 sdl2
scripts/build_macos.sh
This produces a universal binary (Intel + Apple Silicon) app bundle at build/src/gamepad-tool.app with Qt frameworks bundled.
To create a distributable DMG:
scripts/package_macos.sh
AppImage (portable, single file):
scripts/package_linux_appimage.sh
Debian package (depends on system Qt5/SDL2):
scripts/package_linux_deb.sh
Tarball with bundled libraries:
scripts/package_linux_tarball.sh
Requires Qt 6 with the MinGW kit installed via the Qt Online Installer.
scripts/build_windows.sh
The script auto-detects Qt and MinGW under C:/Qt. Set QT_BASE, QT_VERSION, MINGW_KIT, or MINGW_DIR to override.
Binary: build/src/gamepad-tool.exe
To create a distributable ZIP:
scripts/package_windows.sh
This runs windeployqt automatically and packages the exe with all required Qt DLLs and plugins into SDL2-Gamepad-Tool-<version>-windows-x64.zip.
cd build
ctest --output-on-failure
Tests cover: SDLPollEvent state transitions, GamepadMapper binding logic, GamepadDatabase file operations, Logger, JoystickEnumerator, and Environment interface.
cd build
sudo make install
This installs the binary to /usr/local/bin/ and the desktop file and icon to the appropriate XDG directories.
ctest --output-on-failure before submittingMIT License. See LICENSE for details.
C++
81.2%
CMake
9.4%
Shell
9.4%