BsOSInputHandler.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsOSInputHandler.h"
  4. #include "BsPlatform.h"
  5. #include "BsInput.h"
  6. #include "BsMath.h"
  7. using namespace std::placeholders;
  8. namespace BansheeEngine
  9. {
  10. OSInputHandler::OSInputHandler()
  11. :mMouseScroll(0.0f), mLastCursorPosSet(false)
  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. BS_LOCK_MUTEX(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. }
  98. event.screenPos = btnState.cursorPos;
  99. if(btnState.pressed)
  100. {
  101. event.type = PointerEventType::ButtonPressed;
  102. if(!onCursorPressed.empty())
  103. onCursorPressed(event);
  104. }
  105. else
  106. {
  107. event.type = PointerEventType::ButtonReleased;
  108. if(!onCursorReleased.empty())
  109. onCursorReleased(event);
  110. }
  111. buttonStates.pop();
  112. }
  113. while(!doubleClicks.empty())
  114. {
  115. if(!onDoubleClick.empty())
  116. {
  117. DoubleClick& btnState = doubleClicks.front();
  118. PointerEvent event;
  119. event.alt = false;
  120. event.shift = btnState.btnStates.shift;
  121. event.control = btnState.btnStates.ctrl;
  122. event.buttonStates[0] = btnState.btnStates.mouseButtons[0];
  123. event.buttonStates[1] = btnState.btnStates.mouseButtons[1];
  124. event.buttonStates[2] = btnState.btnStates.mouseButtons[2];
  125. event.button = PointerEventButton::Left;
  126. event.screenPos = btnState.cursorPos;
  127. event.type = PointerEventType::DoubleClick;
  128. onDoubleClick(event);
  129. }
  130. doubleClicks.pop();
  131. }
  132. while(!inputCommands.empty())
  133. {
  134. if(!onInputCommand.empty())
  135. onInputCommand(inputCommands.front());
  136. inputCommands.pop();
  137. }
  138. if(!onCharInput.empty())
  139. {
  140. for(auto& curChar : inputString)
  141. {
  142. onCharInput((UINT32)curChar);
  143. }
  144. }
  145. }
  146. void OSInputHandler::charInput(UINT32 character)
  147. {
  148. BS_LOCK_MUTEX(mOSInputMutex);
  149. mInputString += character;
  150. }
  151. void OSInputHandler::cursorMoved(const Vector2I& cursorPos, OSPointerButtonStates& btnStates)
  152. {
  153. BS_LOCK_MUTEX(mOSInputMutex);
  154. mCursorPosition = cursorPos;
  155. mMouseMoveBtnState = btnStates;
  156. }
  157. void OSInputHandler::cursorPressed(const Vector2I& cursorPos,
  158. OSMouseButton button, OSPointerButtonStates& btnStates)
  159. {
  160. BS_LOCK_MUTEX(mOSInputMutex);
  161. mButtonStates.push(ButtonStateChange());
  162. ButtonStateChange& btnState = mButtonStates.back();
  163. btnState.cursorPos = cursorPos;
  164. btnState.button = button;
  165. btnState.pressed = true;
  166. btnState.btnStates = btnStates;
  167. }
  168. void OSInputHandler::cursorReleased(const Vector2I& cursorPos,
  169. OSMouseButton button, OSPointerButtonStates& btnStates)
  170. {
  171. BS_LOCK_MUTEX(mOSInputMutex);
  172. mButtonStates.push(ButtonStateChange());
  173. ButtonStateChange& btnState = mButtonStates.back();
  174. btnState.cursorPos = cursorPos;
  175. btnState.button = button;
  176. btnState.pressed = false;
  177. btnState.btnStates = btnStates;
  178. }
  179. void OSInputHandler::cursorDoubleClick(const Vector2I& cursorPos, OSPointerButtonStates& btnStates)
  180. {
  181. BS_LOCK_MUTEX(mOSInputMutex);
  182. mDoubleClicks.push(DoubleClick());
  183. DoubleClick& btnState = mDoubleClicks.back();
  184. btnState.cursorPos = cursorPos;
  185. btnState.btnStates = btnStates;
  186. }
  187. void OSInputHandler::inputCommandEntered(InputCommandType commandType)
  188. {
  189. BS_LOCK_MUTEX(mOSInputMutex);
  190. mInputCommands.push(commandType);
  191. }
  192. void OSInputHandler::mouseWheelScrolled(float scrollPos)
  193. {
  194. BS_LOCK_MUTEX(mOSInputMutex);
  195. mMouseScroll = scrollPos;
  196. }
  197. }