diff --git a/libs/app/include/psemek/app/application_base.hpp b/libs/app/include/psemek/app/application_base.hpp index 637e22a1..a563a08b 100644 --- a/libs/app/include/psemek/app/application_base.hpp +++ b/libs/app/include/psemek/app/application_base.hpp @@ -11,6 +11,8 @@ namespace psemek::app { void on_event(resize_event const &) override; void on_event(focus_event const &) override; + void on_event(show_event const &) override; + void on_event(minimize_event const &) override; void on_event(mouse_move_event const &) override; void on_event(mouse_wheel_event const &) override; void on_event(mouse_button_event const &) override; diff --git a/libs/app/include/psemek/app/event_handler.hpp b/libs/app/include/psemek/app/event_handler.hpp index 913d708a..80c30663 100644 --- a/libs/app/include/psemek/app/event_handler.hpp +++ b/libs/app/include/psemek/app/event_handler.hpp @@ -9,6 +9,8 @@ namespace psemek::app { virtual void on_event(resize_event const &) {} virtual void on_event(focus_event const &) {} + virtual void on_event(show_event const &) {} + virtual void on_event(minimize_event const &) {} virtual void on_event(mouse_move_event const &) {} virtual void on_event(mouse_wheel_event const &) {} virtual void on_event(mouse_button_event const &) {} diff --git a/libs/app/include/psemek/app/event_state.hpp b/libs/app/include/psemek/app/event_state.hpp index 387e9fa2..df323220 100644 --- a/libs/app/include/psemek/app/event_state.hpp +++ b/libs/app/include/psemek/app/event_state.hpp @@ -10,6 +10,8 @@ namespace psemek::app { math::vector size = {0, 0}; bool focus = true; + bool shown = false; + minimize_event minimized = minimize_event::restored; math::point mouse = {0, 0}; int wheel = 0; util::hash_set mouse_button_down; @@ -26,6 +28,16 @@ namespace psemek::app state.focus = event.gained; } + inline void apply(event_state & state, show_event const & event) + { + state.shown = event.shown; + } + + inline void apply(event_state & state, minimize_event const & event) + { + state.minimized = event; + } + inline void apply(event_state & state, mouse_move_event const & event) { state.mouse = event.position; diff --git a/libs/app/include/psemek/app/events.hpp b/libs/app/include/psemek/app/events.hpp index ea0fe495..ea36ca7c 100644 --- a/libs/app/include/psemek/app/events.hpp +++ b/libs/app/include/psemek/app/events.hpp @@ -17,6 +17,18 @@ namespace psemek::app bool gained; }; + struct show_event + { + bool shown; + }; + + enum class minimize_event + { + minimized, + maximized, + restored, + }; + struct mouse_move_event { math::point position; diff --git a/libs/app/include/psemek/app/scene_application.hpp b/libs/app/include/psemek/app/scene_application.hpp index 84f37eed..44cbc945 100644 --- a/libs/app/include/psemek/app/scene_application.hpp +++ b/libs/app/include/psemek/app/scene_application.hpp @@ -11,6 +11,8 @@ namespace psemek::app { void on_event(resize_event const &) override; void on_event(focus_event const &) override; + void on_event(show_event const &) override; + void on_event(minimize_event const &) override; void on_event(mouse_move_event const &) override; void on_event(mouse_wheel_event const &) override; void on_event(mouse_button_event const &) override; diff --git a/libs/app/source/application_base.cpp b/libs/app/source/application_base.cpp index 53b56213..a6500538 100644 --- a/libs/app/source/application_base.cpp +++ b/libs/app/source/application_base.cpp @@ -13,6 +13,16 @@ namespace psemek::app apply(state_, event); } + void application_base::on_event(show_event const & event) + { + apply(state_, event); + } + + void application_base::on_event(minimize_event const & event) + { + apply(state_, event); + } + void application_base::on_event(mouse_move_event const & event) { apply(state_, event); diff --git a/libs/app/source/scene_application.cpp b/libs/app/source/scene_application.cpp index 0936bec2..48e1bd9d 100644 --- a/libs/app/source/scene_application.cpp +++ b/libs/app/source/scene_application.cpp @@ -13,6 +13,16 @@ namespace psemek::app on_event_impl(event); } + void scene_application::on_event(show_event const & event) + { + on_event_impl(event); + } + + void scene_application::on_event(minimize_event const & event) + { + on_event_impl(event); + } + void scene_application::on_event(mouse_move_event const & event) { on_event_impl(event); diff --git a/libs/sdl2/source/events.cpp b/libs/sdl2/source/events.cpp index 4b5fec15..107a2346 100644 --- a/libs/sdl2/source/events.cpp +++ b/libs/sdl2/source/events.cpp @@ -168,6 +168,21 @@ namespace psemek::sdl2 case SDL_WINDOWEVENT_FOCUS_LOST: handler.on_event(app::focus_event{false}); break; + case SDL_WINDOWEVENT_SHOWN: + handler.on_event(app::show_event{true}); + break; + case SDL_WINDOWEVENT_HIDDEN: + handler.on_event(app::show_event{false}); + break; + case SDL_WINDOWEVENT_MINIMIZED: + handler.on_event(app::minimize_event::minimized); + break; + case SDL_WINDOWEVENT_MAXIMIZED: + handler.on_event(app::minimize_event::maximized); + break; + case SDL_WINDOWEVENT_RESTORED: + handler.on_event(app::minimize_event::restored); + break; } break; case SDL_MOUSEMOTION: