From 4831095610bb6880a33e72214dd7dbdb8827967c Mon Sep 17 00:00:00 2001 From: B3n30 Date: Mon, 1 Oct 2018 15:10:37 +0200 Subject: [PATCH 1/3] fixup! Joystick: Allow for background events; Add deadzone to SDLAnalog --- src/input_common/sdl/sdl_impl.cpp | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp index 0b3d2b470..713f9a53b 100644 --- a/src/input_common/sdl/sdl_impl.cpp +++ b/src/input_common/sdl/sdl_impl.cpp @@ -324,17 +324,26 @@ private: class SDLAnalog final : public Input::AnalogDevice { public: - SDLAnalog(std::shared_ptr joystick_, int axis_x_, int axis_y_) - : joystick(std::move(joystick_)), axis_x(axis_x_), axis_y(axis_y_) {} + SDLAnalog(std::shared_ptr joystick_, int axis_x_, int axis_y_, float deadzone_) + : joystick(std::move(joystick_)), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_) {} std::tuple GetStatus() const override { - return joystick->GetAnalog(axis_x, axis_y); + float x; + float y; + std::tie(x, y) = joystick->GetAnalog(axis_x, axis_y); + const float r = std::sqrt((x * x) + (y * y)); + if (r > deadzone) { + return std::make_tuple(x / r * (r - deadzone) / (1 - deadzone), + y / r * (r - deadzone) / (1 - deadzone)); + } + return std::make_tuple(0.0f, 0.0f); } private: std::shared_ptr joystick; - int axis_x; - int axis_y; + const int axis_x; + const int axis_y; + const float deadzone; }; /// A button device factory that creates button devices from SDL joystick @@ -429,13 +438,14 @@ public: const int port = params.Get("port", 0); const int axis_x = params.Get("axis_x", 0); const int axis_y = params.Get("axis_y", 1); + float deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, .099f); auto joystick = state.GetSDLJoystickByGUID(guid, port); // This is necessary so accessing GetAxis with axis_x and axis_y won't crash joystick->SetAxis(axis_x, 0); joystick->SetAxis(axis_y, 0); - return std::make_unique(joystick, axis_x, axis_y); + return std::make_unique(joystick, axis_x, axis_y, deadzone); } private: @@ -453,6 +463,9 @@ SDLState::SDLState() { LOG_CRITICAL(Input, "SDL_Init(SDL_INIT_JOYSTICK) failed with: {}", SDL_GetError()); return; } + if (SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS, "1") == SDL_FALSE) { + LOG_ERROR(Input, "Failed to set Hint for background events", SDL_GetError()); + } SDL_AddEventWatch(&SDLEventWatcher, this); From 2b46b838f1d143155338e07ce70193c3c1a6d845 Mon Sep 17 00:00:00 2001 From: B3n30 Date: Tue, 9 Oct 2018 21:23:50 +0200 Subject: [PATCH 2/3] fix deadzone max value --- src/input_common/sdl/sdl_impl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp index 713f9a53b..44be6e3c5 100644 --- a/src/input_common/sdl/sdl_impl.cpp +++ b/src/input_common/sdl/sdl_impl.cpp @@ -438,7 +438,7 @@ public: const int port = params.Get("port", 0); const int axis_x = params.Get("axis_x", 0); const int axis_y = params.Get("axis_y", 1); - float deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, .099f); + float deadzone = std::clamp(params.Get("deadzone", 0.0f), 0.0f, .99f); auto joystick = state.GetSDLJoystickByGUID(guid, port); From ca77be3ac24b342b31261dc6b2459d2e4fd70be6 Mon Sep 17 00:00:00 2001 From: B3n30 Date: Tue, 9 Oct 2018 22:44:26 +0200 Subject: [PATCH 3/3] remove std::tie in sdl_impl --- src/input_common/sdl/sdl_impl.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp index 44be6e3c5..a7db56f43 100644 --- a/src/input_common/sdl/sdl_impl.cpp +++ b/src/input_common/sdl/sdl_impl.cpp @@ -328,9 +328,7 @@ public: : joystick(std::move(joystick_)), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_) {} std::tuple GetStatus() const override { - float x; - float y; - std::tie(x, y) = joystick->GetAnalog(axis_x, axis_y); + const auto [x, y] = joystick->GetAnalog(axis_x, axis_y); const float r = std::sqrt((x * x) + (y * y)); if (r > deadzone) { return std::make_tuple(x / r * (r - deadzone) / (1 - deadzone),