psemek/libs/sdl2/source/events.cpp

85 lines
1.9 KiB
C++

#include <psemek/sdl2/events.hpp>
#include <optional>
#include <SDL2/SDL.h>
namespace psemek::sdl2
{
namespace
{
std::optional<app::mouse_button> 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<app::keycode> 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;
}
}