summaryrefslogtreecommitdiff
path: root/src/input_common/keyboard.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/input_common/keyboard.cpp')
-rw-r--r--src/input_common/keyboard.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/input_common/keyboard.cpp b/src/input_common/keyboard.cpp
new file mode 100644
index 000000000..0f0d10f23
--- /dev/null
+++ b/src/input_common/keyboard.cpp
@@ -0,0 +1,93 @@
1// Copyright 2017 Citra Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <atomic>
6#include <list>
7#include <mutex>
8#include "input_common/keyboard.h"
9
10namespace InputCommon {
11
12class KeyButton final : public Input::ButtonDevice {
13public:
14 explicit KeyButton(std::shared_ptr<KeyButtonList> key_button_list_)
15 : key_button_list(key_button_list_) {}
16
17 ~KeyButton();
18
19 bool GetStatus() const override {
20 return status.load();
21 }
22
23 friend class KeyButtonList;
24
25private:
26 std::shared_ptr<KeyButtonList> key_button_list;
27 std::atomic<bool> status{false};
28};
29
30struct KeyButtonPair {
31 int key_code;
32 KeyButton* key_button;
33};
34
35class KeyButtonList {
36public:
37 void AddKeyButton(int key_code, KeyButton* key_button) {
38 std::lock_guard<std::mutex> guard(mutex);
39 list.push_back(KeyButtonPair{key_code, key_button});
40 }
41
42 void RemoveKeyButton(const KeyButton* key_button) {
43 std::lock_guard<std::mutex> guard(mutex);
44 list.remove_if(
45 [key_button](const KeyButtonPair& pair) { return pair.key_button == key_button; });
46 }
47
48 void ChangeKeyStatus(int key_code, bool pressed) {
49 std::lock_guard<std::mutex> guard(mutex);
50 for (const KeyButtonPair& pair : list) {
51 if (pair.key_code == key_code)
52 pair.key_button->status.store(pressed);
53 }
54 }
55
56 void ChangeAllKeyStatus(bool pressed) {
57 std::lock_guard<std::mutex> guard(mutex);
58 for (const KeyButtonPair& pair : list) {
59 pair.key_button->status.store(pressed);
60 }
61 }
62
63private:
64 std::mutex mutex;
65 std::list<KeyButtonPair> list;
66};
67
68Keyboard::Keyboard() : key_button_list{std::make_shared<KeyButtonList>()} {}
69
70KeyButton::~KeyButton() {
71 key_button_list->RemoveKeyButton(this);
72}
73
74std::unique_ptr<Input::ButtonDevice> Keyboard::Create(const Common::ParamPackage& params) {
75 int key_code = params.Get("code", 0);
76 std::unique_ptr<KeyButton> button = std::make_unique<KeyButton>(key_button_list);
77 key_button_list->AddKeyButton(key_code, button.get());
78 return std::move(button);
79}
80
81void Keyboard::PressKey(int key_code) {
82 key_button_list->ChangeKeyStatus(key_code, true);
83}
84
85void Keyboard::ReleaseKey(int key_code) {
86 key_button_list->ChangeKeyStatus(key_code, false);
87}
88
89void Keyboard::ReleaseAllKeys() {
90 key_button_list->ChangeAllKeyStatus(false);
91}
92
93} // namespace InputCommon