diff --git a/desktop_version/src/ButtonGlyphs.cpp b/desktop_version/src/ButtonGlyphs.cpp index 05e0bb08..d6f6da5c 100644 --- a/desktop_version/src/ButtonGlyphs.cpp +++ b/desktop_version/src/ButtonGlyphs.cpp @@ -167,6 +167,44 @@ void BUTTONGLYPHS_keyboard_set_active(bool active) keyboard_is_active = active; } +void BUTTONGLYPHS_update_layout(Uint16 vendor, Uint16 product) +{ + if (vendor == 0x054c) + { + layout = LAYOUT_PLAYSTATION; + } + else if (vendor == 0x28de) + { + layout = LAYOUT_DECK; + } + else if (vendor == 0x057e) + { + if (product == 0x2006) + { + layout = LAYOUT_NINTENDO_SWITCH_JOYCON_L; + } + else if (product == 0x2007) + { + layout = LAYOUT_NINTENDO_SWITCH_JOYCON_R; + } + else + { + layout = LAYOUT_NINTENDO_SWITCH_PRO; + } + } + else if (vendor == 0x2dc8) /* 8BitDo */ + { + layout = LAYOUT_NINTENDO_SWITCH_PRO; + } + else + { + /* For now we assume Xbox (0x045e), Generic will be used when + * migrating to SDL_ActionSet + */ + layout = LAYOUT_XBOX; + } +} + const char* BUTTONGLYPHS_get_wasd_text(void) { /* Returns the string to use in Welcome Aboard */ diff --git a/desktop_version/src/ButtonGlyphs.h b/desktop_version/src/ButtonGlyphs.h index 47f30022..223dd86c 100644 --- a/desktop_version/src/ButtonGlyphs.h +++ b/desktop_version/src/ButtonGlyphs.h @@ -17,6 +17,8 @@ bool BUTTONGLYPHS_keyboard_is_available(void); bool BUTTONGLYPHS_keyboard_is_active(void); void BUTTONGLYPHS_keyboard_set_active(bool active); +void BUTTONGLYPHS_update_layout(Uint16 vendor, Uint16 product); + const char* BUTTONGLYPHS_get_wasd_text(void); const char* BUTTONGLYPHS_get_button(ActionSet actionset, Action action, int binding); diff --git a/desktop_version/src/KeyPoll.cpp b/desktop_version/src/KeyPoll.cpp index 9f2dc810..0bc35eb7 100644 --- a/desktop_version/src/KeyPoll.cpp +++ b/desktop_version/src/KeyPoll.cpp @@ -144,6 +144,7 @@ void KeyPoll::Poll(void) bool hidemouse = false; bool altpressed = false; bool fullscreenkeybind = false; + SDL_GameController *controller = NULL; SDL_Event evt; while (SDL_PollEvent(&evt)) { @@ -276,6 +277,12 @@ void KeyPoll::Poll(void) case SDL_CONTROLLERBUTTONDOWN: buttonmap[(SDL_GameControllerButton) evt.cbutton.button] = true; BUTTONGLYPHS_keyboard_set_active(false); + + controller = controllers[evt.cbutton.which]; + BUTTONGLYPHS_update_layout( + SDL_GameControllerGetVendor(controller), + SDL_GameControllerGetProduct(controller) + ); break; case SDL_CONTROLLERBUTTONUP: buttonmap[(SDL_GameControllerButton) evt.cbutton.button] = false; @@ -309,26 +316,36 @@ void KeyPoll::Poll(void) break; } BUTTONGLYPHS_keyboard_set_active(false); + + controller = controllers[evt.caxis.which]; + BUTTONGLYPHS_update_layout( + SDL_GameControllerGetVendor(controller), + SDL_GameControllerGetProduct(controller) + ); break; } case SDL_CONTROLLERDEVICEADDED: { - SDL_GameController *toOpen = SDL_GameControllerOpen(evt.cdevice.which); + controller = SDL_GameControllerOpen(evt.cdevice.which); vlog_info( "Opened SDL_GameController ID #%i, %s", evt.cdevice.which, - SDL_GameControllerName(toOpen) + SDL_GameControllerName(controller) ); - controllers[SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(toOpen))] = toOpen; + controllers[SDL_JoystickInstanceID(SDL_GameControllerGetJoystick(controller))] = controller; BUTTONGLYPHS_keyboard_set_active(false); + BUTTONGLYPHS_update_layout( + SDL_GameControllerGetVendor(controller), + SDL_GameControllerGetProduct(controller) + ); break; } case SDL_CONTROLLERDEVICEREMOVED: { - SDL_GameController *toClose = controllers[evt.cdevice.which]; + controller = controllers[evt.cdevice.which]; controllers.erase(evt.cdevice.which); - vlog_info("Closing %s", SDL_GameControllerName(toClose)); - SDL_GameControllerClose(toClose); + vlog_info("Closing %s", SDL_GameControllerName(controller)); + SDL_GameControllerClose(controller); if (controllers.empty()) { BUTTONGLYPHS_keyboard_set_active(true);