diff options
author | B3n30 <benediktthomas@gmail.com> | 2018-10-01 15:10:37 +0200 |
---|---|---|
committer | fearlessTobi <thm.frey@gmail.com> | 2019-03-02 19:12:46 +0100 |
commit | 71817afbe9483f7b2258a8891d0a6730c8c7b71e (patch) | |
tree | 78e568c08bb5ddd18b578ebb3032bdc93524cadc /src/input_common | |
parent | input/sdl: lock map mutex after SDL call (diff) | |
download | yuzu-71817afbe9483f7b2258a8891d0a6730c8c7b71e.tar yuzu-71817afbe9483f7b2258a8891d0a6730c8c7b71e.tar.gz yuzu-71817afbe9483f7b2258a8891d0a6730c8c7b71e.tar.bz2 yuzu-71817afbe9483f7b2258a8891d0a6730c8c7b71e.tar.lz yuzu-71817afbe9483f7b2258a8891d0a6730c8c7b71e.tar.xz yuzu-71817afbe9483f7b2258a8891d0a6730c8c7b71e.tar.zst yuzu-71817afbe9483f7b2258a8891d0a6730c8c7b71e.zip |
Diffstat (limited to 'src/input_common')
-rw-r--r-- | src/input_common/sdl/sdl_impl.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp index f5dbd015e..934339d3b 100644 --- a/src/input_common/sdl/sdl_impl.cpp +++ b/src/input_common/sdl/sdl_impl.cpp @@ -330,17 +330,24 @@ private: class SDLAnalog final : public Input::AnalogDevice { public: - SDLAnalog(std::shared_ptr<SDLJoystick> joystick_, int axis_x_, int axis_y_) - : joystick(std::move(joystick_)), axis_x(axis_x_), axis_y(axis_y_) {} + SDLAnalog(std::shared_ptr<SDLJoystick> 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<float, float> GetStatus() const override { - return 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), + y / r * (r - deadzone) / (1 - deadzone)); + } + return std::make_tuple<float, float>(0.0f, 0.0f); } private: std::shared_ptr<SDLJoystick> 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 @@ -435,13 +442,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, .99f); 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<SDLAnalog>(joystick, axis_x, axis_y); + return std::make_unique<SDLAnalog>(joystick, axis_x, axis_y, deadzone); } private: @@ -459,6 +467,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); |