udev.cpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <unistd.h>
  2. #include <errno.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <sys/poll.h>
  6. #include <fcntl.h>
  7. #include <libudev.h>
  8. #include <linux/types.h>
  9. #include <linux/input.h>
  10. #include "keyboard/xlib.cpp"
  11. #include "mouse/xlib.cpp"
  12. #include "joypad/udev.cpp"
  13. struct InputUdev : InputDriver {
  14. InputUdev& self = *this;
  15. InputUdev(Input& super) : InputDriver(super), keyboard(super), mouse(super), joypad(super) {}
  16. ~InputUdev() { terminate(); }
  17. auto create() -> bool override {
  18. return initialize();
  19. }
  20. auto driver() -> string override { return "udev"; }
  21. auto ready() -> bool { return isReady; }
  22. auto hasContext() -> bool override { return true; }
  23. auto setContext(uintptr context) -> bool override { return initialize(); }
  24. auto acquired() -> bool override { return mouse.acquired(); }
  25. auto acquire() -> bool override { return mouse.acquire(); }
  26. auto release() -> bool override { return mouse.release(); }
  27. auto poll() -> vector<shared_pointer<HID::Device>> override {
  28. vector<shared_pointer<HID::Device>> devices;
  29. keyboard.poll(devices);
  30. mouse.poll(devices);
  31. joypad.poll(devices);
  32. return devices;
  33. }
  34. auto rumble(uint64_t id, bool enable) -> bool override {
  35. return joypad.rumble(id, enable);
  36. }
  37. private:
  38. auto initialize() -> bool {
  39. terminate();
  40. if(!self.context) return false;
  41. if(!keyboard.initialize()) return false;
  42. if(!mouse.initialize(self.context)) return false;
  43. if(!joypad.initialize()) return false;
  44. return isReady = true;
  45. }
  46. auto terminate() -> void {
  47. isReady = false;
  48. keyboard.terminate();
  49. mouse.terminate();
  50. joypad.terminate();
  51. }
  52. bool isReady = false;
  53. InputKeyboardXlib keyboard;
  54. InputMouseXlib mouse;
  55. InputJoypadUdev joypad;
  56. };