summaryrefslogtreecommitdiff
path: root/src/hid_core/resources/keyboard
diff options
context:
space:
mode:
authorGravatar Narr the Reg2024-01-04 20:37:43 -0600
committerGravatar Narr the Reg2024-01-05 11:41:15 -0600
commitee847f8ff0b1b0aec39c1b78c010bc0c08a0a613 (patch)
tree3b95cbb74be05f0ce7a007353f1f9f95e1ed3901 /src/hid_core/resources/keyboard
parentMerge pull request #12437 from ameerj/gl-amd-fixes (diff)
downloadyuzu-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.cpp56
-rw-r--r--src/hid_core/resources/keyboard/keyboard.h33
-rw-r--r--src/hid_core/resources/keyboard/keyboard_types.h20
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
12namespace Service::HID {
13
14Keyboard::Keyboard(Core::HID::HIDCore& hid_core_) : ControllerBase{hid_core_} {
15 emulated_devices = hid_core.GetEmulatedDevices();
16}
17
18Keyboard::~Keyboard() = default;
19
20void Keyboard::OnInit() {}
21
22void Keyboard::OnRelease() {}
23
24void 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
9namespace Core::HID {
10class HIDCore;
11class EmulatedDevices;
12} // namespace Core::HID
13
14namespace Service::HID {
15class Keyboard final : public ControllerBase {
16public:
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
29private:
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
9namespace Service::HID {
10
11// This is nn::hid::detail::KeyboardState
12struct KeyboardState {
13 s64 sampling_number{};
14 Core::HID::KeyboardModifier modifier{};
15 Core::HID::KeyboardAttribute attribute{};
16 Core::HID::KeyboardKey key{};
17};
18static_assert(sizeof(KeyboardState) == 0x30, "KeyboardState is an invalid size");
19
20} // namespace Service::HID