keyboard.cpp 3.9 KB

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