keyboard.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "common/param_package.h"
  4. #include "common/settings_input.h"
  5. #include "input_common/drivers/keyboard.h"
  6. namespace InputCommon {
  7. constexpr PadIdentifier key_identifier = {
  8. .guid = Common::UUID{},
  9. .port = 0,
  10. .pad = 0,
  11. };
  12. constexpr PadIdentifier keyboard_key_identifier = {
  13. .guid = Common::UUID{},
  14. .port = 1,
  15. .pad = 0,
  16. };
  17. constexpr PadIdentifier keyboard_modifier_identifier = {
  18. .guid = Common::UUID{},
  19. .port = 1,
  20. .pad = 1,
  21. };
  22. Keyboard::Keyboard(std::string input_engine_) : InputEngine(std::move(input_engine_)) {
  23. // Keyboard is broken into 3 different sets:
  24. // key: Unfiltered intended for controllers.
  25. // keyboard_key: Allows only Settings::NativeKeyboard::Keys intended for keyboard emulation.
  26. // keyboard_modifier: Allows only Settings::NativeKeyboard::Modifiers intended for keyboard
  27. // emulation.
  28. PreSetController(key_identifier);
  29. PreSetController(keyboard_key_identifier);
  30. PreSetController(keyboard_modifier_identifier);
  31. }
  32. void Keyboard::PressKey(int key_code) {
  33. SetButton(key_identifier, key_code, true);
  34. }
  35. void Keyboard::ReleaseKey(int key_code) {
  36. SetButton(key_identifier, key_code, false);
  37. }
  38. void Keyboard::PressKeyboardKey(int key_index) {
  39. if (key_index == Settings::NativeKeyboard::None) {
  40. return;
  41. }
  42. SetButton(keyboard_key_identifier, key_index, true);
  43. }
  44. void Keyboard::ReleaseKeyboardKey(int key_index) {
  45. if (key_index == Settings::NativeKeyboard::None) {
  46. return;
  47. }
  48. SetButton(keyboard_key_identifier, key_index, false);
  49. }
  50. void Keyboard::SetKeyboardModifiers(int key_modifiers) {
  51. for (int i = 0; i < 32; ++i) {
  52. bool key_value = ((key_modifiers >> i) & 0x1) != 0;
  53. SetButton(keyboard_modifier_identifier, i, key_value);
  54. // Use the modifier to press the key button equivalent
  55. switch (i) {
  56. case Settings::NativeKeyboard::LeftControl:
  57. SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftControlKey, key_value);
  58. break;
  59. case Settings::NativeKeyboard::LeftShift:
  60. SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftShiftKey, key_value);
  61. break;
  62. case Settings::NativeKeyboard::LeftAlt:
  63. SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftAltKey, key_value);
  64. break;
  65. case Settings::NativeKeyboard::LeftMeta:
  66. SetButton(keyboard_key_identifier, Settings::NativeKeyboard::LeftMetaKey, key_value);
  67. break;
  68. case Settings::NativeKeyboard::RightControl:
  69. SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightControlKey,
  70. key_value);
  71. break;
  72. case Settings::NativeKeyboard::RightShift:
  73. SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightShiftKey, key_value);
  74. break;
  75. case Settings::NativeKeyboard::RightAlt:
  76. SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightAltKey, key_value);
  77. break;
  78. case Settings::NativeKeyboard::RightMeta:
  79. SetButton(keyboard_key_identifier, Settings::NativeKeyboard::RightMetaKey, key_value);
  80. break;
  81. default:
  82. // Other modifier keys should be pressed with PressKey since they stay enabled until
  83. // next press
  84. break;
  85. }
  86. }
  87. }
  88. void Keyboard::ReleaseAllKeys() {
  89. ResetButtonState();
  90. }
  91. std::vector<Common::ParamPackage> Keyboard::GetInputDevices() const {
  92. std::vector<Common::ParamPackage> devices;
  93. devices.emplace_back(Common::ParamPackage{
  94. {"engine", GetEngineName()},
  95. {"display", "Keyboard Only"},
  96. });
  97. return devices;
  98. }
  99. } // namespace InputCommon