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