entry_p.h 6.1 KB

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