entry_p.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*
  2. * Copyright 2011-2014 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. #if !defined(ENTRY_DEFAULT_WIDTH) && !defined(ENTRY_DEFAULT_HEIGHT)
  23. # define ENTRY_DEFAULT_WIDTH 1280
  24. # define ENTRY_DEFAULT_HEIGHT 720
  25. #elif !defined(ENTRY_DEFAULT_WIDTH) || !defined(ENTRY_DEFAULT_HEIGHT)
  26. # error "Both ENTRY_DEFAULT_WIDTH and ENTRY_DEFAULT_HEIGHT must be defined."
  27. #endif // ENTRY_DEFAULT_WIDTH
  28. #define ENTRY_IMPLEMENT_EVENT(_class, _type) \
  29. _class(WindowHandle _handle) : Event(_type, _handle) {}
  30. namespace entry
  31. {
  32. int main(int _argc, char** _argv);
  33. struct Event
  34. {
  35. enum Enum
  36. {
  37. Exit,
  38. Key,
  39. Char,
  40. Mouse,
  41. Size,
  42. Window,
  43. };
  44. Event(Enum _type)
  45. : m_type(_type)
  46. {
  47. m_handle.idx = UINT16_MAX;
  48. }
  49. Event(Enum _type, WindowHandle _handle)
  50. : m_type(_type)
  51. , m_handle(_handle)
  52. {
  53. }
  54. Event::Enum m_type;
  55. WindowHandle m_handle;
  56. };
  57. struct KeyEvent : public Event
  58. {
  59. ENTRY_IMPLEMENT_EVENT(KeyEvent, Event::Key);
  60. Key::Enum m_key;
  61. uint8_t m_modifiers;
  62. bool m_down;
  63. };
  64. struct CharEvent : public Event
  65. {
  66. ENTRY_IMPLEMENT_EVENT(CharEvent, Event::Char);
  67. uint8_t m_len;
  68. uint8_t m_char[4];
  69. };
  70. struct MouseEvent : public Event
  71. {
  72. ENTRY_IMPLEMENT_EVENT(MouseEvent, Event::Mouse);
  73. int32_t m_mx;
  74. int32_t m_my;
  75. int32_t m_mz;
  76. MouseButton::Enum m_button;
  77. bool m_down;
  78. bool m_move;
  79. };
  80. struct SizeEvent : public Event
  81. {
  82. ENTRY_IMPLEMENT_EVENT(SizeEvent, Event::Size);
  83. uint32_t m_width;
  84. uint32_t m_height;
  85. };
  86. struct WindowEvent : public Event
  87. {
  88. ENTRY_IMPLEMENT_EVENT(WindowEvent, Event::Window);
  89. void* m_nwh;
  90. };
  91. const Event* poll();
  92. const Event* poll(WindowHandle _handle);
  93. void release(const Event* _event);
  94. class EventQueue
  95. {
  96. public:
  97. void postExitEvent()
  98. {
  99. Event* ev = new Event(Event::Exit);
  100. m_queue.push(ev);
  101. }
  102. void postKeyEvent(WindowHandle _handle, Key::Enum _key, uint8_t _modifiers, bool _down)
  103. {
  104. KeyEvent* ev = new KeyEvent(_handle);
  105. ev->m_key = _key;
  106. ev->m_modifiers = _modifiers;
  107. ev->m_down = _down;
  108. m_queue.push(ev);
  109. }
  110. void postCharEvent(WindowHandle _handle, uint8_t _len, const uint8_t _char[4])
  111. {
  112. CharEvent* ev = new CharEvent(_handle);
  113. ev->m_len = _len;
  114. memcpy(ev->m_char, _char, 4);
  115. m_queue.push(ev);
  116. }
  117. void postMouseEvent(WindowHandle _handle, int32_t _mx, int32_t _my, int32_t _mz)
  118. {
  119. MouseEvent* ev = new MouseEvent(_handle);
  120. ev->m_mx = _mx;
  121. ev->m_my = _my;
  122. ev->m_mz = _mz;
  123. ev->m_button = MouseButton::None;
  124. ev->m_down = false;
  125. ev->m_move = true;
  126. m_queue.push(ev);
  127. }
  128. void postMouseEvent(WindowHandle _handle, int32_t _mx, int32_t _my, int32_t _mz, MouseButton::Enum _button, bool _down)
  129. {
  130. MouseEvent* ev = new MouseEvent(_handle);
  131. ev->m_mx = _mx;
  132. ev->m_my = _my;
  133. ev->m_mz = _mz;
  134. ev->m_button = _button;
  135. ev->m_down = _down;
  136. ev->m_move = false;
  137. m_queue.push(ev);
  138. }
  139. void postSizeEvent(WindowHandle _handle, uint32_t _width, uint32_t _height)
  140. {
  141. SizeEvent* ev = new SizeEvent(_handle);
  142. ev->m_width = _width;
  143. ev->m_height = _height;
  144. m_queue.push(ev);
  145. }
  146. void postWindowEvent(WindowHandle _handle, void* _nwh = NULL)
  147. {
  148. WindowEvent* ev = new WindowEvent(_handle);
  149. ev->m_nwh = _nwh;
  150. m_queue.push(ev);
  151. }
  152. const Event* poll()
  153. {
  154. return m_queue.pop();
  155. }
  156. const Event* poll(WindowHandle _handle)
  157. {
  158. if (isValid(_handle) )
  159. {
  160. Event* ev = m_queue.peek();
  161. if (NULL == ev
  162. || ev->m_handle.idx != _handle.idx)
  163. {
  164. return NULL;
  165. }
  166. }
  167. return poll();
  168. }
  169. void release(const Event* _event) const
  170. {
  171. delete _event;
  172. }
  173. private:
  174. bx::SpScUnboundedQueue<Event> m_queue;
  175. };
  176. } // namespace entry
  177. #endif // ENTRY_PRIVATE_H_HEADER_GUARD