summaryrefslogtreecommitdiff
path: root/src/core/hid/emulated_devices.h
diff options
context:
space:
mode:
authorGravatar german772021-09-20 19:43:16 -0500
committerGravatar Narr the Reg2021-11-24 20:30:23 -0600
commitc3f54ff2329d79bdbb273678b5123cf0b1cd090c (patch)
tree671542346e2f692b2cef8dc4da6ccdb0b9e21dc2 /src/core/hid/emulated_devices.h
parentyuzu_cmd: Use new input (diff)
downloadyuzu-c3f54ff2329d79bdbb273678b5123cf0b1cd090c.tar.gz
yuzu-c3f54ff2329d79bdbb273678b5123cf0b1cd090c.tar.xz
yuzu-c3f54ff2329d79bdbb273678b5123cf0b1cd090c.zip
core/hid: Add emulated controllers
Diffstat (limited to 'src/core/hid/emulated_devices.h')
-rw-r--r--src/core/hid/emulated_devices.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/core/hid/emulated_devices.h b/src/core/hid/emulated_devices.h
new file mode 100644
index 000000000..6f728eff5
--- /dev/null
+++ b/src/core/hid/emulated_devices.h
@@ -0,0 +1,137 @@
1// Copyright 2021 yuzu Emulator Project
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#pragma once
6
7#include <functional>
8#include <mutex>
9#include <unordered_map>
10
11#include "common/input.h"
12#include "common/param_package.h"
13#include "common/settings.h"
14#include "core/hid/hid_types.h"
15#include "core/hid/motion_input.h"
16
17namespace Core::HID {
18
19using KeyboardDevices =
20 std::array<std::unique_ptr<Input::InputDevice>, Settings::NativeKeyboard::NumKeyboardKeys>;
21using KeyboardModifierDevices =
22 std::array<std::unique_ptr<Input::InputDevice>, Settings::NativeKeyboard::NumKeyboardMods>;
23using MouseButtonDevices =
24 std::array<std::unique_ptr<Input::InputDevice>, Settings::NativeMouseButton::NumMouseButtons>;
25
26using MouseButtonParams =
27 std::array<Common::ParamPackage, Settings::NativeMouseButton::NumMouseButtons>;
28
29using KeyboardValues = std::array<Input::ButtonStatus, Settings::NativeKeyboard::NumKeyboardKeys>;
30using KeyboardModifierValues =
31 std::array<Input::ButtonStatus, Settings::NativeKeyboard::NumKeyboardMods>;
32using MouseButtonValues =
33 std::array<Input::ButtonStatus, Settings::NativeMouseButton::NumMouseButtons>;
34
35struct MousePosition {
36 s32 x;
37 s32 y;
38 s32 delta_wheel_x;
39 s32 delta_wheel_y;
40};
41
42struct DeviceStatus {
43 // Data from input_common
44 KeyboardValues keyboard_values{};
45 KeyboardModifierValues keyboard_moddifier_values{};
46 MouseButtonValues mouse_button_values{};
47
48 // Data for Nintendo devices
49 KeyboardKey keyboard_state{};
50 KeyboardModifier keyboard_moddifier_state{};
51 MouseButton mouse_button_state{};
52 MousePosition mouse_position_state{};
53};
54
55enum class DeviceTriggerType {
56 Keyboard,
57 KeyboardModdifier,
58 Mouse,
59};
60
61struct InterfaceUpdateCallback {
62 std::function<void(DeviceTriggerType)> on_change;
63};
64
65class EmulatedDevices {
66public:
67 /**
68 * TODO: Write description
69 *
70 * @param npad_id_type
71 */
72 explicit EmulatedDevices();
73 ~EmulatedDevices();
74
75 YUZU_NON_COPYABLE(EmulatedDevices);
76 YUZU_NON_MOVEABLE(EmulatedDevices);
77
78 void ReloadFromSettings();
79 void ReloadInput();
80 void UnloadInput();
81
82 void EnableConfiguration();
83 void DisableConfiguration();
84 bool IsConfiguring() const;
85 void SaveCurrentConfig();
86 void RestoreConfig();
87
88 std::vector<Common::ParamPackage> GetMappedDevices() const;
89
90 Common::ParamPackage GetMouseButtonParam(std::size_t index) const;
91
92 void SetButtonParam(std::size_t index, Common::ParamPackage param);
93
94 KeyboardValues GetKeyboardValues() const;
95 KeyboardModifierValues GetKeyboardModdifierValues() const;
96 MouseButtonValues GetMouseButtonsValues() const;
97
98 KeyboardKey GetKeyboard() const;
99 KeyboardModifier GetKeyboardModifier() const;
100 MouseButton GetMouseButtons() const;
101 MousePosition GetMousePosition() const;
102
103 int SetCallback(InterfaceUpdateCallback update_callback);
104 void DeleteCallback(int key);
105
106private:
107 /**
108 * Sets the status of a button. Applies toggle properties to the output.
109 *
110 * @param A CallbackStatus and a button index number
111 */
112 void SetKeyboardButton(Input::CallbackStatus callback, std::size_t index);
113 void SetKeyboardModifier(Input::CallbackStatus callback, std::size_t index);
114 void SetMouseButton(Input::CallbackStatus callback, std::size_t index);
115
116 /**
117 * Triggers a callback that something has changed
118 *
119 * @param Input type of the trigger
120 */
121 void TriggerOnChange(DeviceTriggerType type);
122
123 bool is_configuring{false};
124
125 MouseButtonParams mouse_button_params;
126
127 KeyboardDevices keyboard_devices;
128 KeyboardModifierDevices keyboard_modifier_devices;
129 MouseButtonDevices mouse_button_devices;
130
131 mutable std::mutex mutex;
132 std::unordered_map<int, InterfaceUpdateCallback> callback_list;
133 int last_callback_key = 0;
134 DeviceStatus device_status;
135};
136
137} // namespace Core::HID