diff --git a/source/simple/interactive/event.cpp b/source/simple/interactive/event.cpp index 37a7a58533624419af01996aeb3158f0fca02058..16ba38f6e916b66f79709a2ac55726efd70f1f49 100644 --- a/source/simple/interactive/event.cpp +++ b/source/simple/interactive/event.cpp @@ -14,8 +14,8 @@ namespace simple::interactive case SDL_KEYDOWN: return key_pressed { - event.key.windowID, std::chrono::milliseconds(event.key.timestamp), + event.key.windowID, static_cast<keycode>(event.key.keysym.sym), static_cast<scancode>(event.key.keysym.scancode), static_cast<keystate>(event.key.state), @@ -24,8 +24,8 @@ namespace simple::interactive case SDL_KEYUP: return key_released { - event.key.windowID, std::chrono::milliseconds(event.key.timestamp), + event.key.windowID, static_cast<keycode>(event.key.keysym.sym), static_cast<scancode>(event.key.keysym.scancode), static_cast<keystate>(event.key.state), @@ -34,8 +34,8 @@ namespace simple::interactive case SDL_MOUSEBUTTONDOWN: return mouse_down { - event.button.windowID, std::chrono::milliseconds(event.button.timestamp), + event.button.windowID, event.button.which, {event.button.x, event.button.y}, static_cast<mouse_button>(event.button.button), @@ -45,8 +45,8 @@ namespace simple::interactive case SDL_MOUSEBUTTONUP: return mouse_up { - event.button.windowID, std::chrono::milliseconds(event.button.timestamp), + event.button.windowID, event.button.which, {event.button.x, event.button.y}, static_cast<mouse_button>(event.button.button), @@ -58,8 +58,8 @@ namespace simple::interactive case SDL_MOUSEMOTION: return mouse_motion { - event.motion.windowID, std::chrono::milliseconds(event.motion.timestamp), + event.motion.windowID, event.motion.which, {event.motion.x, event.motion.y}, {event.motion.xrel, event.motion.yrel}, @@ -68,14 +68,17 @@ namespace simple::interactive case SDL_MOUSEWHEEL: return mouse_wheel { - event.wheel.windowID, std::chrono::milliseconds(event.wheel.timestamp), + event.wheel.windowID, event.wheel.which, {event.wheel.x, event.wheel.y}, #if SDL_VERSION_ATLEAST(2,0,4) static_cast<wheel_direction>(event.wheel.direction), #endif }; + + case SDL_QUIT: + return quit_request{}; } } return std::nullopt; @@ -120,7 +123,7 @@ namespace simple::interactive return result; } - std::optional<float2> window_normalized_position(const common_mouse_data& data) noexcept + std::optional<float2> window_normalized_position(const mouse_data& data) noexcept { return window_normalized(data.window_id, data.position); } @@ -155,7 +158,7 @@ namespace simple::interactive return result; } - std::optional<float2> screen_normalized_position(const common_mouse_data& data) noexcept + std::optional<float2> screen_normalized_position(const mouse_data& data) noexcept { return screen_normalized(data.window_id, data.position); } diff --git a/source/simple/interactive/event.h b/source/simple/interactive/event.h index 033388368cc1d586297a4b4606fe3f4a1e17a0cb..977262b160d9114361508ae72f109d51b22bcd7c 100644 --- a/source/simple/interactive/event.h +++ b/source/simple/interactive/event.h @@ -48,13 +48,17 @@ namespace simple::interactive constexpr uint32_t touch_mouse_id = SDL_TOUCH_MOUSEID; - struct common_data + struct event_data { - uint32_t window_id; std::chrono::milliseconds timestamp; }; - struct key_data : public common_data + struct window_event_data : public event_data + { + uint32_t window_id; + }; + + struct key_data : public window_event_data { enum keycode keycode; enum scancode scancode; @@ -62,13 +66,13 @@ namespace simple::interactive uint8_t repeat; }; - struct common_mouse_data : public common_data + struct mouse_data : public window_event_data { uint32_t mouse_id; int2 position; }; - struct mouse_button_data : public common_mouse_data + struct mouse_button_data : public mouse_data { mouse_button button; keystate state; @@ -77,13 +81,13 @@ namespace simple::interactive #endif }; - struct mouse_motion_data : public common_mouse_data + struct mouse_motion_data : public mouse_data { int2 motion; mouse_button_mask button_state; }; - struct mouse_wheel_data : public common_mouse_data + struct mouse_wheel_data : public mouse_data { #if SDL_VERSION_ATLEAST(2,0,4) wheel_direction direction; @@ -101,15 +105,15 @@ namespace simple::interactive struct key_released : key_event {}; - std::optional<float2> window_normalized_position(const common_mouse_data& data) noexcept; - std::optional<float2> screen_normalized_position(const common_mouse_data& data) noexcept; + std::optional<float2> window_normalized_position(const mouse_data& data) noexcept; + std::optional<float2> screen_normalized_position(const mouse_data& data) noexcept; std::optional<float2> window_normalized_motion(const mouse_motion_data& data) noexcept; std::optional<float2> screen_normalized_motion(const mouse_motion_data& data) noexcept; - template<typename event_data> + template<typename Data> struct mouse_position_event { - const event_data data; + const Data data; auto window_normalized_position() const noexcept { return interactive::window_normalized_position(data); } auto screen_normalized_position() const noexcept { return interactive::screen_normalized_position(data); } }; @@ -138,6 +142,11 @@ namespace simple::interactive struct mouse_up : public mouse_button_event {}; + struct quit_request + { + const event_data data; + }; + using event = std::variant< key_pressed ,key_released @@ -145,6 +154,7 @@ namespace simple::interactive ,mouse_up ,mouse_motion ,mouse_wheel + ,quit_request >; std::optional<event> next_event() noexcept;