add resizable window flag and resize window events

This commit is contained in:
2019-10-22 02:19:43 +07:00
parent 0ac38ec3e5
commit 536bdd7a9c
6 changed files with 56 additions and 11 deletions

View File

@@ -83,16 +83,19 @@ namespace e2d
window_parameters& caption(str_view value); window_parameters& caption(str_view value);
window_parameters& size(const v2u& value) noexcept; window_parameters& size(const v2u& value) noexcept;
window_parameters& vsync(bool value) noexcept; window_parameters& vsync(bool value) noexcept;
window_parameters& resizable(bool value) noexcept;
window_parameters& fullscreen(bool value) noexcept; window_parameters& fullscreen(bool value) noexcept;
const str& caption() const noexcept; const str& caption() const noexcept;
const v2u& size() const noexcept; const v2u& size() const noexcept;
bool vsync() const noexcept; bool vsync() const noexcept;
bool resizable() const noexcept;
bool fullscreen() const noexcept; bool fullscreen() const noexcept;
private: private:
str caption_{"Enduro2D"}; str caption_{"Enduro2D"};
v2u size_{640, 480}; v2u size_{640, 480};
bool vsync_{false}; bool vsync_{false};
bool resizable_{false};
bool fullscreen_{false}; bool fullscreen_{false};
}; };

View File

@@ -27,13 +27,15 @@ namespace e2d
virtual void on_mouse_scroll(const v2f& delta) noexcept; virtual void on_mouse_scroll(const v2f& delta) noexcept;
virtual void on_mouse_button(mouse_button btn, mouse_button_action act) noexcept; virtual void on_mouse_button(mouse_button btn, mouse_button_action act) noexcept;
virtual void on_keyboard_key(keyboard_key key, u32 scancode, keyboard_key_action act) noexcept; virtual void on_keyboard_key(keyboard_key key, u32 scancode, keyboard_key_action act) noexcept;
virtual void on_window_size(const v2u& size) noexcept;
virtual void on_framebuffer_size(const v2u& size) noexcept;
virtual void on_window_close() noexcept; virtual void on_window_close() noexcept;
virtual void on_window_focus(bool focused) noexcept; virtual void on_window_focus(bool focused) noexcept;
virtual void on_window_minimize(bool minimized) noexcept; virtual void on_window_minimize(bool minimized) noexcept;
}; };
using event_listener_uptr = std::unique_ptr<event_listener>; using event_listener_uptr = std::unique_ptr<event_listener>;
public: public:
window(const v2u& size, str_view title, bool vsync, bool fullscreen); window(const v2u& size, str_view title, bool vsync, bool resizable, bool fullscreen);
~window() noexcept final; ~window() noexcept final;
void hide() noexcept; void hide() noexcept;
@@ -84,6 +86,8 @@ namespace e2d
void on_mouse_scroll(const v2f& delta) noexcept final; void on_mouse_scroll(const v2f& delta) noexcept final;
void on_mouse_button(mouse_button btn, mouse_button_action act) noexcept final; void on_mouse_button(mouse_button btn, mouse_button_action act) noexcept final;
void on_keyboard_key(keyboard_key key, u32 scancode, keyboard_key_action act) noexcept final; void on_keyboard_key(keyboard_key key, u32 scancode, keyboard_key_action act) noexcept final;
void on_window_size(const v2u& size) noexcept final;
void on_framebuffer_size(const v2u& size) noexcept final;
void on_window_close() noexcept final; void on_window_close() noexcept final;
void on_window_focus(bool focused) noexcept final; void on_window_focus(bool focused) noexcept final;
void on_window_minimize(bool minimized) noexcept final; void on_window_minimize(bool minimized) noexcept final;

View File

@@ -132,6 +132,11 @@ namespace e2d
return *this; return *this;
} }
engine::window_parameters& engine::window_parameters::resizable(bool value) noexcept {
resizable_ = value;
return *this;
}
engine::window_parameters& engine::window_parameters::fullscreen(bool value) noexcept { engine::window_parameters& engine::window_parameters::fullscreen(bool value) noexcept {
fullscreen_ = value; fullscreen_ = value;
return *this; return *this;
@@ -149,6 +154,10 @@ namespace e2d
return vsync_; return vsync_;
} }
bool engine::window_parameters::resizable() const noexcept {
return resizable_;
}
bool engine::window_parameters::fullscreen() const noexcept { bool engine::window_parameters::fullscreen() const noexcept {
return fullscreen_; return fullscreen_;
} }
@@ -435,6 +444,7 @@ namespace e2d
params.window_params().size(), params.window_params().size(),
params.window_params().caption(), params.window_params().caption(),
params.window_params().vsync(), params.window_params().vsync(),
params.window_params().resizable(),
params.window_params().fullscreen()); params.window_params().fullscreen());
the<window>().register_event_listener<window_input_source>(the<input>()); the<window>().register_event_listener<window_input_source>(the<input>());

View File

@@ -34,6 +34,14 @@ namespace e2d
E2D_UNUSED(key, scancode, act); E2D_UNUSED(key, scancode, act);
} }
void window::event_listener::on_window_size(const v2u& size) noexcept {
E2D_UNUSED(size);
}
void window::event_listener::on_framebuffer_size(const v2u& size) noexcept {
E2D_UNUSED(size);
}
void window::event_listener::on_window_close() noexcept { void window::event_listener::on_window_close() noexcept {
} }
@@ -77,6 +85,14 @@ namespace e2d
keyboard_key_action_to_cstr(act)); keyboard_key_action_to_cstr(act));
} }
void window_trace_event_listener::on_window_size(const v2u& size) noexcept {
debug_.trace("WINDOW: on_window_size(size: %0)", size);
}
void window_trace_event_listener::on_framebuffer_size(const v2u& size) noexcept {
debug_.trace("WINDOW: on_framebuffer_size(size: %0)", size);
}
void window_trace_event_listener::on_window_close() noexcept { void window_trace_event_listener::on_window_close() noexcept {
debug_.trace("WINDOW: on_window_close()"); debug_.trace("WINDOW: on_window_close()");
} }

View File

@@ -260,10 +260,11 @@ namespace e2d
v2u framebuffer_size; v2u framebuffer_size;
str title; str title;
bool vsync = false; bool vsync = false;
bool resizable = false;
bool fullscreen = false; bool fullscreen = false;
bool cursor_hidden = false; bool cursor_hidden = false;
public: public:
state(const v2u& size, str_view ntitle, bool nvsync, bool nfullscreen) state(const v2u& size, str_view ntitle, bool nvsync, bool nresizable, bool nfullscreen)
: shared_state(glfw_state::get_shared_state()) : shared_state(glfw_state::get_shared_state())
, window(nullptr, glfwDestroyWindow) , window(nullptr, glfwDestroyWindow)
, real_size(size) , real_size(size)
@@ -271,12 +272,14 @@ namespace e2d
, framebuffer_size(size) , framebuffer_size(size)
, title(ntitle) , title(ntitle)
, vsync(nvsync) , vsync(nvsync)
, resizable(nresizable)
, fullscreen(nfullscreen) , fullscreen(nfullscreen)
{ {
window = open_window_( window = open_window_(
size, size,
make_utf8(ntitle), make_utf8(ntitle),
vsync, vsync,
resizable,
fullscreen); fullscreen);
if ( !window ) { if ( !window ) {
@@ -295,7 +298,7 @@ namespace e2d
glfwSetKeyCallback(window.get(), keyboard_key_callback_); glfwSetKeyCallback(window.get(), keyboard_key_callback_);
glfwSetWindowSizeCallback(window.get(), window_size_callback_); glfwSetWindowSizeCallback(window.get(), window_size_callback_);
glfwSetFramebufferSizeCallback(window.get(), window_framebuffer_callback_); glfwSetFramebufferSizeCallback(window.get(), framebuffer_size_callback_);
glfwSetWindowCloseCallback(window.get(), window_close_callback_); glfwSetWindowCloseCallback(window.get(), window_close_callback_);
glfwSetWindowFocusCallback(window.get(), window_focus_callback_); glfwSetWindowFocusCallback(window.get(), window_focus_callback_);
@@ -345,6 +348,7 @@ namespace e2d
const v2u& virtual_size, const v2u& virtual_size,
const str& title, const str& title,
bool vsync, bool vsync,
bool resizable,
bool fullscreen) noexcept bool fullscreen) noexcept
{ {
GLFWmonitor* monitor = glfwGetPrimaryMonitor(); GLFWmonitor* monitor = glfwGetPrimaryMonitor();
@@ -355,11 +359,11 @@ namespace e2d
if ( !video_mode ) { if ( !video_mode ) {
return {nullptr, glfwDestroyWindow}; return {nullptr, glfwDestroyWindow};
} }
glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
glfwWindowHint(GLFW_RESIZABLE, resizable ? GLFW_TRUE : GLFW_FALSE);
#if defined(E2D_BUILD_MODE) && E2D_BUILD_MODE == E2D_BUILD_MODE_DEBUG #if defined(E2D_BUILD_MODE) && E2D_BUILD_MODE == E2D_BUILD_MODE_DEBUG
glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_DEBUG_CONTEXT, GLFW_TRUE);
#endif #endif
v2i real_size = fullscreen v2i real_size = fullscreen
? make_vec2(video_mode->width, video_mode->height) ? make_vec2(video_mode->width, video_mode->height)
@@ -432,14 +436,20 @@ namespace e2d
state* self = static_cast<state*>(glfwGetWindowUserPointer(window)); state* self = static_cast<state*>(glfwGetWindowUserPointer(window));
if ( self ) { if ( self ) {
self->update_window_size(); self->update_window_size();
self->for_all_listeners(
&event_listener::on_window_size,
make_vec2(w,h).cast_to<u32>());
} }
} }
static void window_framebuffer_callback_(GLFWwindow* window, int w, int h) noexcept { static void framebuffer_size_callback_(GLFWwindow* window, int w, int h) noexcept {
E2D_UNUSED(w, h); E2D_UNUSED(w, h);
state* self = static_cast<state*>(glfwGetWindowUserPointer(window)); state* self = static_cast<state*>(glfwGetWindowUserPointer(window));
if ( self ) { if ( self ) {
self->update_framebuffer_size(); self->update_framebuffer_size();
self->for_all_listeners(
&event_listener::on_framebuffer_size,
make_vec2(w,h).cast_to<u32>());
} }
} }
@@ -474,8 +484,8 @@ namespace e2d
// class window // class window
// //
window::window(const v2u& size, str_view title, bool vsync, bool fullscreen) window::window(const v2u& size, str_view title, bool vsync, bool resizable, bool fullscreen)
: state_(new state(size, title, vsync, fullscreen)) {} : state_(new state(size, title, vsync, resizable, fullscreen)) {}
window::~window() noexcept = default; window::~window() noexcept = default;
void window::hide() noexcept { void window::hide() noexcept {

View File

@@ -19,6 +19,7 @@ namespace e2d
v2u virtual_size; v2u virtual_size;
str title; str title;
bool vsync = false; bool vsync = false;
bool resizable = false;
bool fullscreen = false; bool fullscreen = false;
bool cursor_hidden = false; bool cursor_hidden = false;
bool should_close = false; bool should_close = false;
@@ -27,10 +28,11 @@ namespace e2d
bool focused = true; bool focused = true;
bool minimized = false; bool minimized = false;
public: public:
state(const v2u& size, str_view title, bool vsync, bool fullscreen) state(const v2u& size, str_view title, bool vsync, bool resizable, bool fullscreen)
: virtual_size(size) : virtual_size(size)
, title(make_utf8(title)) , title(make_utf8(title))
, vsync(vsync) , vsync(vsync)
, resizable(resizable)
, fullscreen(fullscreen) {} , fullscreen(fullscreen) {}
~state() noexcept = default; ~state() noexcept = default;
@@ -45,8 +47,8 @@ namespace e2d
} }
}; };
window::window(const v2u& size, str_view title, bool vsync, bool fullscreen) window::window(const v2u& size, str_view title, bool vsync, bool resizable, bool fullscreen)
: state_(new state(size, title, vsync, fullscreen)) {} : state_(new state(size, title, vsync, resizable, fullscreen)) {}
window::~window() noexcept = default; window::~window() noexcept = default;
void window::hide() noexcept { void window::hide() noexcept {