diff options
| author | 2024-01-04 20:37:43 -0600 | |
|---|---|---|
| committer | 2024-01-05 11:41:15 -0600 | |
| commit | ee847f8ff0b1b0aec39c1b78c010bc0c08a0a613 (patch) | |
| tree | 3b95cbb74be05f0ce7a007353f1f9f95e1ed3901 /src/hid_core/resources/keyboard | |
| parent | Merge pull request #12437 from ameerj/gl-amd-fixes (diff) | |
| download | yuzu-ee847f8ff0b1b0aec39c1b78c010bc0c08a0a613.tar.gz yuzu-ee847f8ff0b1b0aec39c1b78c010bc0c08a0a613.tar.xz yuzu-ee847f8ff0b1b0aec39c1b78c010bc0c08a0a613.zip | |
hid_core: Move hid to it's own subproject
Diffstat (limited to 'src/hid_core/resources/keyboard')
| -rw-r--r-- | src/hid_core/resources/keyboard/keyboard.cpp | 56 | ||||
| -rw-r--r-- | src/hid_core/resources/keyboard/keyboard.h | 33 | ||||
| -rw-r--r-- | src/hid_core/resources/keyboard/keyboard_types.h | 20 |
3 files changed, 109 insertions, 0 deletions
diff --git a/src/hid_core/resources/keyboard/keyboard.cpp b/src/hid_core/resources/keyboard/keyboard.cpp new file mode 100644 index 000000000..340e8a65c --- /dev/null +++ b/src/hid_core/resources/keyboard/keyboard.cpp | |||
| @@ -0,0 +1,56 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #include "common/settings.h" | ||
| 5 | #include "core/core_timing.h" | ||
| 6 | #include "hid_core/frontend/emulated_devices.h" | ||
| 7 | #include "hid_core/hid_core.h" | ||
| 8 | #include "hid_core/resources/applet_resource.h" | ||
| 9 | #include "hid_core/resources/keyboard/keyboard.h" | ||
| 10 | #include "hid_core/resources/shared_memory_format.h" | ||
| 11 | |||
| 12 | namespace Service::HID { | ||
| 13 | |||
| 14 | Keyboard::Keyboard(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} { | ||
| 15 | emulated_devices = hid_core.GetEmulatedDevices(); | ||
| 16 | } | ||
| 17 | |||
| 18 | Keyboard::~Keyboard() = default; | ||
| 19 | |||
| 20 | void Keyboard::OnInit() {} | ||
| 21 | |||
| 22 | void Keyboard::OnRelease() {} | ||
| 23 | |||
| 24 | void Keyboard::OnUpdate(const Core::Timing::CoreTiming& core_timing) { | ||
| 25 | std::scoped_lock shared_lock{*shared_mutex}; | ||
| 26 | const u64 aruid = applet_resource->GetActiveAruid(); | ||
| 27 | auto* data = applet_resource->GetAruidData(aruid); | ||
| 28 | |||
| 29 | if (data == nullptr || !data->flag.is_assigned) { | ||
| 30 | return; | ||
| 31 | } | ||
| 32 | |||
| 33 | KeyboardSharedMemoryFormat& shared_memory = data->shared_memory_format->keyboard; | ||
| 34 | |||
| 35 | if (!IsControllerActivated()) { | ||
| 36 | shared_memory.keyboard_lifo.buffer_count = 0; | ||
| 37 | shared_memory.keyboard_lifo.buffer_tail = 0; | ||
| 38 | return; | ||
| 39 | } | ||
| 40 | |||
| 41 | const auto& last_entry = shared_memory.keyboard_lifo.ReadCurrentEntry().state; | ||
| 42 | next_state.sampling_number = last_entry.sampling_number + 1; | ||
| 43 | |||
| 44 | if (Settings::values.keyboard_enabled) { | ||
| 45 | const auto& keyboard_state = emulated_devices->GetKeyboard(); | ||
| 46 | const auto& keyboard_modifier_state = emulated_devices->GetKeyboardModifier(); | ||
| 47 | |||
| 48 | next_state.key = keyboard_state; | ||
| 49 | next_state.modifier = keyboard_modifier_state; | ||
| 50 | next_state.attribute.is_connected.Assign(1); | ||
| 51 | } | ||
| 52 | |||
| 53 | shared_memory.keyboard_lifo.WriteNextEntry(next_state); | ||
| 54 | } | ||
| 55 | |||
| 56 | } // namespace Service::HID | ||
diff --git a/src/hid_core/resources/keyboard/keyboard.h b/src/hid_core/resources/keyboard/keyboard.h new file mode 100644 index 000000000..4bcc1c1b2 --- /dev/null +++ b/src/hid_core/resources/keyboard/keyboard.h | |||
| @@ -0,0 +1,33 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include "hid_core/resources/controller_base.h" | ||
| 7 | #include "hid_core/resources/keyboard/keyboard_types.h" | ||
| 8 | |||
| 9 | namespace Core::HID { | ||
| 10 | class HIDCore; | ||
| 11 | class EmulatedDevices; | ||
| 12 | } // namespace Core::HID | ||
| 13 | |||
| 14 | namespace Service::HID { | ||
| 15 | class Keyboard final : public ControllerBase { | ||
| 16 | public: | ||
| 17 | explicit Keyboard(Core::HID::HIDCore& hid_core_); | ||
| 18 | ~Keyboard() override; | ||
| 19 | |||
| 20 | // Called when the controller is initialized | ||
| 21 | void OnInit() override; | ||
| 22 | |||
| 23 | // When the controller is released | ||
| 24 | void OnRelease() override; | ||
| 25 | |||
| 26 | // When the controller is requesting an update for the shared memory | ||
| 27 | void OnUpdate(const Core::Timing::CoreTiming& core_timing) override; | ||
| 28 | |||
| 29 | private: | ||
| 30 | KeyboardState next_state{}; | ||
| 31 | Core::HID::EmulatedDevices* emulated_devices = nullptr; | ||
| 32 | }; | ||
| 33 | } // namespace Service::HID | ||
diff --git a/src/hid_core/resources/keyboard/keyboard_types.h b/src/hid_core/resources/keyboard/keyboard_types.h new file mode 100644 index 000000000..4d7ff2f0a --- /dev/null +++ b/src/hid_core/resources/keyboard/keyboard_types.h | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | // SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-3.0-or-later | ||
| 3 | |||
| 4 | #pragma once | ||
| 5 | |||
| 6 | #include "common/common_types.h" | ||
| 7 | #include "hid_core/hid_types.h" | ||
| 8 | |||
| 9 | namespace Service::HID { | ||
| 10 | |||
| 11 | // This is nn::hid::detail::KeyboardState | ||
| 12 | struct KeyboardState { | ||
| 13 | s64 sampling_number{}; | ||
| 14 | Core::HID::KeyboardModifier modifier{}; | ||
| 15 | Core::HID::KeyboardAttribute attribute{}; | ||
| 16 | Core::HID::KeyboardKey key{}; | ||
| 17 | }; | ||
| 18 | static_assert(sizeof(KeyboardState) == 0x30, "KeyboardState is an invalid size"); | ||
| 19 | |||
| 20 | } // namespace Service::HID | ||