|
|
|
@ -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;
|
|
|
|
|
}
|
|
|
|
|