From 40d38cf3187b6fb05ae3d53ee80ab3a94dc07fe3 Mon Sep 17 00:00:00 2001 From: Frederick Roy Date: Thu, 13 Feb 2025 15:01:32 +0900 Subject: [PATCH] handle (macOS) HiDPI --- SofaImGui/src/SofaImGui/ImGuiGUIEngine.cpp | 24 ++++++++++++++++---- SofaImGui/src/SofaImGui/ImGuiGUIEngine.h | 5 ++++ SofaImGui/src/SofaImGui/windows/Settings.cpp | 18 ++++++++------- SofaImGui/src/SofaImGui/windows/Settings.h | 8 +++++-- 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/SofaImGui/src/SofaImGui/ImGuiGUIEngine.cpp b/SofaImGui/src/SofaImGui/ImGuiGUIEngine.cpp index c00a7941b8..45efaef6f1 100644 --- a/SofaImGui/src/SofaImGui/ImGuiGUIEngine.cpp +++ b/SofaImGui/src/SofaImGui/ImGuiGUIEngine.cpp @@ -160,9 +160,9 @@ void ImGuiGUIEngine::initBackend(GLFWwindow* glfwWindow) } if (monitor) { - float xscale, yscale; + float xscale{}, yscale{}; glfwGetMonitorContentScale(monitor, &xscale, &yscale); - + ImGuiIO& io = ImGui::GetIO(); io.Fonts->AddFontFromMemoryCompressedTTF(ROBOTO_MEDIUM_compressed_data, ROBOTO_MEDIUM_compressed_size, 16 * yscale); @@ -176,7 +176,7 @@ void ImGuiGUIEngine::initBackend(GLFWwindow* glfwWindow) // restore the global scale stored in the Settings ini file const float globalScale = static_cast(ini.GetDoubleValue("Visualization", "globalScale", 1.0)); - io.FontGlobalScale = globalScale; + this->setScale(globalScale, monitor); } } @@ -593,7 +593,7 @@ void ImGuiGUIEngine::startFrame(sofaglfw::SofaGLFWBaseGUI* baseGUI) /*************************************** * Settings window **************************************/ - windows::showSettings(windowNameSettings,ini, winManagerSettings); + windows::showSettings(windowNameSettings,ini, winManagerSettings, this); ImGui::Render(); #if SOFAIMGUI_FORCE_OPENGL2 == 1 @@ -680,4 +680,20 @@ bool ImGuiGUIEngine::dispatchMouseEvents() return !ImGui::GetIO().WantCaptureMouse || isMouseOnViewport; } + +void ImGuiGUIEngine::setScale(double globalScale, GLFWmonitor* monitor) +{ + if(!monitor) + { + monitor = glfwGetPrimaryMonitor(); + } + + ImGuiIO& io = ImGui::GetIO(); + + float xscale{}, yscale{}; + glfwGetMonitorContentScale(monitor, &xscale, &yscale); + + io.FontGlobalScale = globalScale / yscale; +} + } //namespace sofaimgui diff --git a/SofaImGui/src/SofaImGui/ImGuiGUIEngine.h b/SofaImGui/src/SofaImGui/ImGuiGUIEngine.h index 456023b4a1..ad6d95c9f0 100644 --- a/SofaImGui/src/SofaImGui/ImGuiGUIEngine.h +++ b/SofaImGui/src/SofaImGui/ImGuiGUIEngine.h @@ -34,6 +34,8 @@ using windows::WindowState; struct GLFWwindow; +struct GLFWmonitor; + namespace sofa::glfw { class SofaGLFWBaseGUI; @@ -57,6 +59,9 @@ class ImGuiGUIEngine : public sofaglfw::BaseGUIEngine void afterDraw() override; void terminate() override; bool dispatchMouseEvents() override; + + // apply global scale on the given monitor (if null, it will fetch the main monitor) + void setScale(double globalScale, GLFWmonitor* monitor); protected: std::unique_ptr m_fbo; diff --git a/SofaImGui/src/SofaImGui/windows/Settings.cpp b/SofaImGui/src/SofaImGui/windows/Settings.cpp index 989c190726..5a6bb581f3 100644 --- a/SofaImGui/src/SofaImGui/windows/Settings.cpp +++ b/SofaImGui/src/SofaImGui/windows/Settings.cpp @@ -37,7 +37,8 @@ namespace windows void showSettings(const char* const& windowNameSettings, CSimpleIniA &ini, - WindowState& winManagerSettings) + WindowState& winManagerSettings, + sofaimgui::ImGuiGUIEngine* engine) { if (*winManagerSettings.getStatePtr()) { @@ -66,16 +67,17 @@ namespace windows ImGui::EndCombo(); } - float globalScale = static_cast(ini.GetDoubleValue("Visualization", "globalScale", 1.0)); + float iniGlobalScale = static_cast(ini.GetDoubleValue("Visualization", "globalScale", 1.0)); { - ImGuiIO& io = ImGui::GetIO(); - io.FontGlobalScale = globalScale; + float globalScale = iniGlobalScale; constexpr float MIN_SCALE = 0.3f; constexpr float MAX_SCALE = 2.0f; - ImGui::DragFloat("global scale", &io.FontGlobalScale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp); // Scale everything - - ini.SetDoubleValue("Visualization", "globalScale", static_cast(io.FontGlobalScale)); - if (std::abs(globalScale - io.FontGlobalScale) > 0.005f) + ImGui::DragFloat("global scale", &globalScale, 0.005f, MIN_SCALE, MAX_SCALE, "%.2f", ImGuiSliderFlags_AlwaysClamp); // Scale everything + + engine->setScale(globalScale, nullptr); + + ini.SetDoubleValue("Visualization", "globalScale", static_cast(globalScale)); + if (std::abs(iniGlobalScale - globalScale) > 0.005f) { [[maybe_unused]] SI_Error rc = ini.SaveFile(sofaimgui::AppIniFile::getAppIniFile().c_str()); } diff --git a/SofaImGui/src/SofaImGui/windows/Settings.h b/SofaImGui/src/SofaImGui/windows/Settings.h index 8dd8473f3c..5a8e039539 100644 --- a/SofaImGui/src/SofaImGui/windows/Settings.h +++ b/SofaImGui/src/SofaImGui/windows/Settings.h @@ -24,6 +24,10 @@ #include #include "WindowState.h" +namespace sofaimgui +{ + class ImGuiGUIEngine; +} namespace windows { @@ -34,11 +38,11 @@ namespace windows * This function displays settings for configuring the application, such as theme selection, global scale, and viewport settings. * * @param windowNameSettings The name of the Settings window. - * @param isSettingsOpen A reference to a boolean flag indicating if the Settings window is open. * @param ini The INI file object containing application settings. */ void showSettings(const char* const& windowNameSettings, CSimpleIniA &ini, - WindowState& winManagerSettings); + WindowState& winManagerSettings, + sofaimgui::ImGuiGUIEngine* engine); } // namespace sofaimgui