input.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. #if defined(INPUT_CARBON)
  2. #include <ruby/input/carbon.cpp>
  3. #endif
  4. #if defined(INPUT_QUARTZ)
  5. #include <ruby/input/quartz.cpp>
  6. #endif
  7. #if defined(INPUT_SDL)
  8. #include <ruby/input/sdl.cpp>
  9. #endif
  10. #if defined(INPUT_UDEV)
  11. #include <ruby/input/udev.cpp>
  12. #endif
  13. #if defined(INPUT_UHID)
  14. #include <ruby/input/uhid.cpp>
  15. #endif
  16. #if defined(INPUT_WINDOWS)
  17. #include <ruby/input/windows.cpp>
  18. #endif
  19. #if defined(INPUT_XLIB)
  20. #include <ruby/input/xlib.cpp>
  21. #endif
  22. namespace ruby {
  23. auto Input::setContext(uintptr context) -> bool {
  24. if(instance->context == context) return true;
  25. if(!instance->hasContext()) return false;
  26. if(!instance->setContext(instance->context = context)) return false;
  27. return true;
  28. }
  29. //
  30. auto Input::acquired() -> bool {
  31. return instance->acquired();
  32. }
  33. auto Input::acquire() -> bool {
  34. return instance->acquire();
  35. }
  36. auto Input::release() -> bool {
  37. return instance->release();
  38. }
  39. auto Input::poll() -> vector<shared_pointer<nall::HID::Device>> {
  40. return instance->poll();
  41. }
  42. auto Input::rumble(uint64_t id, bool enable) -> bool {
  43. return instance->rumble(id, enable);
  44. }
  45. //
  46. auto Input::onChange(const function<void (shared_pointer<HID::Device>, uint, uint, int16_t, int16_t)>& onChange) -> void {
  47. change = onChange;
  48. }
  49. auto Input::doChange(shared_pointer<HID::Device> device, uint group, uint input, int16_t oldValue, int16_t newValue) -> void {
  50. if(change) change(device, group, input, oldValue, newValue);
  51. }
  52. //
  53. auto Input::create(string driver) -> bool {
  54. self.instance.reset();
  55. if(!driver) driver = optimalDriver();
  56. #if defined(INPUT_WINDOWS)
  57. if(driver == "Windows") self.instance = new InputWindows(*this);
  58. #endif
  59. #if defined(INPUT_QUARTZ)
  60. if(driver == "Quartz") self.instance = new InputQuartz(*this);
  61. #endif
  62. #if defined(INPUT_CARBON)
  63. if(driver == "Carbon") self.instance = new InputCarbon(*this);
  64. #endif
  65. #if defined(INPUT_UDEV)
  66. if(driver == "udev") self.instance = new InputUdev(*this);
  67. #endif
  68. #if defined(INPUT_UHID)
  69. if(driver == "uhid") self.instance = new InputUHID(*this);
  70. #endif
  71. #if defined(INPUT_SDL)
  72. if(driver == "SDL") self.instance = new InputSDL(*this);
  73. #endif
  74. #if defined(INPUT_XLIB)
  75. if(driver == "Xlib") self.instance = new InputXlib(*this);
  76. #endif
  77. if(!self.instance) self.instance = new InputDriver(*this);
  78. return self.instance->create();
  79. }
  80. auto Input::hasDrivers() -> vector<string> {
  81. return {
  82. #if defined(INPUT_WINDOWS)
  83. "Windows",
  84. #endif
  85. #if defined(INPUT_QUARTZ)
  86. "Quartz",
  87. #endif
  88. #if defined(INPUT_CARBON)
  89. "Carbon",
  90. #endif
  91. #if defined(INPUT_UDEV)
  92. "udev",
  93. #endif
  94. #if defined(INPUT_UHID)
  95. "uhid",
  96. #endif
  97. #if defined(INPUT_SDL)
  98. "SDL",
  99. #endif
  100. #if defined(INPUT_XLIB)
  101. "Xlib",
  102. #endif
  103. "None"};
  104. }
  105. auto Input::optimalDriver() -> string {
  106. #if defined(INPUT_WINDOWS)
  107. return "Windows";
  108. #elif defined(INPUT_QUARTZ)
  109. return "Quartz";
  110. #elif defined(INPUT_CARBON)
  111. return "Carbon";
  112. #elif defined(INPUT_UDEV)
  113. return "udev";
  114. #elif defined(INPUT_UHID)
  115. return "uhid";
  116. #elif defined(INPUT_SDL)
  117. return "SDL";
  118. #elif defined(INPUT_XLIB)
  119. return "Xlib";
  120. #else
  121. return "None";
  122. #endif
  123. }
  124. auto Input::safestDriver() -> string {
  125. #if defined(INPUT_WINDOWS)
  126. return "Windows";
  127. #elif defined(INPUT_QUARTZ)
  128. return "Quartz";
  129. #elif defined(INPUT_CARBON)
  130. return "Carbon";
  131. #elif defined(INPUT_UDEV)
  132. return "udev";
  133. #elif defined(INPUT_UHID)
  134. return "uhid";
  135. #elif defined(INPUT_SDL)
  136. return "SDL";
  137. #elif defined(INPUT_XLIB)
  138. return "Xlib";
  139. #else
  140. return "none";
  141. #endif
  142. }
  143. }