From b4dac78ef329636e8c97ec9f1d93ed1404532f65 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 | 16 +++++++++++++++ src/Magnum/Platform/GlfwApplication.h | 27 +++++++++++++++++++++++++ src/Magnum/Platform/Sdl2Application.cpp | 12 +++++++++++ src/Magnum/Platform/Sdl2Application.h | 24 ++++++++++++++++++++++ 4 files changed, 79 insertions(+) diff --git a/src/Magnum/Platform/GlfwApplication.cpp b/src/Magnum/Platform/GlfwApplication.cpp index 4182833bd..bbf48fa83 100644 --- a/src/Magnum/Platform/GlfwApplication.cpp +++ b/src/Magnum/Platform/GlfwApplication.cpp @@ -534,6 +534,22 @@ Vector2i GlfwApplication::windowSize() const { return size; } +#if GLFW_VERSION_MAJOR*100 + GLFW_VERSION_MINOR >= 302 +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; +} +#endif + #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..54a289aa8 100644 --- a/src/Magnum/Platform/GlfwApplication.h +++ b/src/Magnum/Platform/GlfwApplication.h @@ -336,6 +336,30 @@ class GlfwApplication { */ Vector2i windowSize() const; + #if GLFW_VERSION_MAJOR*100 + GLFW_VERSION_MINOR >= 302 || defined(DOXYGEN_GENERATING_OUTPUT) + /** + * @brief Set window minimum size + * @param size The minimum size, in screen coordinates + * + * If a value is set to @cpp -1 @ce, it will disable/remove the + * corresponding limit. + * + * @note Supported since GLFW 3.2. + */ + 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 @cpp -1 @ce, it will disable/remove the + * corresponding limit. + * + * @note Supported since GLFW 3.2. + */ + void setMaxWindowSize(const Vector2i& size = {-1, -1}); + #endif + #if defined(MAGNUM_TARGET_GL) || defined(DOXYGEN_GENERATING_OUTPUT) /** * @brief Framebuffer size @@ -552,6 +576,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 08b3b66ea..49c86bedc 100644 --- a/src/Magnum/Platform/Sdl2Application.h +++ b/src/Magnum/Platform/Sdl2Application.h @@ -639,6 +639,30 @@ class Sdl2Application { */ Vector2i windowSize() const; + #if !defined(CORRADE_TARGET_EMSCRIPTEN) || defined(DOXYGEN_GENERATING_OUTPUT) + /** + * @brief Set minimum window size + * @param size The minimum size, in screen coordinates + * + * Note that, unlike in @ref GlfwApplication, SDL2 doesn't have a way + * to disable/remove a size limit. + * + * @note Not available in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". + */ + void setMinWindowSize(const Vector2i& size); + + /** + * @brief Set maximal window size + * @param size The maximum size, in screen coordinates + * + * Note that, unlike in @ref GlfwApplication, SDL2 doesn't have a way + * to disable/remove a size limit. + * + * @note Not available in @ref CORRADE_TARGET_EMSCRIPTEN "Emscripten". + */ + void setMaxWindowSize(const Vector2i& size); + #endif + #if defined(MAGNUM_TARGET_GL) || defined(DOXYGEN_GENERATING_OUTPUT) /** * @brief Framebuffer size