|
@@ -115,6 +115,41 @@ public:
|
|
|
return state.buttons.at(button);
|
|
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) {
|
|
void SetAxis(int axis, Sint16 value) {
|
|
|
std::lock_guard lock{mutex};
|
|
std::lock_guard lock{mutex};
|
|
|
state.axes.insert_or_assign(axis, value);
|
|
state.axes.insert_or_assign(axis, value);
|
|
@@ -241,6 +276,8 @@ public:
|
|
|
private:
|
|
private:
|
|
|
struct State {
|
|
struct State {
|
|
|
std::unordered_map<int, bool> buttons;
|
|
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, Sint16> axes;
|
|
|
std::unordered_map<int, Uint8> hats;
|
|
std::unordered_map<int, Uint8> hats;
|
|
|
} state;
|
|
} state;
|
|
@@ -402,16 +439,25 @@ 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_)
|
|
|
|
|
- : 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 {
|
|
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:
|
|
private:
|
|
|
std::shared_ptr<SDLJoystick> joystick;
|
|
std::shared_ptr<SDLJoystick> joystick;
|
|
|
int button;
|
|
int button;
|
|
|
|
|
+ bool toggle;
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
class SDLDirectionButton final : public Input::ButtonDevice {
|
|
class SDLDirectionButton final : public Input::ButtonDevice {
|
|
@@ -635,6 +681,7 @@ public:
|
|
|
std::unique_ptr<Input::ButtonDevice> Create(const Common::ParamPackage& params) override {
|
|
std::unique_ptr<Input::ButtonDevice> Create(const Common::ParamPackage& params) override {
|
|
|
const std::string guid = params.Get("guid", "0");
|
|
const std::string guid = params.Get("guid", "0");
|
|
|
const int port = params.Get("port", 0);
|
|
const int port = params.Get("port", 0);
|
|
|
|
|
+ const auto toggle = params.Get("toggle", false);
|
|
|
|
|
|
|
|
auto joystick = state.GetSDLJoystickByGUID(guid, port);
|
|
auto joystick = state.GetSDLJoystickByGUID(guid, port);
|
|
|
|
|
|
|
@@ -679,7 +726,7 @@ public:
|
|
|
const int button = params.Get("button", 0);
|
|
const int button = params.Get("button", 0);
|
|
|
// This is necessary so accessing GetButton with button won't crash
|
|
// This is necessary so accessing GetButton with button won't crash
|
|
|
joystick->SetButton(button, false);
|
|
joystick->SetButton(button, false);
|
|
|
- return std::make_unique<SDLButton>(joystick, button);
|
|
|
|
|
|
|
+ return std::make_unique<SDLButton>(joystick, button, toggle);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
private:
|