summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2021-05-24 21:02:37 +0200
committerGitHub <noreply@github.com>2021-05-24 21:02:37 +0200
commitaee3b57c44aadca1b47726429d5b3d52b9ca575e (patch)
tree6c852aa6befbd2d5cddda7edae7afb67870def0f
parentMerge pull request #6347 from bunnei/ipc-improvements-next-2 (diff)
parentinput_common: Fix crash when controller disconnects (diff)
downloadyuzu-aee3b57c44aadca1b47726429d5b3d52b9ca575e.tar
yuzu-aee3b57c44aadca1b47726429d5b3d52b9ca575e.tar.gz
yuzu-aee3b57c44aadca1b47726429d5b3d52b9ca575e.tar.bz2
yuzu-aee3b57c44aadca1b47726429d5b3d52b9ca575e.tar.lz
yuzu-aee3b57c44aadca1b47726429d5b3d52b9ca575e.tar.xz
yuzu-aee3b57c44aadca1b47726429d5b3d52b9ca575e.tar.zst
yuzu-aee3b57c44aadca1b47726429d5b3d52b9ca575e.zip
-rw-r--r--src/input_common/sdl/sdl_impl.cpp54
1 files changed, 28 insertions, 26 deletions
diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp
index 822d0b555..b9b584b2a 100644
--- a/src/input_common/sdl/sdl_impl.cpp
+++ b/src/input_common/sdl/sdl_impl.cpp
@@ -323,7 +323,9 @@ void SDLState::CloseJoystick(SDL_Joystick* sdl_joystick) {
return joystick->GetSDLJoystick() == sdl_joystick;
});
- (*joystick_it)->SetSDLJoystick(nullptr, nullptr);
+ if (joystick_it != joystick_guid_list.end()) {
+ (*joystick_it)->SetSDLJoystick(nullptr, nullptr);
+ }
}
void SDLState::HandleGameControllerEvent(const SDL_Event& event) {
@@ -1315,51 +1317,51 @@ public:
void Start(const std::string& device_id) override {
SDLPoller::Start(device_id);
// Reset stored axes
- analog_x_axis = -1;
- analog_y_axis = -1;
+ first_axis = -1;
}
Common::ParamPackage GetNextInput() override {
SDL_Event event;
while (state.event_queue.Pop(event)) {
- // Filter out axis events that are below a threshold
- if (event.type == SDL_JOYAXISMOTION && std::abs(event.jaxis.value / 32767.0) < 0.5) {
- continue;
- }
- if (event.type == SDL_JOYAXISMOTION) {
- const auto axis = event.jaxis.axis;
- // In order to return a complete analog param, we need inputs for both axes.
- // First we take the x-axis (horizontal) input, then the y-axis (vertical) input.
- if (analog_x_axis == -1) {
- analog_x_axis = axis;
- } else if (analog_y_axis == -1 && analog_x_axis != axis) {
- analog_y_axis = axis;
- }
- } else {
- // If the press wasn't accepted as a joy axis, check for a button press
+ if (event.type != SDL_JOYAXISMOTION) {
+ // Check for a button press
auto button_press = button_poller.FromEvent(event);
if (button_press) {
return *button_press;
}
+ continue;
+ }
+ const auto axis = event.jaxis.axis;
+
+ // Filter out axis events that are below a threshold
+ if (std::abs(event.jaxis.value / 32767.0) < 0.5) {
+ continue;
+ }
+
+ // Filter out axis events that are the same
+ if (first_axis == axis) {
+ continue;
+ }
+
+ // In order to return a complete analog param, we need inputs for both axes.
+ // If the first axis isn't set we set the value then wait till next event
+ if (first_axis == -1) {
+ first_axis = axis;
+ continue;
}
- }
- if (analog_x_axis != -1 && analog_y_axis != -1) {
if (const auto joystick = state.GetSDLJoystickBySDLID(event.jaxis.which)) {
auto params = BuildParamPackageForAnalog(joystick->GetPort(), joystick->GetGUID(),
- analog_x_axis, analog_y_axis);
- analog_x_axis = -1;
- analog_y_axis = -1;
+ first_axis, axis);
+ first_axis = -1;
return params;
}
}
-
return {};
}
private:
- int analog_x_axis = -1;
- int analog_y_axis = -1;
+ int first_axis = -1;
SDLButtonPoller button_poller;
};
} // namespace Polling