summaryrefslogtreecommitdiff
path: root/src/input_common
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common')
-rw-r--r--src/input_common/CMakeLists.txt19
-rwxr-xr-xsrc/input_common/analog_from_button.cpp1
-rw-r--r--src/input_common/gcadapter/gc_adapter.cpp7
-rw-r--r--src/input_common/main.cpp4
-rw-r--r--src/input_common/mouse/mouse_input.cpp16
-rw-r--r--src/input_common/mouse/mouse_input.h6
-rw-r--r--src/input_common/mouse/mouse_poller.cpp5
-rw-r--r--src/input_common/sdl/sdl_impl.cpp65
-rw-r--r--src/input_common/sdl/sdl_impl.h8
-rw-r--r--src/input_common/touch_from_button.cpp3
-rw-r--r--src/input_common/udp/client.cpp4
-rw-r--r--src/input_common/udp/protocol.h7
12 files changed, 81 insertions, 64 deletions
diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt
index 7c5763f9c..c4283a952 100644
--- a/src/input_common/CMakeLists.txt
+++ b/src/input_common/CMakeLists.txt
@@ -34,28 +34,17 @@ if (MSVC)
/W4
/WX
- # 'expression' : signed/unsigned mismatch
- /we4018
- # 'argument' : conversion from 'type1' to 'type2', possible loss of data (floating-point)
- /we4244
- # 'conversion' : conversion from 'type1' to 'type2', signed/unsigned mismatch
- /we4245
- # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
- /we4254
- # 'var' : conversion from 'size_t' to 'type', possible loss of data
- /we4267
- # 'context' : truncation from 'type1' to 'type2'
- /we4305
+ /we4242 # 'identifier': conversion from 'type1' to 'type2', possible loss of data
+ /we4244 # 'conversion': conversion from 'type1' to 'type2', possible loss of data
+ /we4245 # 'conversion': conversion from 'type1' to 'type2', signed/unsigned mismatch
+ /we4254 # 'operator': conversion from 'type1:field_bits' to 'type2:field_bits', possible loss of data
)
else()
target_compile_options(input_common PRIVATE
-Werror
-Werror=conversion
-Werror=ignored-qualifiers
- -Werror=implicit-fallthrough
- -Werror=reorder
-Werror=shadow
- -Werror=sign-compare
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-parameter>
$<$<CXX_COMPILER_ID:GNU>:-Werror=unused-but-set-variable>
-Werror=unused-variable
diff --git a/src/input_common/analog_from_button.cpp b/src/input_common/analog_from_button.cpp
index 100138d11..2fafd077f 100755
--- a/src/input_common/analog_from_button.cpp
+++ b/src/input_common/analog_from_button.cpp
@@ -27,6 +27,7 @@ public:
down->SetCallback(callbacks);
left->SetCallback(callbacks);
right->SetCallback(callbacks);
+ modifier->SetCallback(callbacks);
}
bool IsAngleGreater(float old_angle, float new_angle) const {
diff --git a/src/input_common/gcadapter/gc_adapter.cpp b/src/input_common/gcadapter/gc_adapter.cpp
index 320f51ee6..a2f1bb67c 100644
--- a/src/input_common/gcadapter/gc_adapter.cpp
+++ b/src/input_common/gcadapter/gc_adapter.cpp
@@ -5,14 +5,7 @@
#include <chrono>
#include <thread>
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable : 4200) // nonstandard extension used : zero-sized array in struct/union
-#endif
#include <libusb.h>
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
#include "common/logging/log.h"
#include "common/param_package.h"
diff --git a/src/input_common/main.cpp b/src/input_common/main.cpp
index 7399c3648..8de3d4520 100644
--- a/src/input_common/main.cpp
+++ b/src/input_common/main.cpp
@@ -294,8 +294,8 @@ void InputSubsystem::ReloadInputDevices() {
impl->udp->ReloadSockets();
}
-std::vector<std::unique_ptr<Polling::DevicePoller>> InputSubsystem::GetPollers(
- Polling::DeviceType type) const {
+std::vector<std::unique_ptr<Polling::DevicePoller>> InputSubsystem::GetPollers([
+ [maybe_unused]] Polling::DeviceType type) const {
#ifdef HAVE_SDL2
return impl->sdl->GetPollers(type);
#else
diff --git a/src/input_common/mouse/mouse_input.cpp b/src/input_common/mouse/mouse_input.cpp
index a335e6da1..3b052ffb2 100644
--- a/src/input_common/mouse/mouse_input.cpp
+++ b/src/input_common/mouse/mouse_input.cpp
@@ -2,25 +2,23 @@
// Licensed under GPLv2+
// Refer to the license.txt file included.
+#include <stop_token>
+#include <thread>
+
#include "common/settings.h"
#include "input_common/mouse/mouse_input.h"
namespace MouseInput {
Mouse::Mouse() {
- update_thread = std::thread(&Mouse::UpdateThread, this);
+ update_thread = std::jthread([this](std::stop_token stop_token) { UpdateThread(stop_token); });
}
-Mouse::~Mouse() {
- update_thread_running = false;
- if (update_thread.joinable()) {
- update_thread.join();
- }
-}
+Mouse::~Mouse() = default;
-void Mouse::UpdateThread() {
+void Mouse::UpdateThread(std::stop_token stop_token) {
constexpr int update_time = 10;
- while (update_thread_running) {
+ while (!stop_token.stop_requested()) {
for (MouseInfo& info : mouse_info) {
const Common::Vec3f angular_direction{
-info.tilt_direction.y,
diff --git a/src/input_common/mouse/mouse_input.h b/src/input_common/mouse/mouse_input.h
index 5a971ad67..c8bae99c1 100644
--- a/src/input_common/mouse/mouse_input.h
+++ b/src/input_common/mouse/mouse_input.h
@@ -6,6 +6,7 @@
#include <array>
#include <mutex>
+#include <stop_token>
#include <thread>
#include "common/common_types.h"
@@ -85,7 +86,7 @@ public:
[[nodiscard]] const MouseData& GetMouseState(std::size_t button) const;
private:
- void UpdateThread();
+ void UpdateThread(std::stop_token stop_token);
void UpdateYuzuSettings();
void StopPanning();
@@ -105,12 +106,11 @@ private:
u16 buttons{};
u16 toggle_buttons{};
u16 lock_buttons{};
- std::thread update_thread;
+ std::jthread update_thread;
MouseButton last_button{MouseButton::Undefined};
std::array<MouseInfo, 7> mouse_info;
Common::SPSCQueue<MouseStatus> mouse_queue;
bool configuring{false};
- bool update_thread_running{true};
int mouse_panning_timout{};
};
} // namespace MouseInput
diff --git a/src/input_common/mouse/mouse_poller.cpp b/src/input_common/mouse/mouse_poller.cpp
index d96104a4e..efcdd85d2 100644
--- a/src/input_common/mouse/mouse_poller.cpp
+++ b/src/input_common/mouse/mouse_poller.cpp
@@ -2,6 +2,8 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <algorithm>
+#include <memory>
#include <mutex>
#include <utility>
@@ -82,7 +84,8 @@ public:
std::lock_guard lock{mutex};
const auto axis_value =
static_cast<float>(mouse_input->GetMouseState(button).axis.at(axis));
- return axis_value * Settings::values.mouse_panning_sensitivity / (100.0f * range);
+ const float sensitivity = Settings::values.mouse_panning_sensitivity.GetValue() * 0.10f;
+ return axis_value * sensitivity / (100.0f * range);
}
std::pair<float, float> GetAnalog(u32 analog_axis_x, u32 analog_axis_y) const {
diff --git a/src/input_common/sdl/sdl_impl.cpp b/src/input_common/sdl/sdl_impl.cpp
index 68672a92b..70a0ba09c 100644
--- a/src/input_common/sdl/sdl_impl.cpp
+++ b/src/input_common/sdl/sdl_impl.cpp
@@ -115,6 +115,41 @@ public:
return state.buttons.at(button);
}
+ bool ToggleButton(int button) {
+ std::lock_guard lock{mutex};
+
+ if (!state.toggle_buttons.contains(button) || !state.lock_buttons.contains(button)) {
+ state.toggle_buttons.insert_or_assign(button, false);
+ state.lock_buttons.insert_or_assign(button, false);
+ }
+
+ const bool button_state = state.toggle_buttons.at(button);
+ const bool button_lock = state.lock_buttons.at(button);
+
+ if (button_lock) {
+ return button_state;
+ }
+
+ state.lock_buttons.insert_or_assign(button, true);
+
+ if (button_state) {
+ state.toggle_buttons.insert_or_assign(button, false);
+ } else {
+ state.toggle_buttons.insert_or_assign(button, true);
+ }
+
+ return !button_state;
+ }
+
+ bool UnlockButton(int button) {
+ std::lock_guard lock{mutex};
+ if (!state.toggle_buttons.contains(button)) {
+ return false;
+ }
+ state.lock_buttons.insert_or_assign(button, false);
+ return state.toggle_buttons.at(button);
+ }
+
void SetAxis(int axis, Sint16 value) {
std::lock_guard lock{mutex};
state.axes.insert_or_assign(axis, value);
@@ -130,10 +165,10 @@ public:
if (sdl_controller) {
return SDL_GameControllerRumble(sdl_controller.get(), amp_low, amp_high,
- rumble_max_duration_ms) == 0;
+ rumble_max_duration_ms) != -1;
} else if (sdl_joystick) {
return SDL_JoystickRumble(sdl_joystick.get(), amp_low, amp_high,
- rumble_max_duration_ms) == 0;
+ rumble_max_duration_ms) != -1;
}
return false;
@@ -241,6 +276,8 @@ public:
private:
struct State {
std::unordered_map<int, bool> buttons;
+ std::unordered_map<int, bool> toggle_buttons{};
+ std::unordered_map<int, bool> lock_buttons{};
std::unordered_map<int, Sint16> axes;
std::unordered_map<int, Uint8> hats;
} state;
@@ -402,16 +439,25 @@ void SDLState::CloseJoysticks() {
class SDLButton final : public Input::ButtonDevice {
public:
- explicit SDLButton(std::shared_ptr<SDLJoystick> joystick_, int button_)
- : joystick(std::move(joystick_)), button(button_) {}
+ explicit SDLButton(std::shared_ptr<SDLJoystick> joystick_, int button_, bool toggle_)
+ : joystick(std::move(joystick_)), button(button_), toggle(toggle_) {}
bool GetStatus() const override {
- return joystick->GetButton(button);
+ const bool button_state = joystick->GetButton(button);
+ if (!toggle) {
+ return button_state;
+ }
+
+ if (button_state) {
+ return joystick->ToggleButton(button);
+ }
+ return joystick->UnlockButton(button);
}
private:
std::shared_ptr<SDLJoystick> joystick;
int button;
+ bool toggle;
};
class SDLDirectionButton final : public Input::ButtonDevice {
@@ -635,6 +681,7 @@ public:
std::unique_ptr<Input::ButtonDevice> Create(const Common::ParamPackage& params) override {
const std::string guid = params.Get("guid", "0");
const int port = params.Get("port", 0);
+ const auto toggle = params.Get("toggle", false);
auto joystick = state.GetSDLJoystickByGUID(guid, port);
@@ -660,7 +707,8 @@ public:
if (params.Has("axis")) {
const int axis = params.Get("axis", 0);
- const float threshold = params.Get("threshold", 0.5f);
+ // Convert range from (0.0, 1.0) to (-1.0, 1.0)
+ const float threshold = (params.Get("threshold", 0.5f) - 0.5f) * 2.0f;
const std::string direction_name = params.Get("direction", "");
bool trigger_if_greater;
if (direction_name == "+") {
@@ -679,7 +727,7 @@ public:
const int button = params.Get("button", 0);
// This is necessary so accessing GetButton with button won't crash
joystick->SetButton(button, false);
- return std::make_unique<SDLButton>(joystick, button);
+ return std::make_unique<SDLButton>(joystick, button, toggle);
}
private:
@@ -933,12 +981,11 @@ Common::ParamPackage BuildAnalogParamPackageForButton(int port, std::string guid
params.Set("port", port);
params.Set("guid", std::move(guid));
params.Set("axis", axis);
+ params.Set("threshold", "0.5");
if (value > 0) {
params.Set("direction", "+");
- params.Set("threshold", "0.5");
} else {
params.Set("direction", "-");
- params.Set("threshold", "-0.5");
}
return params;
}
diff --git a/src/input_common/sdl/sdl_impl.h b/src/input_common/sdl/sdl_impl.h
index b77afcbd8..7a9ad6346 100644
--- a/src/input_common/sdl/sdl_impl.h
+++ b/src/input_common/sdl/sdl_impl.h
@@ -10,15 +10,7 @@
#include <thread>
#include <unordered_map>
-// Ignore -Wimplicit-fallthrough due to https://github.com/libsdl-org/SDL/issues/4307
-#ifdef __GNUC__
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
-#endif
#include <SDL.h>
-#ifdef __GNUC__
-#pragma GCC diagnostic pop
-#endif
#include "common/common_types.h"
#include "common/threadsafe_queue.h"
diff --git a/src/input_common/touch_from_button.cpp b/src/input_common/touch_from_button.cpp
index e94ba197b..7878a56d7 100644
--- a/src/input_common/touch_from_button.cpp
+++ b/src/input_common/touch_from_button.cpp
@@ -2,6 +2,7 @@
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
+#include <algorithm>
#include "common/settings.h"
#include "core/frontend/framebuffer_layout.h"
#include "input_common/touch_from_button.h"
@@ -12,7 +13,7 @@ class TouchFromButtonDevice final : public Input::TouchDevice {
public:
TouchFromButtonDevice() {
const auto button_index =
- static_cast<std::size_t>(Settings::values.touch_from_button_map_index);
+ static_cast<u64>(Settings::values.touch_from_button_map_index.GetValue());
const auto& buttons = Settings::values.touch_from_button_maps[button_index].buttons;
for (const auto& config_entry : buttons) {
diff --git a/src/input_common/udp/client.cpp b/src/input_common/udp/client.cpp
index bc1dfab3d..9b0aec797 100644
--- a/src/input_common/udp/client.cpp
+++ b/src/input_common/udp/client.cpp
@@ -201,7 +201,7 @@ bool Client::DeviceConnected(std::size_t pad) const {
void Client::ReloadSockets() {
Reset();
- std::stringstream servers_ss(Settings::values.udp_input_servers);
+ std::stringstream servers_ss(static_cast<std::string>(Settings::values.udp_input_servers));
std::string server_token;
std::size_t client = 0;
while (std::getline(servers_ss, server_token, ',')) {
@@ -370,7 +370,7 @@ std::optional<std::size_t> Client::GetUnusedFingerID() const {
void Client::UpdateTouchInput(Response::TouchPad& touch_pad, std::size_t client, std::size_t id) {
// TODO: Use custom calibration per device
- const Common::ParamPackage touch_param(Settings::values.touch_device);
+ const Common::ParamPackage touch_param(Settings::values.touch_device.GetValue());
const u16 min_x = static_cast<u16>(touch_param.Get("min_x", 100));
const u16 min_y = static_cast<u16>(touch_param.Get("min_y", 50));
const u16 max_x = static_cast<u16>(touch_param.Get("max_x", 1800));
diff --git a/src/input_common/udp/protocol.h b/src/input_common/udp/protocol.h
index a3d276697..1bdc9209e 100644
--- a/src/input_common/udp/protocol.h
+++ b/src/input_common/udp/protocol.h
@@ -8,14 +8,7 @@
#include <optional>
#include <type_traits>
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable : 4701)
-#endif
#include <boost/crc.hpp>
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
#include "common/bit_field.h"
#include "common/swap.h"