entry_p.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. /*
  2. * Copyright 2011-2015 Branimir Karadzic. All rights reserved.
  3. * License: http://www.opensource.org/licenses/BSD-2-Clause
  4. */
  5. #ifndef ENTRY_PRIVATE_H_HEADER_GUARD
  6. #define ENTRY_PRIVATE_H_HEADER_GUARD
  7. #include <bx/spscqueue.h>
  8. #include "entry.h"
  9. #include <string.h> // memcpy
  10. #ifndef ENTRY_CONFIG_USE_SDL
  11. # define ENTRY_CONFIG_USE_SDL 0
  12. #endif // ENTRY_CONFIG_USE_SDL
  13. #if !ENTRY_CONFIG_USE_SDL && \
  14. !defined(ENTRY_CONFIG_USE_NATIVE)
  15. # define ENTRY_CONFIG_USE_NATIVE 1
  16. #else
  17. # define ENTRY_CONFIG_USE_NATIVE 0
  18. #endif // ...
  19. #ifndef ENTRY_CONFIG_MAX_WINDOWS
  20. # define ENTRY_CONFIG_MAX_WINDOWS 8
  21. #endif // ENTRY_CONFIG_MAX_WINDOWS
  22. #ifndef ENTRY_CONFIG_MAX_GAMEPADS
  23. # define ENTRY_CONFIG_MAX_GAMEPADS 4
  24. #endif // ENTRY_CONFIG_MAX_GAMEPADS
  25. #if !defined(ENTRY_DEFAULT_WIDTH) && !defined(ENTRY_DEFAULT_HEIGHT)
  26. # define ENTRY_DEFAULT_WIDTH 1280
  27. # define ENTRY_DEFAULT_HEIGHT 720
  28. #elif !defined(ENTRY_DEFAULT_WIDTH) || !defined(ENTRY_DEFAULT_HEIGHT)
  29. # error "Both ENTRY_DEFAULT_WIDTH and ENTRY_DEFAULT_HEIGHT must be defined."
  30. #endif // ENTRY_DEFAULT_WIDTH
  31. #define ENTRY_IMPLEMENT_EVENT(_class, _type) \
  32. _class(WindowHandle _handle) : Event(_type, _handle) {}
  33. namespace entry
  34. {
  35. int main(int _argc, char** _argv);
  36. struct Event
  37. {
  38. enum Enum
  39. {
  40. Axis,
  41. Char,
  42. Exit,
  43. Gamepad,
  44. Key,
  45. Mouse,
  46. Size,
  47. Window,
  48. };
  49. Event(Enum _type)
  50. : m_type(_type)
  51. {
  52. m_handle.idx = UINT16_MAX;
  53. }
  54. Event(Enum _type, WindowHandle _handle)
  55. : m_type(_type)
  56. , m_handle(_handle)
  57. {
  58. }
  59. Event::Enum m_type;
  60. WindowHandle m_handle;
  61. };
  62. struct AxisEvent : public Event
  63. {
  64. ENTRY_IMPLEMENT_EVENT(AxisEvent, Event::Axis);
  65. GamepadAxis::Enum m_axis;
  66. int32_t m_value;
  67. GamepadHandle m_gamepad;
  68. };
  69. struct CharEvent : public Event
  70. {
  71. ENTRY_IMPLEMENT_EVENT(CharEvent, Event::Char);
  72. uint8_t m_len;
  73. uint8_t m_char[4];
  74. };
  75. struct GamepadEvent : public Event
  76. {
  77. ENTRY_IMPLEMENT_EVENT(GamepadEvent, Event::Gamepad);
  78. GamepadHandle m_gamepad;
  79. bool m_connected;
  80. };
  81. struct KeyEvent : public Event
  82. {
  83. ENTRY_IMPLEMENT_EVENT(KeyEvent, Event::Key);
  84. Key::Enum m_key;
  85. uint8_t m_modifiers;
  86. bool m_down;
  87. };
  88. struct MouseEvent : public Event
  89. {
  90. ENTRY_IMPLEMENT_EVENT(MouseEvent, Event::Mouse);
  91. int32_t m_mx;
  92. int32_t m_my;
  93. int32_t m_mz;
  94. MouseButton::Enum m_button;
  95. bool m_down;
  96. bool m_move;
  97. };
  98. struct SizeEvent : public Event
  99. {
  100. ENTRY_IMPLEMENT_EVENT(SizeEvent, Event::Size);
  101. uint32_t m_width;
  102. uint32_t m_height;
  103. };
  104. struct WindowEvent : public Event
  105. {
  106. ENTRY_IMPLEMENT_EVENT(WindowEvent, Event::Window);
  107. void* m_nwh;
  108. };
  109. const Event* poll();
  110. const Event* poll(WindowHandle _handle);
  111. void release(const Event* _event);
  112. class EventQueue
  113. {
  114. public:
  115. void postAxisEvent(WindowHandle _handle, GamepadHandle _gamepad, GamepadAxis::Enum _axis, int32_t _value)
  116. {
  117. AxisEvent* ev = new AxisEvent(_handle);
  118. ev->m_gamepad = _gamepad;
  119. ev->m_axis = _axis;
  120. ev->m_value = _value;
  121. m_queue.push(ev);
  122. }
  123. void postCharEvent(WindowHandle _handle, uint8_t _len, const uint8_t _char[4])
  124. {
  125. CharEvent* ev = new CharEvent(_handle);
  126. ev->m_len = _len;
  127. memcpy(ev->m_char, _char, 4);
  128. m_queue.push(ev);
  129. }
  130. void postExitEvent()
  131. {
  132. Event* ev = new Event(Event::Exit);
  133. m_queue.push(ev);
  134. }
  135. void postGamepadEvent(WindowHandle _handle, GamepadHandle _gamepad, bool _connected)
  136. {
  137. GamepadEvent* ev = new GamepadEvent(_handle);
  138. ev->m_gamepad = _gamepad;
  139. ev->m_connected = _connected;
  140. m_queue.push(ev);
  141. }
  142. void postKeyEvent(WindowHandle _handle, Key::Enum _key, uint8_t _modifiers, bool _down)
  143. {
  144. KeyEvent* ev = new KeyEvent(_handle);
  145. ev->m_key = _key;
  146. ev->m_modifiers = _modifiers;
  147. ev->m_down = _down;
  148. m_queue.push(ev);
  149. }
  150. void postMouseEvent(WindowHandle _handle, int32_t _mx, int32_t _my, int32_t _mz)
  151. {
  152. MouseEvent* ev = new MouseEvent(_handle);
  153. ev->m_mx = _mx;
  154. ev->m_my = _my;
  155. ev->m_mz = _mz;
  156. ev->m_button = MouseButton::None;
  157. ev->m_down = false;
  158. ev->m_move = true;
  159. m_queue.push(ev);
  160. }
  161. void postMouseEvent(WindowHandle _handle, int32_t _mx, int32_t _my, int32_t _mz, MouseButton::Enum _button, bool _down)
  162. {
  163. MouseEvent* ev = new MouseEvent(_handle);
  164. ev->m_mx = _mx;
  165. ev->m_my = _my;
  166. ev->m_mz = _mz;
  167. ev->m_button = _button;
  168. ev->m_down = _down;
  169. ev->m_move = false;
  170. m_queue.push(ev);
  171. }
  172. void postSizeEvent(WindowHandle _handle, uint32_t _width, uint32_t _height)
  173. {
  174. SizeEvent* ev = new SizeEvent(_handle);
  175. ev->m_width = _width;
  176. ev->m_height = _height;
  177. m_queue.push(ev);
  178. }
  179. void postWindowEvent(WindowHandle _handle, void* _nwh = NULL)
  180. {
  181. WindowEvent* ev = new WindowEvent(_handle);
  182. ev->m_nwh = _nwh;
  183. m_queue.push(ev);
  184. }
  185. const Event* poll()
  186. {
  187. return m_queue.pop();
  188. }
  189. const Event* poll(WindowHandle _handle)
  190. {
  191. if (isValid(_handle) )
  192. {
  193. Event* ev = m_queue.peek();
  194. if (NULL == ev
  195. || ev->m_handle.idx != _handle.idx)
  196. {
  197. return NULL;
  198. }
  199. }
  200. return poll();
  201. }
  202. void release(const Event* _event) const
  203. {
  204. delete _event;
  205. }
  206. private:
  207. bx::SpScUnboundedQueue<Event> m_queue;
  208. };
  209. } // namespace entry
  210. #endif // ENTRY_PRIVATE_H_HEADER_GUARD