|
|
@ -49,8 +49,7 @@ static int SDLEventWatcher(void* user_data, SDL_Event* event) { |
|
|
class SDLJoystick { |
|
|
class SDLJoystick { |
|
|
public: |
|
|
public: |
|
|
SDLJoystick(std::string guid_, int port_, SDL_Joystick* joystick) |
|
|
SDLJoystick(std::string guid_, int port_, SDL_Joystick* joystick) |
|
|
: guid{std::move(guid_)}, port{port_}, sdl_joystick{joystick, &SDL_JoystickClose} { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
: guid{std::move(guid_)}, port{port_}, sdl_joystick{joystick, &SDL_JoystickClose} {} |
|
|
|
|
|
|
|
|
void SetButton(int button, bool value) { |
|
|
void SetButton(int button, bool value) { |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
@ -98,7 +97,6 @@ public: |
|
|
std::lock_guard lock{mutex}; |
|
|
std::lock_guard lock{mutex}; |
|
|
return (state.hats.at(hat) & direction) != 0; |
|
|
return (state.hats.at(hat) & direction) != 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* The guid of the joystick |
|
|
* The guid of the joystick |
|
|
*/ |
|
|
*/ |
|
|
@ -127,7 +125,6 @@ private: |
|
|
std::unordered_map<int, Sint16> axes; |
|
|
std::unordered_map<int, Sint16> axes; |
|
|
std::unordered_map<int, Uint8> hats; |
|
|
std::unordered_map<int, Uint8> hats; |
|
|
} state; |
|
|
} state; |
|
|
|
|
|
|
|
|
std::string guid; |
|
|
std::string guid; |
|
|
int port; |
|
|
int port; |
|
|
std::unique_ptr<SDL_Joystick, decltype(&SDL_JoystickClose)> sdl_joystick; |
|
|
std::unique_ptr<SDL_Joystick, decltype(&SDL_JoystickClose)> sdl_joystick; |
|
|
@ -158,8 +155,7 @@ std::shared_ptr<SDLJoystick> SDLState::GetSDLJoystickBySDLID(SDL_JoystickID sdl_ |
|
|
if (map_it != joystick_map.end()) { |
|
|
if (map_it != joystick_map.end()) { |
|
|
const auto vec_it = |
|
|
const auto vec_it = |
|
|
std::find_if(map_it->second.begin(), map_it->second.end(), |
|
|
std::find_if(map_it->second.begin(), map_it->second.end(), |
|
|
[&sdl_joystick](const std::shared_ptr<SDLJoystick>& joystick) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
[&sdl_joystick](const std::shared_ptr<SDLJoystick>& joystick) { |
|
|
return sdl_joystick == joystick->GetSDLJoystick(); |
|
|
return sdl_joystick == joystick->GetSDLJoystick(); |
|
|
}); |
|
|
}); |
|
|
if (vec_it != map_it->second.end()) { |
|
|
if (vec_it != map_it->second.end()) { |
|
|
@ -170,8 +166,7 @@ std::shared_ptr<SDLJoystick> SDLState::GetSDLJoystickBySDLID(SDL_JoystickID sdl_ |
|
|
|
|
|
|
|
|
// Search for a SDLJoystick without a mapped SDL_Joystick...
|
|
|
// Search for a SDLJoystick without a mapped SDL_Joystick...
|
|
|
const auto nullptr_it = std::find_if(map_it->second.begin(), map_it->second.end(), |
|
|
const auto nullptr_it = std::find_if(map_it->second.begin(), map_it->second.end(), |
|
|
[](const std::shared_ptr<SDLJoystick>& joystick) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
[](const std::shared_ptr<SDLJoystick>& joystick) { |
|
|
return !joystick->GetSDLJoystick(); |
|
|
return !joystick->GetSDLJoystick(); |
|
|
}); |
|
|
}); |
|
|
if (nullptr_it != map_it->second.end()) { |
|
|
if (nullptr_it != map_it->second.end()) { |
|
|
@ -228,8 +223,7 @@ void SDLState::CloseJoystick(SDL_Joystick* sdl_joystick) { |
|
|
const auto& joystick_guid_list = joystick_map[guid]; |
|
|
const auto& joystick_guid_list = joystick_map[guid]; |
|
|
const auto joystick_it = |
|
|
const auto joystick_it = |
|
|
std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(), |
|
|
std::find_if(joystick_guid_list.begin(), joystick_guid_list.end(), |
|
|
[&sdl_joystick](const std::shared_ptr<SDLJoystick>& joystick) |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
[&sdl_joystick](const std::shared_ptr<SDLJoystick>& joystick) { |
|
|
return joystick->GetSDLJoystick() == sdl_joystick; |
|
|
return joystick->GetSDLJoystick() == sdl_joystick; |
|
|
}); |
|
|
}); |
|
|
joystick = *joystick_it; |
|
|
joystick = *joystick_it; |
|
|
@ -285,8 +279,7 @@ void SDLState::CloseJoysticks() { |
|
|
class SDLButton final : public Input::ButtonDevice { |
|
|
class SDLButton final : public Input::ButtonDevice { |
|
|
public: |
|
|
public: |
|
|
explicit SDLButton(std::shared_ptr<SDLJoystick> joystick_, int button_) |
|
|
explicit SDLButton(std::shared_ptr<SDLJoystick> joystick_, int button_) |
|
|
: joystick(std::move(joystick_)), button(button_) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
: joystick(std::move(joystick_)), button(button_) {} |
|
|
|
|
|
|
|
|
bool GetStatus() const override { |
|
|
bool GetStatus() const override { |
|
|
return joystick->GetButton(button); |
|
|
return joystick->GetButton(button); |
|
|
@ -300,8 +293,7 @@ private: |
|
|
class SDLDirectionButton final : public Input::ButtonDevice { |
|
|
class SDLDirectionButton final : public Input::ButtonDevice { |
|
|
public: |
|
|
public: |
|
|
explicit SDLDirectionButton(std::shared_ptr<SDLJoystick> joystick_, int hat_, Uint8 direction_) |
|
|
explicit SDLDirectionButton(std::shared_ptr<SDLJoystick> joystick_, int hat_, Uint8 direction_) |
|
|
: joystick(std::move(joystick_)), hat(hat_), direction(direction_) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
: joystick(std::move(joystick_)), hat(hat_), direction(direction_) {} |
|
|
|
|
|
|
|
|
bool GetStatus() const override { |
|
|
bool GetStatus() const override { |
|
|
return joystick->GetHatDirection(hat, direction); |
|
|
return joystick->GetHatDirection(hat, direction); |
|
|
@ -318,8 +310,7 @@ public: |
|
|
explicit SDLAxisButton(std::shared_ptr<SDLJoystick> joystick_, int axis_, float threshold_, |
|
|
explicit SDLAxisButton(std::shared_ptr<SDLJoystick> joystick_, int axis_, float threshold_, |
|
|
bool trigger_if_greater_) |
|
|
bool trigger_if_greater_) |
|
|
: joystick(std::move(joystick_)), axis(axis_), threshold(threshold_), |
|
|
: joystick(std::move(joystick_)), axis(axis_), threshold(threshold_), |
|
|
trigger_if_greater(trigger_if_greater_) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
trigger_if_greater(trigger_if_greater_) {} |
|
|
|
|
|
|
|
|
bool GetStatus() const override { |
|
|
bool GetStatus() const override { |
|
|
const float axis_value = joystick->GetAxis(axis); |
|
|
const float axis_value = joystick->GetAxis(axis); |
|
|
@ -339,8 +330,7 @@ private: |
|
|
class SDLAnalog final : public Input::AnalogDevice { |
|
|
class SDLAnalog final : public Input::AnalogDevice { |
|
|
public: |
|
|
public: |
|
|
SDLAnalog(std::shared_ptr<SDLJoystick> joystick_, int axis_x_, int axis_y_, float deadzone_) |
|
|
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_) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
: joystick(std::move(joystick_)), axis_x(axis_x_), axis_y(axis_y_), deadzone(deadzone_) {} |
|
|
|
|
|
|
|
|
std::tuple<float, float> GetStatus() const override { |
|
|
std::tuple<float, float> GetStatus() const override { |
|
|
const auto [x, y] = joystick->GetAnalog(axis_x, axis_y); |
|
|
const auto [x, y] = joystick->GetAnalog(axis_x, axis_y); |
|
|
@ -378,9 +368,7 @@ private: |
|
|
/// A button device factory that creates button devices from SDL joystick
|
|
|
/// A button device factory that creates button devices from SDL joystick
|
|
|
class SDLButtonFactory final : public Input::Factory<Input::ButtonDevice> { |
|
|
class SDLButtonFactory final : public Input::Factory<Input::ButtonDevice> { |
|
|
public: |
|
|
public: |
|
|
explicit SDLButtonFactory(SDLState& state_) |
|
|
|
|
|
: state(state_) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
explicit SDLButtonFactory(SDLState& state_) : state(state_) {} |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Creates a button device from a joystick button |
|
|
* Creates a button device from a joystick button |
|
|
@ -455,9 +443,7 @@ private: |
|
|
/// An analog device factory that creates analog devices from SDL joystick
|
|
|
/// An analog device factory that creates analog devices from SDL joystick
|
|
|
class SDLAnalogFactory final : public Input::Factory<Input::AnalogDevice> { |
|
|
class SDLAnalogFactory final : public Input::Factory<Input::AnalogDevice> { |
|
|
public: |
|
|
public: |
|
|
explicit SDLAnalogFactory(SDLState& state_) |
|
|
|
|
|
: state(state_) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
explicit SDLAnalogFactory(SDLState& state_) : state(state_) {} |
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Creates analog device from joystick axes |
|
|
* Creates analog device from joystick axes |
|
|
@ -505,8 +491,7 @@ SDLState::SDLState() { |
|
|
|
|
|
|
|
|
initialized = true; |
|
|
initialized = true; |
|
|
if (start_thread) { |
|
|
if (start_thread) { |
|
|
poll_thread = std::thread([this] |
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
poll_thread = std::thread([this] { |
|
|
using namespace std::chrono_literals; |
|
|
using namespace std::chrono_literals; |
|
|
while (initialized) { |
|
|
while (initialized) { |
|
|
SDL_PumpEvents(); |
|
|
SDL_PumpEvents(); |
|
|
@ -592,9 +577,7 @@ namespace Polling { |
|
|
|
|
|
|
|
|
class SDLPoller : public InputCommon::Polling::DevicePoller { |
|
|
class SDLPoller : public InputCommon::Polling::DevicePoller { |
|
|
public: |
|
|
public: |
|
|
explicit SDLPoller(SDLState& state_) |
|
|
|
|
|
: state(state_) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
explicit SDLPoller(SDLState& state_) : state(state_) {} |
|
|
|
|
|
|
|
|
void Start() override { |
|
|
void Start() override { |
|
|
state.event_queue.Clear(); |
|
|
state.event_queue.Clear(); |
|
|
@ -611,9 +594,7 @@ protected: |
|
|
|
|
|
|
|
|
class SDLButtonPoller final : public SDLPoller { |
|
|
class SDLButtonPoller final : public SDLPoller { |
|
|
public: |
|
|
public: |
|
|
explicit SDLButtonPoller(SDLState& state_) |
|
|
|
|
|
: SDLPoller(state_) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
explicit SDLButtonPoller(SDLState& state_) : SDLPoller(state_) {} |
|
|
|
|
|
|
|
|
Common::ParamPackage GetNextInput() override { |
|
|
Common::ParamPackage GetNextInput() override { |
|
|
SDL_Event event; |
|
|
SDL_Event event; |
|
|
@ -622,7 +603,8 @@ public: |
|
|
case SDL_JOYAXISMOTION: |
|
|
case SDL_JOYAXISMOTION: |
|
|
if (std::abs(event.jaxis.value / 32767.0) < 0.5) { |
|
|
if (std::abs(event.jaxis.value / 32767.0) < 0.5) { |
|
|
break; |
|
|
break; |
|
|
}[[fallthrough]]; |
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
[[fallthrough]]; |
|
|
case SDL_JOYBUTTONUP: |
|
|
case SDL_JOYBUTTONUP: |
|
|
case SDL_JOYHATMOTION: |
|
|
case SDL_JOYHATMOTION: |
|
|
return SDLEventToButtonParamPackage(state, event); |
|
|
return SDLEventToButtonParamPackage(state, event); |
|
|
@ -634,9 +616,7 @@ public: |
|
|
|
|
|
|
|
|
class SDLAnalogPoller final : public SDLPoller { |
|
|
class SDLAnalogPoller final : public SDLPoller { |
|
|
public: |
|
|
public: |
|
|
explicit SDLAnalogPoller(SDLState& state_) |
|
|
|
|
|
: SDLPoller(state_) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
explicit SDLAnalogPoller(SDLState& state_) : SDLPoller(state_) {} |
|
|
|
|
|
|
|
|
void Start() override { |
|
|
void Start() override { |
|
|
SDLPoller::Start(); |
|
|
SDLPoller::Start(); |
|
|
|