entry_p.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  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. };
  63. Event(Enum _type)
  64. : m_type(_type)
  65. {
  66. m_handle.idx = UINT16_MAX;
  67. }
  68. Event(Enum _type, WindowHandle _handle)
  69. : m_type(_type)
  70. , m_handle(_handle)
  71. {
  72. }
  73. Event::Enum m_type;
  74. WindowHandle m_handle;
  75. };
  76. struct AxisEvent : public Event
  77. {
  78. ENTRY_IMPLEMENT_EVENT(AxisEvent, Event::Axis);
  79. GamepadAxis::Enum m_axis;
  80. int32_t m_value;
  81. GamepadHandle m_gamepad;
  82. };
  83. struct CharEvent : public Event
  84. {
  85. ENTRY_IMPLEMENT_EVENT(CharEvent, Event::Char);
  86. uint8_t m_len;
  87. uint8_t m_char[4];
  88. };
  89. struct GamepadEvent : public Event
  90. {
  91. ENTRY_IMPLEMENT_EVENT(GamepadEvent, Event::Gamepad);
  92. GamepadHandle m_gamepad;
  93. bool m_connected;
  94. };
  95. struct KeyEvent : public Event
  96. {
  97. ENTRY_IMPLEMENT_EVENT(KeyEvent, Event::Key);
  98. Key::Enum m_key;
  99. uint8_t m_modifiers;
  100. bool m_down;
  101. };
  102. struct MouseEvent : public Event
  103. {
  104. ENTRY_IMPLEMENT_EVENT(MouseEvent, Event::Mouse);
  105. int32_t m_mx;
  106. int32_t m_my;
  107. int32_t m_mz;
  108. MouseButton::Enum m_button;
  109. bool m_down;
  110. bool m_move;
  111. };
  112. struct SizeEvent : public Event
  113. {
  114. ENTRY_IMPLEMENT_EVENT(SizeEvent, Event::Size);
  115. uint32_t m_width;
  116. uint32_t m_height;
  117. };
  118. struct WindowEvent : public Event
  119. {
  120. ENTRY_IMPLEMENT_EVENT(WindowEvent, Event::Window);
  121. void* m_nwh;
  122. };
  123. const Event* poll();
  124. const Event* poll(WindowHandle _handle);
  125. void release(const Event* _event);
  126. class EventQueue
  127. {
  128. public:
  129. ~EventQueue()
  130. {
  131. for (const Event* ev = poll(); NULL != ev; ev = poll() )
  132. {
  133. release(ev);
  134. }
  135. }
  136. void postAxisEvent(WindowHandle _handle, GamepadHandle _gamepad, GamepadAxis::Enum _axis, int32_t _value)
  137. {
  138. AxisEvent* ev = new AxisEvent(_handle);
  139. ev->m_gamepad = _gamepad;
  140. ev->m_axis = _axis;
  141. ev->m_value = _value;
  142. m_queue.push(ev);
  143. }
  144. void postCharEvent(WindowHandle _handle, uint8_t _len, const uint8_t _char[4])
  145. {
  146. CharEvent* ev = new CharEvent(_handle);
  147. ev->m_len = _len;
  148. memcpy(ev->m_char, _char, 4);
  149. m_queue.push(ev);
  150. }
  151. void postExitEvent()
  152. {
  153. Event* ev = new Event(Event::Exit);
  154. m_queue.push(ev);
  155. }
  156. void postGamepadEvent(WindowHandle _handle, GamepadHandle _gamepad, bool _connected)
  157. {
  158. GamepadEvent* ev = new GamepadEvent(_handle);
  159. ev->m_gamepad = _gamepad;
  160. ev->m_connected = _connected;
  161. m_queue.push(ev);
  162. }
  163. void postKeyEvent(WindowHandle _handle, Key::Enum _key, uint8_t _modifiers, bool _down)
  164. {
  165. KeyEvent* ev = new KeyEvent(_handle);
  166. ev->m_key = _key;
  167. ev->m_modifiers = _modifiers;
  168. ev->m_down = _down;
  169. m_queue.push(ev);
  170. }
  171. void postMouseEvent(WindowHandle _handle, int32_t _mx, int32_t _my, int32_t _mz)
  172. {
  173. MouseEvent* ev = new MouseEvent(_handle);
  174. ev->m_mx = _mx;
  175. ev->m_my = _my;
  176. ev->m_mz = _mz;
  177. ev->m_button = MouseButton::None;
  178. ev->m_down = false;
  179. ev->m_move = true;
  180. m_queue.push(ev);
  181. }
  182. void postMouseEvent(WindowHandle _handle, int32_t _mx, int32_t _my, int32_t _mz, MouseButton::Enum _button, bool _down)
  183. {
  184. MouseEvent* ev = new MouseEvent(_handle);
  185. ev->m_mx = _mx;
  186. ev->m_my = _my;
  187. ev->m_mz = _mz;
  188. ev->m_button = _button;
  189. ev->m_down = _down;
  190. ev->m_move = false;
  191. m_queue.push(ev);
  192. }
  193. void postSizeEvent(WindowHandle _handle, uint32_t _width, uint32_t _height)
  194. {
  195. SizeEvent* ev = new SizeEvent(_handle);
  196. ev->m_width = _width;
  197. ev->m_height = _height;
  198. m_queue.push(ev);
  199. }
  200. void postWindowEvent(WindowHandle _handle, void* _nwh = NULL)
  201. {
  202. WindowEvent* ev = new WindowEvent(_handle);
  203. ev->m_nwh = _nwh;
  204. m_queue.push(ev);
  205. }
  206. const Event* poll()
  207. {
  208. return m_queue.pop();
  209. }
  210. const Event* poll(WindowHandle _handle)
  211. {
  212. if (isValid(_handle) )
  213. {
  214. Event* ev = m_queue.peek();
  215. if (NULL == ev
  216. || ev->m_handle.idx != _handle.idx)
  217. {
  218. return NULL;
  219. }
  220. }
  221. return poll();
  222. }
  223. void release(const Event* _event) const
  224. {
  225. delete _event;
  226. }
  227. private:
  228. bx::SpScUnboundedQueue<Event> m_queue;
  229. };
  230. } // namespace entry
  231. #endif // ENTRY_PRIVATE_H_HEADER_GUARD