From d2bf16b8723f69224cdeaa20699c61144df66a66 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 23 Jan 2017 23:38:13 -0800 Subject: [PATCH] Qt: Automatically load controller profile when plugged in --- CHANGES | 1 + src/platform/qt/InputController.cpp | 7 ++++++- src/platform/qt/InputController.h | 2 +- src/platform/sdl/sdl-events.c | 24 +++++++++++++++--------- src/platform/sdl/sdl-events.h | 2 +- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/CHANGES b/CHANGES index dd5a6f692..ef7f37469 100644 --- a/CHANGES +++ b/CHANGES @@ -54,6 +54,7 @@ Misc: - CMake: Add ability to just print version string - Qt: Merge "Save" and "OK" buttons in shader options - SDL: Automatically map controllers when plugged in + - Qt: Automatically load controller profile when plugged in 0.5.2: (2016-12-31) Bugfixes: diff --git a/src/platform/qt/InputController.cpp b/src/platform/qt/InputController.cpp index e5e53050c..8d8501ade 100644 --- a/src/platform/qt/InputController.cpp +++ b/src/platform/qt/InputController.cpp @@ -286,7 +286,12 @@ void InputController::bindKey(uint32_t type, int key, GBAKey gbaKey) { void InputController::updateJoysticks() { #ifdef BUILD_SDL - mSDLUpdateJoysticks(&s_sdlEvents); + QString profile = profileForType(SDL_BINDING_BUTTON); + mSDLUpdateJoysticks(&s_sdlEvents, m_config->input()); + QString newProfile = profileForType(SDL_BINDING_BUTTON); + if (profile != newProfile) { + loadProfile(SDL_BINDING_BUTTON, newProfile); + } #endif } diff --git a/src/platform/qt/InputController.h b/src/platform/qt/InputController.h index b2ad1a715..95382ce80 100644 --- a/src/platform/qt/InputController.h +++ b/src/platform/qt/InputController.h @@ -64,7 +64,7 @@ public: void bindAxis(uint32_t type, int axis, GamepadAxisEvent::Direction, GBAKey); void unbindAllAxes(uint32_t type); - void bindHat(uint32_t type, int hat, GamepadHatEvent::Direction, GBAKey); + void bindHat(uint32_t type, int hat, GamepadHatEvent::Direction, GBAKey); QStringList connectedGamepads(uint32_t type) const; int gamepad(uint32_t type) const; diff --git a/src/platform/sdl/sdl-events.c b/src/platform/sdl/sdl-events.c index 5acf28c38..81eaffff2 100644 --- a/src/platform/sdl/sdl-events.c +++ b/src/platform/sdl/sdl-events.c @@ -59,7 +59,7 @@ bool mSDLInitEvents(struct mSDLEvents* context) { int nJoysticks = SDL_NumJoysticks(); SDL_JoystickListInit(&context->joysticks, nJoysticks); if (nJoysticks > 0) { - mSDLUpdateJoysticks(context); + mSDLUpdateJoysticks(context, NULL); // Some OSes don't do hotplug detection if (!SDL_JoystickListSize(&context->joysticks)) { int i; @@ -325,7 +325,7 @@ void mSDLPlayerChangeJoystick(struct mSDLEvents* events, struct mSDLPlayer* play player->joystick = SDL_JoystickListGetPointer(&events->joysticks, index); } -void mSDLUpdateJoysticks(struct mSDLEvents* events) { +void mSDLUpdateJoysticks(struct mSDLEvents* events, const struct Configuration* config) { // Pump SDL joystick events without eating the rest of the events SDL_JoystickUpdate(); #if SDL_VERSION_ATLEAST(2, 0, 0) @@ -339,20 +339,23 @@ void mSDLUpdateJoysticks(struct mSDLEvents* events) { #if SDL_VERSION_ATLEAST(2, 0, 0) joystick->haptic = SDL_HapticOpenFromJoystick(joystick->joystick); #endif + + const char* joystickName; +#if SDL_VERSION_ATLEAST(2, 0, 0) + joystickName = SDL_JoystickName(joystick->joystick); +#else + joystickName = SDL_JoystickName(SDL_JoystickIndex(joystick->joystick)); +#endif size_t i; for (i = 0; (int) i < events->playersAttached; ++i) { if (events->players[i]->joystick) { continue; } - - const char* joystickName; -#if SDL_VERSION_ATLEAST(2, 0, 0) - joystickName = SDL_JoystickName(SDL_JoystickListGetPointer(&events->joysticks, i)->joystick); -#else - joystickName = SDL_JoystickName(SDL_JoystickIndex(SDL_JoystickListGetPointer(&events->joysticks, i)->joystick)); -#endif if (events->preferredJoysticks[i] && strcmp(events->preferredJoysticks[i], joystickName) == 0) { events->players[i]->joystick = joystick; + if (config) { + mInputProfileLoad(events->players[i]->bindings, SDL_BINDING_BUTTON, config, joystickName); + } return; } } @@ -361,6 +364,9 @@ void mSDLUpdateJoysticks(struct mSDLEvents* events) { continue; } events->players[i]->joystick = joystick; + if (config) { + mInputProfileLoad(events->players[i]->bindings, SDL_BINDING_BUTTON, config, joystickName); + } break; } } else if (event.type == SDL_JOYDEVICEREMOVED) { diff --git a/src/platform/sdl/sdl-events.h b/src/platform/sdl/sdl-events.h index bebf02cea..3c67222cd 100644 --- a/src/platform/sdl/sdl-events.h +++ b/src/platform/sdl/sdl-events.h @@ -96,7 +96,7 @@ bool mSDLAttachPlayer(struct mSDLEvents*, struct mSDLPlayer*); void mSDLDetachPlayer(struct mSDLEvents*, struct mSDLPlayer*); void mSDLEventsLoadConfig(struct mSDLEvents*, const struct Configuration*); void mSDLPlayerChangeJoystick(struct mSDLEvents*, struct mSDLPlayer*, size_t index); -void mSDLUpdateJoysticks(struct mSDLEvents* events); +void mSDLUpdateJoysticks(struct mSDLEvents* events, const struct Configuration*); void mSDLPlayerLoadConfig(struct mSDLPlayer*, const struct Configuration*); void mSDLPlayerSaveConfig(const struct mSDLPlayer*, struct Configuration*);