1#include <zen/events/ZEN_Event.h>
5 static ZenEvent TranslateWindowEvent(
const SDL_Event &e) {
7 event.header.category = EventCategory::Application;
10 case SDL_EVENT_WINDOW_CLOSE_REQUESTED:
11 event.header.type = EventType::WindowClose;
14 case SDL_EVENT_WINDOW_RESIZED:
15 event.header.type = EventType::WindowResize;
16 event.windowResize.width = e.window.data1;
17 event.windowResize.height = e.window.data2;
20 case SDL_EVENT_WINDOW_FOCUS_GAINED:
21 event.header.type = EventType::WindowFocus;
24 case SDL_EVENT_WINDOW_FOCUS_LOST:
25 event.header.type = EventType::WindowLostFocus;
28 case SDL_EVENT_WINDOW_MOVED:
29 event.header.type = EventType::WindowMoved;
30 event.windowMoved.x = e.window.data1;
31 event.windowMoved.y = e.window.data2;
35 event.header.type = EventType::None;
42 static ZenEvent TranslateKeyEvent(
const SDL_Event &e) {
44 event.header.category = EventCategory::Input | EventCategory::Keyboard;
46 if (e.type == SDL_EVENT_KEY_DOWN) {
47 event.header.type = EventType::KeyPressed;
48 event.key.repeat = e.key.repeat;
50 event.header.type = EventType::KeyReleased;
53 event.key.scancode = e.key.scancode;
54 event.key.mods = mapSDLMods(e.key.mod);
59 static ZenEvent TranslateMouseEvent(
const SDL_Event &e) {
61 event.header.category = EventCategory::Input | EventCategory::Mouse;
64 case SDL_EVENT_MOUSE_MOTION:
65 event.header.type = EventType::MouseMoved;
66 event.mouseMove.state = mapSDLMouseStates(e.motion.state);
67 event.mouseMove.x = e.motion.x;
68 event.mouseMove.y = e.motion.y;
69 event.mouseMove.dx = e.motion.xrel;
70 event.mouseMove.dy = e.motion.yrel;
73 case SDL_EVENT_MOUSE_BUTTON_DOWN:
74 case SDL_EVENT_MOUSE_BUTTON_UP:
75 event.header.type = (e.type == SDL_EVENT_MOUSE_BUTTON_DOWN)
76 ? EventType::MouseButtonPressed
77 : EventType::MouseButtonReleased;
79 event.mouseButton.button =
static_cast<MouseButton
>(e.button.button);
80 event.mouseButton.clicks = e.button.clicks;
81 event.mouseButton.x = e.button.x;
82 event.mouseButton.y = e.button.y;
85 case SDL_EVENT_MOUSE_WHEEL:
86 event.header.type = EventType::MouseScrolled;
88 event.mouseWheel.x = e.wheel.x;
89 event.mouseWheel.y = e.wheel.y;
90 event.mouseWheel.pos_x = e.wheel.mouse_x;
91 event.mouseWheel.pos_y = e.wheel.mouse_y;
92 event.mouseWheel.scrl_length = e.wheel.integer_x;
93 event.mouseWheel.scrl_height = e.wheel.integer_y;
97 event.header.type = EventType::None;
104 static void *utf8_decode(
void *buf, uint32_t *c,
int *e) {
105 static const char lengths[] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
106 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 3, 3, 4, 0};
107 static const int masks[] = {0x00, 0x7f, 0x1f, 0x0f, 0x07};
108 static const uint32_t mins[] = {4194304, 0, 128, 2048, 65536};
109 static const int shiftc[] = {0, 18, 12, 6, 0};
110 static const int shifte[] = {0, 6, 4, 2, 0};
112 unsigned char *s =
static_cast<unsigned char *
>(buf);
114 int len =
static_cast<unsigned char>(lengths[s[0] >> 3]);
120 unsigned char *next = s + len + !len;
125 *c = (uint32_t)(s[0] & masks[len]) << 18;
126 *c |= (uint32_t)(s[1] & 0x3f) << 12;
127 *c |= (uint32_t)(s[2] & 0x3f) << 6;
128 *c |= (uint32_t)(s[3] & 0x3f) << 0;
132 *e = (*c < mins[len]) << 6;
133 *e |= ((*c >> 11) == 0x1b) << 7;
134 *e |= (*c > 0x10FFFF) << 8;
135 *e |= (s[1] & 0xc0) >> 2;
136 *e |= (s[2] & 0xc0) >> 4;
144 static ZenEvent TranslateTextInputEvent(
const SDL_Event &e) {
146 event.header.category = EventCategory::Input | EventCategory::Text;
147 event.header.type = EventType::TextInput;
152 utf8_decode((
void *)e.text.text, &codepoint, &error);
153 event.textInput.codepoint = (error ? U
'\uFFFD' :
static_cast<char32_t>(codepoint));
157 static ZenEvent TranslateApplicationEvent(
const SDL_Event &e) {
159 event.header.category = EventCategory::Application;
160 event.header.type = EventType::Quit;
165 ZenEvent TranslateEvent(
const SDL_Event &e) {
168 return TranslateApplicationEvent(e);
169 case SDL_EVENT_WINDOW_CLOSE_REQUESTED:
170 case SDL_EVENT_WINDOW_RESIZED:
171 case SDL_EVENT_WINDOW_FOCUS_GAINED:
172 case SDL_EVENT_WINDOW_FOCUS_LOST:
173 case SDL_EVENT_WINDOW_MOVED:
174 return TranslateWindowEvent(e);
175 case SDL_EVENT_KEY_DOWN:
176 case SDL_EVENT_KEY_UP:
177 return TranslateKeyEvent(e);
178 case SDL_EVENT_MOUSE_BUTTON_DOWN:
179 case SDL_EVENT_MOUSE_BUTTON_UP:
180 case SDL_EVENT_MOUSE_MOTION:
181 case SDL_EVENT_MOUSE_WHEEL:
182 return TranslateMouseEvent(e);
183 case SDL_EVENT_TEXT_INPUT:
184 return TranslateTextInputEvent(e);
188 event.header.type = EventType::None;
189 event.header.category = EventCategory::None;