From 6f3a5e896c53eb3bf31c97ddc83062696a3828fc Mon Sep 17 00:00:00 2001 From: WerWolv Date: Fri, 29 Jul 2022 17:37:30 +0200 Subject: [PATCH] sys: Fixed hidpi framebuffer scaling Actually fixes #598 --- lib/libimhex/include/hex/api/imhex_api.hpp | 2 ++ lib/libimhex/source/api/imhex_api.cpp | 9 ++++++++ main/source/init/splash_window.cpp | 23 +++++++++++-------- main/source/window/window.cpp | 4 +++- .../source/content/settings_entries.cpp | 2 +- 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/lib/libimhex/include/hex/api/imhex_api.hpp b/lib/libimhex/include/hex/api/imhex_api.hpp index d2fbdfeb9..4d8ba79fe 100644 --- a/lib/libimhex/include/hex/api/imhex_api.hpp +++ b/lib/libimhex/include/hex/api/imhex_api.hpp @@ -155,6 +155,7 @@ namespace hex { void setMainDockSpaceId(ImGuiID id); void setGlobalScale(float scale); + void setNativeScale(float scale); void setProgramArguments(int argc, char **argv, char **envp); @@ -184,6 +185,7 @@ namespace hex { void setTargetFPS(float fps); float getGlobalScale(); + float getNativeScale(); ImVec2 getMainWindowPosition(); ImVec2 getMainWindowSize(); diff --git a/lib/libimhex/source/api/imhex_api.cpp b/lib/libimhex/source/api/imhex_api.cpp index e1a524490..e76dd5de8 100644 --- a/lib/libimhex/source/api/imhex_api.cpp +++ b/lib/libimhex/source/api/imhex_api.cpp @@ -314,6 +314,11 @@ namespace hex { s_globalScale = scale; } + static float s_nativeScale = 1.0; + void setNativeScale(float scale) { + s_nativeScale = scale; + } + static ProgramArguments s_programArguments; void setProgramArguments(int argc, char **argv, char **envp) { @@ -364,6 +369,10 @@ namespace hex { return impl::s_globalScale; } + float getNativeScale() { + return impl::s_nativeScale; + } + ImVec2 getMainWindowPosition() { return impl::s_mainWindowPos; diff --git a/main/source/init/splash_window.cpp b/main/source/init/splash_window.cpp index af0788eec..9d0a6adeb 100644 --- a/main/source/init/splash_window.cpp +++ b/main/source/init/splash_window.cpp @@ -167,9 +167,16 @@ namespace hex::init { glfwWindowHint(GLFW_DECORATED, GLFW_FALSE); glfwWindowHint(GLFW_FLOATING, GLFW_FALSE); - if (GLFWmonitor *monitor = glfwGetPrimaryMonitor(); monitor != nullptr) { + this->m_window = glfwCreateWindow(1, 400, "Starting ImHex...", nullptr, nullptr); + if (this->m_window == nullptr) { + log::fatal("Failed to create GLFW window!"); + exit(EXIT_FAILURE); + } + + // Calculate native scale factor for hidpi displays + { float xScale = 0, yScale = 0; - glfwGetMonitorContentScale(monitor, &xScale, &yScale); + glfwGetWindowContentScale(this->m_window, &xScale, &yScale); auto meanScale = std::midpoint(xScale, yScale); @@ -185,16 +192,12 @@ namespace hex::init { } ImHexApi::System::impl::setGlobalScale(meanScale); - } else { - ImHexApi::System::impl::setGlobalScale(1.0); - } - - this->m_window = glfwCreateWindow(640_scaled, 400_scaled, "Starting ImHex...", nullptr, nullptr); - if (this->m_window == nullptr) { - log::fatal("Failed to create GLFW window!"); - exit(EXIT_FAILURE); + ImHexApi::System::impl::setNativeScale(meanScale); + + log::info("Native scaling set to: {}", meanScale); } + glfwSetWindowSize(this->m_window, 640_scaled, 400_scaled); centerWindow(this->m_window); glfwMakeContextCurrent(this->m_window); diff --git a/main/source/window/window.cpp b/main/source/window/window.cpp index 180248eb1..476bdc19b 100644 --- a/main/source/window/window.cpp +++ b/main/source/window/window.cpp @@ -697,7 +697,9 @@ namespace hex { io.UserData = new ImGui::ImHexCustomData(); - style.ScaleAllSizes(ImHexApi::System::getGlobalScale()); + auto scale = ImHexApi::System::getGlobalScale(); + style.ScaleAllSizes(scale); + io.DisplayFramebufferScale = ImVec2(scale, scale); { GLsizei width, height; diff --git a/plugins/builtin/source/content/settings_entries.cpp b/plugins/builtin/source/content/settings_entries.cpp index a4f4cb5b6..e9f408a94 100644 --- a/plugins/builtin/source/content/settings_entries.cpp +++ b/plugins/builtin/source/content/settings_entries.cpp @@ -427,7 +427,7 @@ namespace hex::plugin::builtin { switch (ContentRegistry::Settings::read("hex.builtin.setting.interface", "hex.builtin.setting.interface.scaling", 0)) { default: case 0: - // Native scaling + interfaceScaling = ImHexApi::System::getNativeScale(); break; case 1: interfaceScaling = 0.5F;