From fcb1a6af1f9de557c4063deb9557423fbed1d7c6 Mon Sep 17 00:00:00 2001 From: Guillaume Jacquemin Date: Mon, 22 Apr 2019 10:51:10 +0200 Subject: [PATCH] Platform: improve {Glfw,Sdl2}Application. Two new methods, setMinWindowSize() and setMaxWindowSize(), were added. They use the underlying library's API to achieve their purpose. --- src/Magnum/Platform/GlfwApplication.cpp | 14 ++++++++++++++ src/Magnum/Platform/GlfwApplication.h | 19 +++++++++++++++++++ src/Magnum/Platform/Sdl2Application.cpp | 12 ++++++++++++ src/Magnum/Platform/Sdl2Application.h | 18 ++++++++++++++++++ 4 files changed, 63 insertions(+) diff --git a/src/Magnum/Platform/GlfwApplication.cpp b/src/Magnum/Platform/GlfwApplication.cpp index 4182833bd..10da11f29 100644 --- a/src/Magnum/Platform/GlfwApplication.cpp +++ b/src/Magnum/Platform/GlfwApplication.cpp @@ -534,6 +534,20 @@ Vector2i GlfwApplication::windowSize() const { return size; } +void GlfwApplication::setMinWindowSize(const Vector2i& size) { + CORRADE_ASSERT(_window, "Platform::GlfwApplication::setMinWindowSize(): no window opened", ); + + glfwSetWindowSizeLimits(_window, size.x(), size.y(), _maxWindowSize.x(), _maxWindowSize.y()); + _minWindowSize = size; +} + +void GlfwApplication::setMaxWindowSize(const Vector2i& size) { + CORRADE_ASSERT(_window, "Platform::GlfwApplication::setMaxWindowSize(): no window opened", ); + + glfwSetWindowSizeLimits(_window, _minWindowSize.x(), _minWindowSize.y(), size.x(), size.y()); + _maxWindowSize = size; +} + #ifdef MAGNUM_TARGET_GL Vector2i GlfwApplication::framebufferSize() const { CORRADE_ASSERT(_window, "Platform::GlfwApplication::framebufferSize(): no window opened", {}); diff --git a/src/Magnum/Platform/GlfwApplication.h b/src/Magnum/Platform/GlfwApplication.h index 11750c1fb..5ca0b579c 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -336,6 +336,22 @@ class GlfwApplication { */ Vector2i windowSize() const; + /** + * @brief Set window minimum size + * @param size The minimum size, in screen coordinates. + * + * If a value is set to -1, it will disable/remove the corresponding limit. + */ + void setMinWindowSize(const Vector2i& size = {-1, -1}); + + /** + * @brief Set window maximum size + * @param size The maximum size, in screen coordinates. + * + * If a value is set to -1, it will disable/remove the corresponding limit. + */ + void setMaxWindowSize(const Vector2i& size = {-1, -1}); + #if defined(MAGNUM_TARGET_GL) || defined(DOXYGEN_GENERATING_OUTPUT) /** * @brief Framebuffer size @@ -552,6 +568,9 @@ class GlfwApplication { Containers::Pointer _context; #endif int _exitCode; + + Vector2i _minWindowSize; + Vector2i _maxWindowSize; }; CORRADE_ENUMSET_OPERATORS(GlfwApplication::Flags) diff --git a/src/Magnum/Platform/Sdl2Application.cpp b/src/Magnum/Platform/Sdl2Application.cpp index d019f1433..fd1a76596 100644 --- a/src/Magnum/Platform/Sdl2Application.cpp +++ b/src/Magnum/Platform/Sdl2Application.cpp @@ -550,6 +550,18 @@ Vector2i Sdl2Application::windowSize() const { return size; } +#ifndef CORRADE_TARGET_EMSCRIPTEN +void Sdl2Application::setMinWindowSize(const Vector2i& size) { + CORRADE_ASSERT(_window, "Platform::Sdl2Application::setMinWindowSize(): no window opened", ); + SDL_SetWindowMinimumSize(_window, size.x(), size.y()); +} + +void Sdl2Application::setMaxWindowSize(const Vector2i& size) { + CORRADE_ASSERT(_window, "Platform::Sdl2Application::setMaxWindowSize(): no window opened", ); + SDL_SetWindowMaximumSize(_window, size.x(), size.y()); +} +#endif + #ifdef MAGNUM_TARGET_GL Vector2i Sdl2Application::framebufferSize() const { Vector2i size; diff --git a/src/Magnum/Platform/Sdl2Application.h b/src/Magnum/Platform/Sdl2Application.h index d771768fc..3cfe94713 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -639,6 +639,24 @@ class Sdl2Application { */ Vector2i windowSize() const; + #if !defined(CORRADE_TARGET_EMSCRIPTEN) || defined(DOXYGEN_GENERATING_OUTPUT) + /** + * @brief Set minimum window size + * @param size The minimum size for the window, in screen coordinates. + * + * Note that SDL2 doesn't have a way to disable/remove a size limit. + */ + void setMinWindowSize(const Vector2i& size); + + /** + * @brief Set maximal window size + * @param size The maximum size for the window, in screen coordinates. + * + * Note that SDL2 doesn't have a way to disable/remove a size limit. + */ + void setMaxWindowSize(const Vector2i& size); + #endif + #if defined(MAGNUM_TARGET_GL) || defined(DOXYGEN_GENERATING_OUTPUT) /** * @brief Framebuffer size