BsOSInputHandler.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Input/BsOSInputHandler.h"
  4. #include "Platform/BsPlatform.h"
  5. #include "Input/BsInput.h"
  6. #include "Math/BsMath.h"
  7. using namespace std::placeholders;
  8. namespace bs
  9. {
  10. OSInputHandler::OSInputHandler()
  11. :mLastCursorPosSet(false), mMouseScroll(0.0f)
  12. {
  13. mCharInputConn = Platform::onCharInput.connect(std::bind(&OSInputHandler::charInput, this, _1));
  14. mCursorMovedConn = Platform::onCursorMoved.connect(std::bind(&OSInputHandler::cursorMoved, this, _1, _2));
  15. mCursorPressedConn = Platform::onCursorButtonPressed.connect(std::bind(&OSInputHandler::cursorPressed, this, _1, _2, _3));
  16. mCursorReleasedConn = Platform::onCursorButtonReleased.connect(std::bind(&OSInputHandler::cursorReleased, this, _1, _2, _3));
  17. mCursorDoubleClickConn = Platform::onCursorDoubleClick.connect(std::bind(&OSInputHandler::cursorDoubleClick, this, _1, _2));
  18. mInputCommandConn = Platform::onInputCommand.connect(std::bind(&OSInputHandler::inputCommandEntered, this, _1));
  19. mMouseWheelScrolledConn = Platform::onMouseWheelScrolled.connect(std::bind(&OSInputHandler::mouseWheelScrolled, this, _1));
  20. }
  21. OSInputHandler::~OSInputHandler()
  22. {
  23. mCharInputConn.disconnect();
  24. mCursorMovedConn.disconnect();
  25. mCursorPressedConn.disconnect();
  26. mCursorReleasedConn.disconnect();
  27. mCursorDoubleClickConn.disconnect();
  28. mInputCommandConn.disconnect();
  29. mMouseWheelScrolledConn.disconnect();
  30. }
  31. void OSInputHandler::_update()
  32. {
  33. WString inputString;
  34. Vector2I mousePosition;
  35. float mouseScroll;
  36. OSPointerButtonStates mouseMoveBtnState;
  37. Queue<ButtonStateChange> buttonStates;
  38. Queue<DoubleClick> doubleClicks;
  39. Queue<InputCommandType> inputCommands;
  40. {
  41. Lock lock(mOSInputMutex);
  42. inputString = mInputString;
  43. mInputString.clear();
  44. mousePosition = mCursorPosition;
  45. mouseScroll = mMouseScroll;
  46. mMouseScroll = 0.0f;
  47. mouseMoveBtnState = mMouseMoveBtnState;
  48. buttonStates = mButtonStates;
  49. mButtonStates = Queue<ButtonStateChange>();
  50. inputCommands = mInputCommands;
  51. mInputCommands = Queue<InputCommandType>();
  52. doubleClicks = mDoubleClicks;
  53. mDoubleClicks = Queue<DoubleClick>();
  54. }
  55. if(mousePosition != mLastCursorPos || (Math::abs(mouseScroll) > 0.00001f))
  56. {
  57. if(!onCursorMoved.empty())
  58. {
  59. PointerEvent event;
  60. event.alt = false;
  61. event.shift = mouseMoveBtnState.shift;
  62. event.control = mouseMoveBtnState.ctrl;
  63. event.buttonStates[0] = mouseMoveBtnState.mouseButtons[0];
  64. event.buttonStates[1] = mouseMoveBtnState.mouseButtons[1];
  65. event.buttonStates[2] = mouseMoveBtnState.mouseButtons[2];
  66. event.mouseWheelScrollAmount = mouseScroll;
  67. event.type = PointerEventType::CursorMoved;
  68. event.screenPos = mousePosition;
  69. if (mLastCursorPosSet)
  70. event.delta = mousePosition - mLastCursorPos;
  71. onCursorMoved(event);
  72. }
  73. mLastCursorPos = mousePosition;
  74. mLastCursorPosSet = true;
  75. }
  76. while(!buttonStates.empty())
  77. {
  78. ButtonStateChange& btnState = buttonStates.front();
  79. PointerEvent event;
  80. event.alt = false;
  81. event.shift = btnState.btnStates.shift;
  82. event.control = btnState.btnStates.ctrl;
  83. event.buttonStates[0] = btnState.btnStates.mouseButtons[0];
  84. event.buttonStates[1] = btnState.btnStates.mouseButtons[1];
  85. event.buttonStates[2] = btnState.btnStates.mouseButtons[2];
  86. switch(btnState.button)
  87. {
  88. case OSMouseButton::Left:
  89. event.button = PointerEventButton::Left;
  90. break;
  91. case OSMouseButton::Middle:
  92. event.button = PointerEventButton::Middle;
  93. break;
  94. case OSMouseButton::Right:
  95. event.button = PointerEventButton::Right;
  96. break;
  97. default:
  98. break;
  99. }
  100. event.screenPos = btnState.cursorPos;
  101. if(btnState.pressed)
  102. {
  103. event.type = PointerEventType::ButtonPressed;
  104. if(!onCursorPressed.empty())
  105. onCursorPressed(event);
  106. }
  107. else
  108. {
  109. event.type = PointerEventType::ButtonReleased;
  110. if(!onCursorReleased.empty())
  111. onCursorReleased(event);
  112. }
  113. buttonStates.pop();
  114. }
  115. while(!doubleClicks.empty())
  116. {
  117. if(!onDoubleClick.empty())
  118. {
  119. DoubleClick& btnState = doubleClicks.front();
  120. PointerEvent event;
  121. event.alt = false;
  122. event.shift = btnState.btnStates.shift;
  123. event.control = btnState.btnStates.ctrl;
  124. event.buttonStates[0] = btnState.btnStates.mouseButtons[0];
  125. event.buttonStates[1] = btnState.btnStates.mouseButtons[1];
  126. event.buttonStates[2] = btnState.btnStates.mouseButtons[2];
  127. event.button = PointerEventButton::Left;
  128. event.screenPos = btnState.cursorPos;
  129. event.type = PointerEventType::DoubleClick;
  130. onDoubleClick(event);
  131. }
  132. doubleClicks.pop();
  133. }
  134. while(!inputCommands.empty())
  135. {
  136. if(!onInputCommand.empty())
  137. onInputCommand(inputCommands.front());
  138. inputCommands.pop();
  139. }
  140. if(!onCharInput.empty())
  141. {
  142. for(auto& curChar : inputString)
  143. {
  144. onCharInput((UINT32)curChar);
  145. }
  146. }
  147. }
  148. void OSInputHandler::charInput(UINT32 character)
  149. {
  150. Lock lock(mOSInputMutex);
  151. mInputString += character;
  152. }
  153. void OSInputHandler::cursorMoved(const Vector2I& cursorPos, const OSPointerButtonStates& btnStates)
  154. {
  155. Lock lock(mOSInputMutex);
  156. mCursorPosition = cursorPos;
  157. mMouseMoveBtnState = btnStates;
  158. }
  159. void OSInputHandler::cursorPressed(const Vector2I& cursorPos,
  160. OSMouseButton button, const OSPointerButtonStates& btnStates)
  161. {
  162. Lock lock(mOSInputMutex);
  163. mButtonStates.push(ButtonStateChange());
  164. ButtonStateChange& btnState = mButtonStates.back();
  165. btnState.cursorPos = cursorPos;
  166. btnState.button = button;
  167. btnState.pressed = true;
  168. btnState.btnStates = btnStates;
  169. }
  170. void OSInputHandler::cursorReleased(const Vector2I& cursorPos,
  171. OSMouseButton button, const OSPointerButtonStates& btnStates)
  172. {
  173. Lock lock(mOSInputMutex);
  174. mButtonStates.push(ButtonStateChange());
  175. ButtonStateChange& btnState = mButtonStates.back();
  176. btnState.cursorPos = cursorPos;
  177. btnState.button = button;
  178. btnState.pressed = false;
  179. btnState.btnStates = btnStates;
  180. }
  181. void OSInputHandler::cursorDoubleClick(const Vector2I& cursorPos, const OSPointerButtonStates& btnStates)
  182. {
  183. Lock lock(mOSInputMutex);
  184. mDoubleClicks.push(DoubleClick());
  185. DoubleClick& btnState = mDoubleClicks.back();
  186. btnState.cursorPos = cursorPos;
  187. btnState.btnStates = btnStates;
  188. }
  189. void OSInputHandler::inputCommandEntered(InputCommandType commandType)
  190. {
  191. Lock lock(mOSInputMutex);
  192. mInputCommands.push(commandType);
  193. }
  194. void OSInputHandler::mouseWheelScrolled(float scrollPos)
  195. {
  196. Lock lock(mOSInputMutex);
  197. mMouseScroll = scrollPos;
  198. }
  199. }