From 6c865928a890d6968ab3a90a2c8b901e5d3ea1ff Mon Sep 17 00:00:00 2001 From: Christian Heinemann Date: Tue, 18 Jul 2023 08:51:21 +0200 Subject: [PATCH] + scale window sizes according to content scale changes + minor refactor (e.g. make WindowController a singleton) --- source/Base/Resources.h | 2 +- source/Gui/AlienWindow.cpp | 8 +++ source/Gui/AlienWindow.h | 1 + source/Gui/Definitions.h | 3 +- source/Gui/DisplaySettingsDialog.cpp | 28 +++++----- source/Gui/DisplaySettingsDialog.h | 4 +- source/Gui/MainWindow.cpp | 19 +++---- source/Gui/MainWindow.h | 1 - source/Gui/StyleRepository.cpp | 40 ++++++++------- source/Gui/StyleRepository.h | 1 - source/Gui/Viewport.cpp | 4 +- source/Gui/Viewport.h | 2 +- source/Gui/WindowController.cpp | 76 ++++++++++++++++++---------- source/Gui/WindowController.h | 13 +++-- 14 files changed, 120 insertions(+), 82 deletions(-) diff --git a/source/Base/Resources.h b/source/Base/Resources.h index 6b4620f5d..4bf28aafa 100644 --- a/source/Base/Resources.h +++ b/source/Base/Resources.h @@ -2,7 +2,7 @@ namespace Const { - std::string const ProgramVersion = "4.0.0.beta.24"; + std::string const ProgramVersion = "4.0.0.beta.25"; std::string const BasePath = "resources/"; diff --git a/source/Gui/AlienWindow.cpp b/source/Gui/AlienWindow.cpp index 7f7fe1c9e..3e4231fc0 100644 --- a/source/Gui/AlienWindow.cpp +++ b/source/Gui/AlienWindow.cpp @@ -4,6 +4,7 @@ #include "GlobalSettings.h" #include "StyleRepository.h" +#include "WindowController.h" _AlienWindow::_AlienWindow(std::string const& title, std::string const& settingsNode, bool defaultOn) : _title(title) @@ -28,6 +29,13 @@ void _AlienWindow::process() ImGui::SetNextWindowBgAlpha(Const::WindowAlpha * ImGui::GetStyle().Alpha); if (ImGui::Begin(_title.c_str(), &_on)) { + if (!_sizeInitialized) { + auto size = ImGui::GetWindowSize(); + auto& windowController = WindowController::getInstance(); + auto factor = windowController.getContentScaleFactor() / windowController.getLastContentScaleFactor(); + ImGui::SetWindowSize({size.x * factor, size.y * factor}); + _sizeInitialized = true; + } processIntern(); } ImGui::End(); diff --git a/source/Gui/AlienWindow.h b/source/Gui/AlienWindow.h index eb697479a..a5c62cfe5 100644 --- a/source/Gui/AlienWindow.h +++ b/source/Gui/AlienWindow.h @@ -19,6 +19,7 @@ class _AlienWindow virtual void processBackground() {} virtual void processActivated() {} + bool _sizeInitialized = false; bool _on = false; std::string _title; std::string _settingsNode; diff --git a/source/Gui/Definitions.h b/source/Gui/Definitions.h index 339a606fd..9e17e93e6 100644 --- a/source/Gui/Definitions.h +++ b/source/Gui/Definitions.h @@ -92,8 +92,7 @@ using SelectionWindow = std::shared_ptr<_SelectionWindow>; class _PatternEditorWindow; using PatternEditorWindow = std::shared_ptr<_PatternEditorWindow>; -class _WindowController; -using WindowController = std::shared_ptr<_WindowController>; +class WindowController; class _SavePatternDialog; using SavePatternDialog = std::shared_ptr<_SavePatternDialog>; diff --git a/source/Gui/DisplaySettingsDialog.cpp b/source/Gui/DisplaySettingsDialog.cpp index 400e363ad..13301e158 100644 --- a/source/Gui/DisplaySettingsDialog.cpp +++ b/source/Gui/DisplaySettingsDialog.cpp @@ -17,8 +17,7 @@ namespace auto const RightColumnWidth = 185.0f; } -_DisplaySettingsDialog::_DisplaySettingsDialog(WindowController const& windowController) - : _windowController(windowController) +_DisplaySettingsDialog::_DisplaySettingsDialog() { auto primaryMonitor = glfwGetPrimaryMonitor(); _videoModes = glfwGetVideoModes(primaryMonitor, &_videoModesCount); @@ -37,14 +36,14 @@ void _DisplaySettingsDialog::process() ImGui::OpenPopup("Display settings"); if (ImGui::BeginPopupModal("Display settings", NULL, ImGuiWindowFlags_None)) { - auto isFullscreen = !_windowController->isWindowedMode(); + auto isFullscreen = !WindowController::getInstance().isWindowedMode(); if(AlienImGui::ToggleButton(AlienImGui::ToggleButtonParameters().name("Full screen"), isFullscreen)) { if (isFullscreen) { setFullscreen(_selectionIndex); } else { _origSelectionIndex = _selectionIndex; - _windowController->setWindowedMode(); + WindowController::getInstance().setWindowedMode(); } } @@ -62,7 +61,7 @@ void _DisplaySettingsDialog::process() } ImGui::EndDisabled(); - auto fps = _windowController->getFps(); + auto fps = WindowController::getInstance().getFps(); if (AlienImGui::SliderInt( AlienImGui::SliderIntParameters() .name("Frames per second") @@ -72,7 +71,7 @@ void _DisplaySettingsDialog::process() .max(100) .tooltip("A high frame rate leads to a greater GPU workload for rendering and thus lowers the simulation speed (time steps per second)."), &fps)) { - _windowController->setFps(fps); + WindowController::getInstance().setFps(fps); } AlienImGui::Separator(); @@ -87,8 +86,8 @@ void _DisplaySettingsDialog::process() if (AlienImGui::Button("Cancel")) { ImGui::CloseCurrentPopup(); _show = false; - _windowController->setMode(_origMode); - _windowController->setFps(_origFps); + WindowController::getInstance().setMode(_origMode); + WindowController::getInstance().setFps(_origFps); _selectionIndex = _origSelectionIndex; } @@ -101,16 +100,16 @@ void _DisplaySettingsDialog::show() _show = true; _selectionIndex = getSelectionIndex(); _origSelectionIndex = _selectionIndex; - _origMode = _windowController->getMode(); - _origFps = _windowController->getFps(); + _origMode = WindowController::getInstance().getMode(); + _origFps = WindowController::getInstance().getFps(); } void _DisplaySettingsDialog::setFullscreen(int selectionIndex) { if (0 == selectionIndex) { - _windowController->setDesktopMode(); + WindowController::getInstance().setDesktopMode(); } else { - _windowController->setUserDefinedResolution(_videoModes[selectionIndex - 1]); + WindowController::getInstance().setUserDefinedResolution(_videoModes[selectionIndex - 1]); } } @@ -126,8 +125,9 @@ namespace int _DisplaySettingsDialog::getSelectionIndex() const { auto result = 0; - if (!_windowController->isWindowedMode() && !_windowController->isDesktopMode()) { - auto userMode = _windowController->getUserDefinedResolution(); + auto& windowController = WindowController::getInstance(); + if (!windowController.isWindowedMode() && !windowController.isDesktopMode()) { + auto userMode = windowController.getUserDefinedResolution(); for (int i = 0; i < _videoModesCount; ++i) { if (_videoModes[i] == userMode) { return i + 1; diff --git a/source/Gui/DisplaySettingsDialog.h b/source/Gui/DisplaySettingsDialog.h index 87bc6bd20..4444acae4 100644 --- a/source/Gui/DisplaySettingsDialog.h +++ b/source/Gui/DisplaySettingsDialog.h @@ -6,7 +6,7 @@ class _DisplaySettingsDialog { public: - _DisplaySettingsDialog(WindowController const& windowController); + _DisplaySettingsDialog(); ~_DisplaySettingsDialog(); void process(); @@ -17,8 +17,6 @@ class _DisplaySettingsDialog int getSelectionIndex() const; std::vector createVideoModeStrings() const; - WindowController _windowController; - bool _show = false; std::string _origMode; int _origSelectionIndex; diff --git a/source/Gui/MainWindow.cpp b/source/Gui/MainWindow.cpp index a0559fcda..c47de2550 100644 --- a/source/Gui/MainWindow.cpp +++ b/source/Gui/MainWindow.cpp @@ -98,9 +98,9 @@ _MainWindow::_MainWindow(SimulationController const& simController, SimpleLogger auto glfwVersion = initGlfw(); - _windowController = std::make_shared<_WindowController>(); + WindowController::getInstance().init(); - auto windowData = _windowController->getWindowData(); + auto windowData = WindowController::getInstance().getWindowData(); glfwSetFramebufferSizeCallback(windowData.window, framebuffer_size_callback); glfwSwapInterval(1); //enable vsync @@ -123,7 +123,7 @@ _MainWindow::_MainWindow(SimulationController const& simController, SimpleLogger throw std::runtime_error("Failed to initialize GLAD"); } - _viewport = std::make_shared<_Viewport>(_windowController); + _viewport = std::make_shared<_Viewport>(); _uiController = std::make_shared<_UiController>(); _autosaveController = std::make_shared<_AutosaveController>(_simController, _viewport); @@ -148,7 +148,7 @@ _MainWindow::_MainWindow(SimulationController const& simController, SimpleLogger _newSimulationDialog = std::make_shared<_NewSimulationDialog>(_simController, _temporalControlWindow, _viewport, _statisticsWindow); _openSimulationDialog = std::make_shared<_OpenSimulationDialog>(_simController, _temporalControlWindow, _statisticsWindow, _viewport); _saveSimulationDialog = std::make_shared<_SaveSimulationDialog>(_simController, _viewport); - _displaySettingsDialog = std::make_shared<_DisplaySettingsDialog>(_windowController); + _displaySettingsDialog = std::make_shared<_DisplaySettingsDialog>(); _patternAnalysisDialog = std::make_shared<_PatternAnalysisDialog>(_simController); _fpsController = std::make_shared<_FpsController>(); _browserWindow = std::make_shared<_BrowserWindow>(_simController, _networkController, _statisticsWindow, _viewport, _temporalControlWindow); @@ -226,7 +226,7 @@ void _MainWindow::mainLoop() void _MainWindow::shutdown() { - _windowController->shutdown(); + WindowController::getInstance().shutdown(); _autosaveController->shutdown(); ImGui_ImplOpenGL3_Shutdown(); @@ -353,7 +353,7 @@ void _MainWindow::renderSimulation() } ImGui::Render(); - _fpsController->processForceFps(_windowController->getFps()); + _fpsController->processForceFps(WindowController::getInstance().getFps()); ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glfwSwapBuffers(_window); @@ -673,10 +673,11 @@ void _MainWindow::processMenubar() _displaySettingsDialog->show(); } if (ImGui::IsKeyPressed(GLFW_KEY_F7)) { - if (_windowController->isDesktopMode()) { - _windowController->setWindowedMode(); + auto& windowController = WindowController::getInstance(); + if (windowController.isDesktopMode()) { + windowController.setWindowedMode(); } else { - _windowController->setDesktopMode(); + windowController.setDesktopMode(); } } if (io.KeyAlt && ImGui::IsKeyPressed(GLFW_KEY_K)) { diff --git a/source/Gui/MainWindow.h b/source/Gui/MainWindow.h index ef70baafa..60690292a 100644 --- a/source/Gui/MainWindow.h +++ b/source/Gui/MainWindow.h @@ -67,7 +67,6 @@ class _MainWindow ImageToPatternDialog _imageToPatternDialog; ModeController _modeController; - WindowController _windowController; SimulationController _simController; StartupController _startupController; AutosaveController _autosaveController; diff --git a/source/Gui/StyleRepository.cpp b/source/Gui/StyleRepository.cpp index fdc524e27..226450387 100644 --- a/source/Gui/StyleRepository.cpp +++ b/source/Gui/StyleRepository.cpp @@ -8,6 +8,8 @@ #include #include +#include "GlobalSettings.h" +#include "WindowController.h" #include "Base/Resources.h" #include "Fonts/DroidSans.h" @@ -26,14 +28,16 @@ StyleRepository& StyleRepository::getInstance() void StyleRepository::init() { - float temp; - glfwGetMonitorContentScale( - glfwGetPrimaryMonitor(), &_contentScaleFactor, &temp); //consider only horizontal content scale + auto scaleFactor = WindowController::getInstance().getContentScaleFactor(); + + auto& style = ImGui::GetStyle(); + style.ScaleAllSizes(scaleFactor); + ImGuiIO& io = ImGui::GetIO(); //default font (small with icons) - io.Fonts->AddFontFromMemoryCompressedTTF(DroidSans_compressed_data, DroidSans_compressed_size, 16.0f * _contentScaleFactor); + io.Fonts->AddFontFromMemoryCompressedTTF(DroidSans_compressed_data, DroidSans_compressed_size, 16.0f * scaleFactor); ImFontConfig configMerge; configMerge.MergeMode = true; @@ -41,40 +45,38 @@ void StyleRepository::init() static const ImWchar rangesIcons[] = {ICON_MIN_FA, ICON_MAX_FA, 0}; io.Fonts->AddFontFromMemoryCompressedTTF( FontAwesomeSolid_compressed_data, - FontAwesomeSolid_compressed_size, - 16.0f * _contentScaleFactor, + FontAwesomeSolid_compressed_size, 16.0f * scaleFactor, &configMerge, rangesIcons); //small bold font - _smallBoldFont = io.Fonts->AddFontFromMemoryCompressedTTF(DroidSansBold_compressed_data, DroidSansBold_compressed_size, 16.0f * _contentScaleFactor); + _smallBoldFont = io.Fonts->AddFontFromMemoryCompressedTTF(DroidSansBold_compressed_data, DroidSansBold_compressed_size, 16.0f * scaleFactor); //medium bold font - _mediumBoldFont = io.Fonts->AddFontFromMemoryCompressedTTF(DroidSansBold_compressed_data, DroidSansBold_compressed_size, 24.0f * _contentScaleFactor); + _mediumBoldFont = io.Fonts->AddFontFromMemoryCompressedTTF(DroidSansBold_compressed_data, DroidSansBold_compressed_size, 24.0f * scaleFactor); //medium font - _mediumFont = io.Fonts->AddFontFromMemoryCompressedTTF(DroidSans_compressed_data, DroidSans_compressed_size, 24.0f * _contentScaleFactor); + _mediumFont = io.Fonts->AddFontFromMemoryCompressedTTF(DroidSans_compressed_data, DroidSans_compressed_size, 24.0f * scaleFactor); //large font - _largeFont = io.Fonts->AddFontFromMemoryCompressedTTF( - DroidSans_compressed_data, DroidSans_compressed_size, 48.0f * _contentScaleFactor); + _largeFont = io.Fonts->AddFontFromMemoryCompressedTTF(DroidSans_compressed_data, DroidSans_compressed_size, 48.0f * scaleFactor); //icon font - _iconFont = io.Fonts->AddFontFromMemoryCompressedTTF(AlienIconFont_compressed_data, AlienIconFont_compressed_size, 24.0f * _contentScaleFactor); + _iconFont = io.Fonts->AddFontFromMemoryCompressedTTF(AlienIconFont_compressed_data, AlienIconFont_compressed_size, 24.0f * scaleFactor); static const ImWchar rangesIcons2[] = {ICON_MIN_FA, ICON_MAX_FA, 0}; io.Fonts->AddFontFromMemoryCompressedTTF( - FontAwesomeSolid_compressed_data, FontAwesomeSolid_compressed_size, 28.0f * _contentScaleFactor, &configMerge, rangesIcons2); + FontAwesomeSolid_compressed_data, FontAwesomeSolid_compressed_size, 28.0f * scaleFactor, &configMerge, rangesIcons2); io.Fonts->Build(); //monospace medium font - _monospaceMediumFont = io.Fonts->AddFontFromMemoryCompressedTTF(Cousine_Regular_compressed_data, Cousine_Regular_compressed_size, 14.0f * _contentScaleFactor); + _monospaceMediumFont = io.Fonts->AddFontFromMemoryCompressedTTF(Cousine_Regular_compressed_data, Cousine_Regular_compressed_size, 14.0f * scaleFactor); //monospace large font - _monospaceLargeFont = io.Fonts->AddFontFromMemoryCompressedTTF(Cousine_Regular_compressed_data, Cousine_Regular_compressed_size, 128.0f * _contentScaleFactor); + _monospaceLargeFont = io.Fonts->AddFontFromMemoryCompressedTTF(Cousine_Regular_compressed_data, Cousine_Regular_compressed_size, 128.0f * scaleFactor); - _reefMediumFont = io.Fonts->AddFontFromMemoryCompressedTTF(Reef_compressed_data, Reef_compressed_size, 24.0f * _contentScaleFactor); - _reefLargeFont = io.Fonts->AddFontFromMemoryCompressedTTF(Reef_compressed_data, Reef_compressed_size, 64.0f * _contentScaleFactor); + _reefMediumFont = io.Fonts->AddFontFromMemoryCompressedTTF(Reef_compressed_data, Reef_compressed_size, 24.0f * scaleFactor); + _reefLargeFont = io.Fonts->AddFontFromMemoryCompressedTTF(Reef_compressed_data, Reef_compressed_size, 64.0f * scaleFactor); ImPlot::GetStyle().AntiAliasedLines = true; } @@ -126,10 +128,10 @@ ImFont* StyleRepository::getReefLargeFont() const float StyleRepository::scale(float value) const { - return _contentScaleFactor * value; + return WindowController::getInstance().getContentScaleFactor() * value; } float StyleRepository::scaleInverse(float value) const { - return _contentScaleFactor / value; + return WindowController::getInstance().getContentScaleFactor() / value; } diff --git a/source/Gui/StyleRepository.h b/source/Gui/StyleRepository.h index f8f0ad28b..9c691081d 100644 --- a/source/Gui/StyleRepository.h +++ b/source/Gui/StyleRepository.h @@ -92,7 +92,6 @@ class StyleRepository private: StyleRepository() = default; - float _contentScaleFactor = 1.0f; ImFont* _iconFont = nullptr; ImFont* _smallBoldFont = nullptr; ImFont* _mediumBoldFont = nullptr; diff --git a/source/Gui/Viewport.cpp b/source/Gui/Viewport.cpp index 3315f55bb..98e63e5bb 100644 --- a/source/Gui/Viewport.cpp +++ b/source/Gui/Viewport.cpp @@ -4,9 +4,9 @@ #include "WindowController.h" -_Viewport::_Viewport(WindowController const& windowController) +_Viewport::_Viewport() { - _viewSize = windowController->getStartupWindowSize(); + _viewSize = WindowController::getInstance().getStartupWindowSize(); } float _Viewport::getZoomFactor() const diff --git a/source/Gui/Viewport.h b/source/Gui/Viewport.h index 35536582a..4dee8fc3a 100644 --- a/source/Gui/Viewport.h +++ b/source/Gui/Viewport.h @@ -7,7 +7,7 @@ class _Viewport { public: - _Viewport(WindowController const& windowController); + _Viewport(); float getZoomFactor() const; void setZoomFactor(float zoomFactor); diff --git a/source/Gui/WindowController.cpp b/source/Gui/WindowController.cpp index 3b25c518b..3a54a796f 100644 --- a/source/Gui/WindowController.cpp +++ b/source/Gui/WindowController.cpp @@ -44,13 +44,29 @@ namespace } } -_WindowController::_WindowController() +WindowController::WindowController() +{ +} + +WindowController& WindowController::getInstance() +{ + static WindowController instance; + return instance; +} + +WindowController::~WindowController() +{ + delete _desktopVideoMode; +} + +void WindowController::init() { auto& settings = GlobalSettings::getInstance(); _mode = settings.getStringState("settings.display.mode", DesktopMode); _sizeInWindowedMode.x = settings.getIntState("settings.display.window width", _sizeInWindowedMode.x); _sizeInWindowedMode.y = settings.getIntState("settings.display.window height", _sizeInWindowedMode.y); _fps = settings.getIntState("settings.display.fps", _fps); + _lastContentScaleFactor = settings.getFloatState("settings.display.content scale factor", _lastContentScaleFactor); GLFWmonitor* primaryMonitor = glfwGetPrimaryMonitor(); _windowData.mode = glfwGetVideoMode(primaryMonitor); @@ -65,7 +81,7 @@ _WindowController::_WindowController() return glfwCreateWindow(_sizeInWindowedMode.x, _sizeInWindowedMode.y, "alien", nullptr, nullptr); } else { log(Priority::Important, "set full screen mode"); - _startupSize = {_windowData.mode->width, _windowData.mode->height }; + _startupSize = {_windowData.mode->width, _windowData.mode->height}; return glfwCreateWindow(_windowData.mode->width, _windowData.mode->height, "alien", primaryMonitor, nullptr); } }(); @@ -79,75 +95,73 @@ _WindowController::_WindowController() auto userMode = getUserDefinedResolution(); _startupSize = {userMode.width, userMode.height}; log(Priority::Important, "switching to " + createLogString(userMode)); - glfwSetWindowMonitor( - _windowData.window, primaryMonitor, 0, 0, userMode.width, userMode.height, userMode.refreshRate); + glfwSetWindowMonitor(_windowData.window, primaryMonitor, 0, 0, userMode.width, userMode.height, userMode.refreshRate); } -} -_WindowController::~_WindowController() -{ - delete _desktopVideoMode; + float temp; + glfwGetMonitorContentScale(glfwGetPrimaryMonitor(), &_contentScaleFactor, &temp); //consider only horizontal content scale } -void _WindowController::shutdown() +void WindowController::shutdown() { auto& settings = GlobalSettings::getInstance(); settings.setStringState("settings.display.mode", _mode); + settings.setIntState("settings.display.window width", _sizeInWindowedMode.x); + settings.setIntState("settings.display.window height", _sizeInWindowedMode.y); + settings.setIntState("settings.display.fps", _fps); + settings.setFloatState("settings.display.content scale factor", _contentScaleFactor); if (isWindowedMode()) { updateWindowSize(); } - settings.setIntState("settings.display.window width", _sizeInWindowedMode.x); - settings.setIntState("settings.display.window height", _sizeInWindowedMode.y); - settings.setIntState("settings.display.fps", _fps); } -auto _WindowController::getWindowData() const -> WindowData +auto WindowController::getWindowData() const -> WindowData { return _windowData; } -bool _WindowController::isWindowedMode() const +bool WindowController::isWindowedMode() const { return _mode == WindowedMode; } -void _WindowController::setWindowedMode() +void WindowController::setWindowedMode() { setMode(WindowedMode); } -bool _WindowController::isDesktopMode() const +bool WindowController::isDesktopMode() const { return _mode == DesktopMode; } -void _WindowController::setDesktopMode() +void WindowController::setDesktopMode() { setMode(DesktopMode); } -GLFWvidmode _WindowController::getUserDefinedResolution() const +GLFWvidmode WindowController::getUserDefinedResolution() const { return convert(_mode); } -void _WindowController::setUserDefinedResolution(GLFWvidmode const& videoMode) +void WindowController::setUserDefinedResolution(GLFWvidmode const& videoMode) { setMode(convert(videoMode)); } -IntVector2D _WindowController::getStartupWindowSize() const +IntVector2D WindowController::getStartupWindowSize() const { return _startupSize; } -std::string _WindowController::getMode() const +std::string WindowController::getMode() const { return _mode; } -void _WindowController::setMode(std::string const& mode) +void WindowController::setMode(std::string const& mode) { if (getMode() == mode) { return; @@ -189,24 +203,34 @@ void _WindowController::setMode(std::string const& mode) _mode = mode; } -void _WindowController::updateWindowSize() +void WindowController::updateWindowSize() { glfwGetWindowSize(_windowData.window, &_sizeInWindowedMode.x, &_sizeInWindowedMode.y); } -std::string _WindowController::createLogString(GLFWvidmode const& videoMode) const +std::string WindowController::createLogString(GLFWvidmode const& videoMode) const { std::stringstream ss; ss << videoMode.width << " x " << videoMode.height << " @ " << videoMode.refreshRate << "Hz"; return ss.str(); } -int _WindowController::getFps() const +int WindowController::getFps() const { return _fps; } -void _WindowController::setFps(int value) +void WindowController::setFps(int value) { _fps = value; } + +float WindowController::getContentScaleFactor() const +{ + return _contentScaleFactor; +} + +float WindowController::getLastContentScaleFactor() const +{ + return _lastContentScaleFactor; +} diff --git a/source/Gui/WindowController.h b/source/Gui/WindowController.h index ef0ca752f..1beec7031 100644 --- a/source/Gui/WindowController.h +++ b/source/Gui/WindowController.h @@ -4,12 +4,13 @@ #include "Definitions.h" -class _WindowController +class WindowController { public: - _WindowController(); - ~_WindowController(); + static WindowController& getInstance(); + ~WindowController(); + void init(); void shutdown(); struct WindowData @@ -36,7 +37,11 @@ class _WindowController int getFps() const; void setFps(int value); + float getContentScaleFactor() const; + float getLastContentScaleFactor() const; + private: + WindowController(); void updateWindowSize(); std::string createLogString(GLFWvidmode const& videoMode) const; @@ -45,6 +50,8 @@ class _WindowController GLFWvidmode* _desktopVideoMode; IntVector2D _startupSize; IntVector2D _sizeInWindowedMode = {1920 * 3 / 4, 1080 * 3 / 4}; + float _contentScaleFactor = 1.0f; + float _lastContentScaleFactor = 1.0f; int _fps = 40; std::string _mode;