#include #include #include namespace psemek::sdl2 { namespace { std::optional mouse_button(Uint8 button) { switch (button) { case SDL_BUTTON_LEFT: return app::mouse_button::left; case SDL_BUTTON_MIDDLE: return app::mouse_button::middle; case SDL_BUTTON_RIGHT: return app::mouse_button::right; default: return std::nullopt; } } std::optional keycode(SDL_Keysym) { return std::nullopt; } } bool poll_events(app::event_handler & handler) { for (SDL_Event e; SDL_PollEvent(&e);) switch (e.type) { case SDL_QUIT: return true; case SDL_WINDOWEVENT: switch (e.window.event) { case SDL_WINDOWEVENT_CLOSE: return true; case SDL_WINDOWEVENT_RESIZED: handler.on_event(app::resize_event{{e.window.data1, e.window.data2}}); break; case SDL_WINDOWEVENT_SIZE_CHANGED: handler.on_event(app::resize_event{{e.window.data1, e.window.data2}}); break; case SDL_WINDOWEVENT_FOCUS_GAINED: handler.on_event(app::focus_event{true}); break; case SDL_WINDOWEVENT_FOCUS_LOST: handler.on_event(app::focus_event{false}); break; } break; case SDL_MOUSEMOTION: handler.on_event(app::mouse_move_event{{e.motion.x, e.motion.y}}); break; case SDL_MOUSEWHEEL: handler.on_event(app::mouse_wheel_event{e.wheel.y}); break; case SDL_MOUSEBUTTONDOWN: if (auto button = mouse_button(e.button.button)) handler.on_event(app::mouse_button_event{*button, true}); break; case SDL_MOUSEBUTTONUP: if (auto button = mouse_button(e.button.button)) handler.on_event(app::mouse_button_event{*button, false}); break; case SDL_KEYDOWN: if (auto key = keycode(e.key.keysym)) handler.on_event(app::key_event{*key, true}); break; case SDL_KEYUP: if (auto key = keycode(e.key.keysym)) handler.on_event(app::key_event{*key, false}); break; } return false; } }