|
|
@@ -12,20 +12,37 @@ namespace InputCommon {
|
|
|
|
|
|
class KeyButton final : public Input::ButtonDevice {
|
|
|
public:
|
|
|
- explicit KeyButton(std::shared_ptr<KeyButtonList> key_button_list_)
|
|
|
- : key_button_list(std::move(key_button_list_)) {}
|
|
|
+ explicit KeyButton(std::shared_ptr<KeyButtonList> key_button_list_, bool toggle_)
|
|
|
+ : key_button_list(std::move(key_button_list_)), toggle(toggle_) {}
|
|
|
|
|
|
~KeyButton() override;
|
|
|
|
|
|
bool GetStatus() const override {
|
|
|
+ if (toggle) {
|
|
|
+ return toggled_status.load();
|
|
|
+ }
|
|
|
return status.load();
|
|
|
}
|
|
|
|
|
|
+ void ToggleButton() {
|
|
|
+ if (!lock) {
|
|
|
+ lock = true;
|
|
|
+ toggled_status.store(!toggled_status.load());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void UnlockButton() {
|
|
|
+ lock = false;
|
|
|
+ }
|
|
|
+
|
|
|
friend class KeyButtonList;
|
|
|
|
|
|
private:
|
|
|
std::shared_ptr<KeyButtonList> key_button_list;
|
|
|
std::atomic<bool> status{false};
|
|
|
+ std::atomic<bool> toggled_status{false};
|
|
|
+ bool lock = {};
|
|
|
+ const bool toggle;
|
|
|
};
|
|
|
|
|
|
struct KeyButtonPair {
|
|
|
@@ -51,6 +68,11 @@ public:
|
|
|
for (const KeyButtonPair& pair : list) {
|
|
|
if (pair.key_code == key_code) {
|
|
|
pair.key_button->status.store(pressed);
|
|
|
+ if (pressed) {
|
|
|
+ pair.key_button->ToggleButton();
|
|
|
+ } else {
|
|
|
+ pair.key_button->UnlockButton();
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -75,7 +97,8 @@ KeyButton::~KeyButton() {
|
|
|
|
|
|
std::unique_ptr<Input::ButtonDevice> Keyboard::Create(const Common::ParamPackage& params) {
|
|
|
const int key_code = params.Get("code", 0);
|
|
|
- std::unique_ptr<KeyButton> button = std::make_unique<KeyButton>(key_button_list);
|
|
|
+ const bool toggle = params.Get("toggle", false);
|
|
|
+ std::unique_ptr<KeyButton> button = std::make_unique<KeyButton>(key_button_list, toggle);
|
|
|
key_button_list->AddKeyButton(key_code, button.get());
|
|
|
return button;
|
|
|
}
|