From 8b0537d627b49525938f11baf5bc24b16190c711 Mon Sep 17 00:00:00 2001
From: Joseph Walton-Rivers <joseph@walton-rivers.uk>
Date: Sat, 11 Sep 2021 21:09:47 +0100
Subject: [PATCH] add controller name support

---
 demo/main.cpp          |  2 +-
 fggl/gfx/window.cpp    |  3 ++-
 fggl/input/gamepad.hpp | 14 ++++++++++++++
 3 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/demo/main.cpp b/demo/main.cpp
index 70aa8b2..ab6c4d9 100644
--- a/demo/main.cpp
+++ b/demo/main.cpp
@@ -292,7 +292,7 @@ int main(int argc, char* argv[]) {
 		auto& gamepads = inputs->gamepads;
 		ImGui::Begin("GamePad", &gamepadWindow);
 		for ( int i=0; i<16; i++ ) {
-			std::string title = "GamePad " + std::to_string(i);
+			std::string title = gamepads.name(i);
 
 			bool present = gamepads.present(i);
 			if ( ImGui::TreeNode(title.c_str()) ) {
diff --git a/fggl/gfx/window.cpp b/fggl/gfx/window.cpp
index 898a3b1..f16bc05 100644
--- a/fggl/gfx/window.cpp
+++ b/fggl/gfx/window.cpp
@@ -49,12 +49,13 @@ static void fggl_input_keyboard(GLFWwindow* window, int key, int scancode, int a
 }
 
 static void fggl_update_joystick(fggl::input::GamepadInput& input, int jid) {
-	//glfwGetJoystickName(jid);
 	bool isGamepad = glfwJoystickIsGamepad(jid);
 
 	if ( isGamepad ) {
 		if( !input.present(jid) ) {
+			std::string name = glfwGetJoystickName(jid);
 			input.setActive(jid, true);
+			input.name(jid, name);
 		}
 
 		GLFWgamepadstate state;
diff --git a/fggl/input/gamepad.hpp b/fggl/input/gamepad.hpp
index 069e249..96a3ada 100644
--- a/fggl/input/gamepad.hpp
+++ b/fggl/input/gamepad.hpp
@@ -108,6 +108,19 @@ namespace fggl::input {
 				return m_active[id];
 			}
 
+			inline void name(size_t id, const std::string& name) {
+				assert( id < MaxControllers );
+				m_names[id] = name;
+			}
+
+			inline std::string name(size_t id) const {
+				std::string name = m_names[id].empty() ? "gamepad "+std::to_string(id) : m_names[id];
+				if ( !present(id) ) {
+					return name + " (disconnected)";
+				}
+				return name;
+			}
+
 			inline float axis(size_t id, GamepadAxis axis) const {
 				if ( !present(id) ) {
 					return 0.0f;
@@ -166,6 +179,7 @@ namespace fggl::input {
 
 		private:
 			std::bitset<MaxControllers> m_active;
+			std::array<std::string, MaxControllers> m_names;
 			std::array<GamepadState, MaxControllers> m_current;
 			std::array<GamepadState, MaxControllers> m_previous;
 	};
-- 
GitLab