keyboard.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // Copyright 2018 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <array>
  6. #include "common/bit_field.h"
  7. #include "common/common_funcs.h"
  8. #include "common/common_types.h"
  9. #include "common/swap.h"
  10. #include "core/frontend/input.h"
  11. #include "core/hle/service/hid/controllers/controller_base.h"
  12. #include "core/settings.h"
  13. namespace Service::HID {
  14. class Controller_Keyboard final : public ControllerBase {
  15. public:
  16. explicit Controller_Keyboard(Core::System& system);
  17. ~Controller_Keyboard() override;
  18. // Called when the controller is initialized
  19. void OnInit() override;
  20. // When the controller is released
  21. void OnRelease() override;
  22. // When the controller is requesting an update for the shared memory
  23. void OnUpdate(const Core::Timing::CoreTiming& core_timing, u8* data, std::size_t size) override;
  24. // Called when input devices should be loaded
  25. void OnLoadInputDevices() override;
  26. private:
  27. struct Modifiers {
  28. union {
  29. u32_le raw{};
  30. BitField<0, 1, u32> control;
  31. BitField<1, 1, u32> shift;
  32. BitField<2, 1, u32> left_alt;
  33. BitField<3, 1, u32> right_alt;
  34. BitField<4, 1, u32> gui;
  35. BitField<8, 1, u32> caps_lock;
  36. BitField<9, 1, u32> scroll_lock;
  37. BitField<10, 1, u32> num_lock;
  38. BitField<11, 1, u32> katakana;
  39. BitField<12, 1, u32> hiragana;
  40. };
  41. };
  42. static_assert(sizeof(Modifiers) == 0x4, "Modifiers is an invalid size");
  43. struct KeyboardState {
  44. s64_le sampling_number;
  45. s64_le sampling_number2;
  46. Modifiers modifier;
  47. std::array<u8, 32> key;
  48. };
  49. static_assert(sizeof(KeyboardState) == 0x38, "KeyboardState is an invalid size");
  50. struct SharedMemory {
  51. CommonHeader header;
  52. std::array<KeyboardState, 17> pad_states;
  53. INSERT_PADDING_BYTES(0x28);
  54. };
  55. static_assert(sizeof(SharedMemory) == 0x400, "SharedMemory is an invalid size");
  56. SharedMemory shared_memory{};
  57. std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeKeyboard::NumKeyboardKeys>
  58. keyboard_keys;
  59. std::array<std::unique_ptr<Input::ButtonDevice>, Settings::NativeKeyboard::NumKeyboardMods>
  60. keyboard_mods;
  61. };
  62. } // namespace Service::HID