XInput2.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. // Copyright 2013 Max Eliaser
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. // See XInput2.cpp for extensive documentation.
  4. #pragma once
  5. #include <array>
  6. extern "C" {
  7. #include <X11/Xlib.h>
  8. #include <X11/extensions/XInput2.h>
  9. #include <X11/keysym.h>
  10. }
  11. #include "Common/CommonTypes.h"
  12. #include "Common/Matrix.h"
  13. #include "InputCommon/ControllerInterface/ControllerInterface.h"
  14. #include "InputCommon/ControllerInterface/InputBackend.h"
  15. namespace ciface::XInput2
  16. {
  17. std::unique_ptr<ciface::InputBackend> CreateInputBackend(ControllerInterface* controller_interface);
  18. class KeyboardMouse : public Core::Device
  19. {
  20. private:
  21. struct State
  22. {
  23. std::array<char, 32> keyboard;
  24. u32 buttons;
  25. Common::Vec2 cursor;
  26. Common::Vec3 axis;
  27. Common::Vec3 relative_mouse;
  28. };
  29. class Key : public Input
  30. {
  31. friend class KeyboardMouse;
  32. public:
  33. std::string GetName() const override { return m_keyname; }
  34. Key(Display* display, KeyCode keycode, const char* keyboard);
  35. ControlState GetState() const override;
  36. private:
  37. std::string m_keyname;
  38. Display* const m_display;
  39. const char* const m_keyboard;
  40. const KeyCode m_keycode;
  41. };
  42. class Button : public Input
  43. {
  44. public:
  45. std::string GetName() const override { return name; }
  46. Button(unsigned int index, u32* buttons);
  47. ControlState GetState() const override;
  48. private:
  49. const u32* m_buttons;
  50. const unsigned int m_index;
  51. std::string name;
  52. };
  53. class Cursor : public Input
  54. {
  55. public:
  56. std::string GetName() const override { return name; }
  57. bool IsDetectable() const override { return false; }
  58. Cursor(u8 index, bool positive, const float* cursor);
  59. ControlState GetState() const override;
  60. private:
  61. const float* m_cursor;
  62. const u8 m_index;
  63. const bool m_positive;
  64. std::string name;
  65. };
  66. class Axis : public Input
  67. {
  68. public:
  69. std::string GetName() const override { return name; }
  70. bool IsDetectable() const override { return false; }
  71. Axis(u8 index, bool positive, const float* axis);
  72. ControlState GetState() const override;
  73. private:
  74. const float* m_axis;
  75. const u8 m_index;
  76. const bool m_positive;
  77. std::string name;
  78. };
  79. class RelativeMouse : public Input
  80. {
  81. public:
  82. std::string GetName() const override { return name; }
  83. bool IsDetectable() const override { return false; }
  84. RelativeMouse(u8 index, bool positive, const float* axis);
  85. ControlState GetState() const override;
  86. private:
  87. const float* m_axis;
  88. const u8 m_index;
  89. const bool m_positive;
  90. std::string name;
  91. };
  92. private:
  93. void UpdateCursor(bool should_center_mouse);
  94. public:
  95. Core::DeviceRemoval UpdateInput() override;
  96. KeyboardMouse(Window window, int opcode, int pointer_deviceid, int keyboard_deviceid,
  97. double scroll_increment);
  98. ~KeyboardMouse();
  99. std::string GetName() const override;
  100. std::string GetSource() const override;
  101. int GetSortPriority() const override;
  102. private:
  103. Window m_window;
  104. Display* m_display;
  105. State m_state{};
  106. const int xi_opcode;
  107. const int pointer_deviceid;
  108. const int keyboard_deviceid;
  109. const double scroll_increment;
  110. std::string name;
  111. };
  112. } // namespace ciface::XInput2