entry_p.h 5.5 KB

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