85 lines
1.9 KiB
C++
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;
|
|
}
|
|
|
|
}
|