summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar german772021-03-06 13:27:02 -0600
committerGravatar german772021-03-06 13:27:02 -0600
commit41e94b7b99f83a45633d555160b31b50f021c350 (patch)
tree3383b74713144712144eeb5cb6a247ba4be9da42 /src
parentAdd toggle button option for normal buttons (diff)
downloadyuzu-41e94b7b99f83a45633d555160b31b50f021c350.tar.gz
yuzu-41e94b7b99f83a45633d555160b31b50f021c350.tar.xz
yuzu-41e94b7b99f83a45633d555160b31b50f021c350.zip
Enable mouse toggle buttons
Diffstat (limited to 'src')
-rw-r--r--src/input_common/keyboard.cpp12
-rw-r--r--src/input_common/mouse/mouse_input.cpp36
-rw-r--r--src/input_common/mouse/mouse_input.h5
-rw-r--r--src/input_common/mouse/mouse_poller.cpp20
-rw-r--r--src/yuzu/configuration/configure_input_player.cpp3
5 files changed, 65 insertions, 11 deletions
diff --git a/src/input_common/keyboard.cpp b/src/input_common/keyboard.cpp
index fa0e60ac1..c467ff4c5 100644
--- a/src/input_common/keyboard.cpp
+++ b/src/input_common/keyboard.cpp
@@ -19,16 +19,18 @@ public:
19 19
20 bool GetStatus() const override { 20 bool GetStatus() const override {
21 if (toggle) { 21 if (toggle) {
22 return toggled_status.load(); 22 return toggled_status.load(std::memory_order_relaxed);
23 } 23 }
24 return status.load(); 24 return status.load();
25 } 25 }
26 26
27 void ToggleButton() { 27 void ToggleButton() {
28 if (!lock) { 28 if (lock) {
29 lock = true; 29 return;
30 toggled_status.store(!toggled_status.load());
31 } 30 }
31 lock = true;
32 const bool old_toggle_status = toggled_status.load();
33 toggled_status.store(!old_toggle_status);
32 } 34 }
33 35
34 void UnlockButton() { 36 void UnlockButton() {
@@ -41,7 +43,7 @@ private:
41 std::shared_ptr<KeyButtonList> key_button_list; 43 std::shared_ptr<KeyButtonList> key_button_list;
42 std::atomic<bool> status{false}; 44 std::atomic<bool> status{false};
43 std::atomic<bool> toggled_status{false}; 45 std::atomic<bool> toggled_status{false};
44 bool lock = {}; 46 bool lock{false};
45 const bool toggle; 47 const bool toggle;
46}; 48};
47 49
diff --git a/src/input_common/mouse/mouse_input.cpp b/src/input_common/mouse/mouse_input.cpp
index b864d26f2..6818d5eee 100644
--- a/src/input_common/mouse/mouse_input.cpp
+++ b/src/input_common/mouse/mouse_input.cpp
@@ -157,6 +157,42 @@ void Mouse::EndConfiguration() {
157 configuring = false; 157 configuring = false;
158} 158}
159 159
160bool Mouse::ToggleButton(std::size_t button_) {
161 if (button_ >= mouse_info.size()) {
162 return false;
163 }
164 const auto button = 1U << button_;
165 const bool button_state = (toggle_buttons & button) != 0;
166 const bool button_lock = (lock_buttons & button) != 0;
167
168 if (button_lock) {
169 return button_state;
170 }
171
172 lock_buttons |= static_cast<u16>(button);
173
174 if (button_state) {
175 toggle_buttons &= static_cast<u16>(0xFF - button);
176 } else {
177 toggle_buttons |= static_cast<u16>(button);
178 }
179
180 return !button_state;
181}
182
183bool Mouse::UnlockButton(std::size_t button_) {
184 if (button_ >= mouse_info.size()) {
185 return false;
186 }
187
188 const auto button = 1U << button_;
189 const bool button_state = (toggle_buttons & button) != 0;
190
191 lock_buttons &= static_cast<u16>(0xFF - button);
192
193 return button_state;
194}
195
160Common::SPSCQueue<MouseStatus>& Mouse::GetMouseQueue() { 196Common::SPSCQueue<MouseStatus>& Mouse::GetMouseQueue() {
161 return mouse_queue; 197 return mouse_queue;
162} 198}
diff --git a/src/input_common/mouse/mouse_input.h b/src/input_common/mouse/mouse_input.h
index 46aa676c1..a75f0ecb5 100644
--- a/src/input_common/mouse/mouse_input.h
+++ b/src/input_common/mouse/mouse_input.h
@@ -67,6 +67,9 @@ public:
67 */ 67 */
68 void ReleaseButton(int button_); 68 void ReleaseButton(int button_);
69 69
70 [[nodiscard]] bool ToggleButton(std::size_t button_);
71 [[nodiscard]] bool UnlockButton(std::size_t button_);
72
70 [[nodiscard]] Common::SPSCQueue<MouseStatus>& GetMouseQueue(); 73 [[nodiscard]] Common::SPSCQueue<MouseStatus>& GetMouseQueue();
71 [[nodiscard]] const Common::SPSCQueue<MouseStatus>& GetMouseQueue() const; 74 [[nodiscard]] const Common::SPSCQueue<MouseStatus>& GetMouseQueue() const;
72 75
@@ -92,6 +95,8 @@ private:
92 }; 95 };
93 96
94 u16 buttons{}; 97 u16 buttons{};
98 u16 toggle_buttons{};
99 u16 lock_buttons{};
95 std::thread update_thread; 100 std::thread update_thread;
96 MouseButton last_button{MouseButton::Undefined}; 101 MouseButton last_button{MouseButton::Undefined};
97 std::array<MouseInfo, 5> mouse_info; 102 std::array<MouseInfo, 5> mouse_info;
diff --git a/src/input_common/mouse/mouse_poller.cpp b/src/input_common/mouse/mouse_poller.cpp
index bb56787ee..0e1db54fb 100644
--- a/src/input_common/mouse/mouse_poller.cpp
+++ b/src/input_common/mouse/mouse_poller.cpp
@@ -14,16 +14,25 @@ namespace InputCommon {
14 14
15class MouseButton final : public Input::ButtonDevice { 15class MouseButton final : public Input::ButtonDevice {
16public: 16public:
17 explicit MouseButton(u32 button_, const MouseInput::Mouse* mouse_input_) 17 explicit MouseButton(u32 button_, bool toggle_, MouseInput::Mouse* mouse_input_)
18 : button(button_), mouse_input(mouse_input_) {} 18 : button(button_), toggle(toggle_), mouse_input(mouse_input_) {}
19 19
20 bool GetStatus() const override { 20 bool GetStatus() const override {
21 return mouse_input->GetMouseState(button).pressed; 21 const bool button_state = mouse_input->GetMouseState(button).pressed;
22 if (!toggle) {
23 return button_state;
24 }
25
26 if (button_state) {
27 return mouse_input->ToggleButton(button);
28 }
29 return mouse_input->UnlockButton(button);
22 } 30 }
23 31
24private: 32private:
25 const u32 button; 33 const u32 button;
26 const MouseInput::Mouse* mouse_input; 34 const bool toggle;
35 MouseInput::Mouse* mouse_input;
27}; 36};
28 37
29MouseButtonFactory::MouseButtonFactory(std::shared_ptr<MouseInput::Mouse> mouse_input_) 38MouseButtonFactory::MouseButtonFactory(std::shared_ptr<MouseInput::Mouse> mouse_input_)
@@ -32,8 +41,9 @@ MouseButtonFactory::MouseButtonFactory(std::shared_ptr<MouseInput::Mouse> mouse_
32std::unique_ptr<Input::ButtonDevice> MouseButtonFactory::Create( 41std::unique_ptr<Input::ButtonDevice> MouseButtonFactory::Create(
33 const Common::ParamPackage& params) { 42 const Common::ParamPackage& params) {
34 const auto button_id = params.Get("button", 0); 43 const auto button_id = params.Get("button", 0);
44 const auto toggle = params.Get("toggle", false);
35 45
36 return std::make_unique<MouseButton>(button_id, mouse_input.get()); 46 return std::make_unique<MouseButton>(button_id, toggle, mouse_input.get());
37} 47}
38 48
39Common::ParamPackage MouseButtonFactory::GetNextInput() const { 49Common::ParamPackage MouseButtonFactory::GetNextInput() const {
diff --git a/src/yuzu/configuration/configure_input_player.cpp b/src/yuzu/configuration/configure_input_player.cpp
index bd53f2cde..55adbd53d 100644
--- a/src/yuzu/configuration/configure_input_player.cpp
+++ b/src/yuzu/configuration/configure_input_player.cpp
@@ -158,7 +158,8 @@ QString ButtonToText(const Common::ParamPackage& param) {
158 if (param.Get("engine", "") == "mouse") { 158 if (param.Get("engine", "") == "mouse") {
159 if (param.Has("button")) { 159 if (param.Has("button")) {
160 const QString button_str = QString::number(int(param.Get("button", 0))); 160 const QString button_str = QString::number(int(param.Get("button", 0)));
161 return QObject::tr("Click %1").arg(button_str); 161 const QString toggle = QString::fromStdString(param.Get("toggle", false) ? "~" : "");
162 return QObject::tr("%1Click %2").arg(toggle, button_str);
162 } 163 }
163 return GetKeyName(param.Get("code", 0)); 164 return GetKeyName(param.Get("code", 0));
164 } 165 }