--- a/backends/imgui_impl_glfw.cpp +++ b/backends/imgui_impl_glfw.cpp @@ -422,6 +422,21 @@ void ImGui_ImplGlfw_WindowFocusCallback(GLFWwindow* window, int focused) io.AddFocusEvent(focused != 0); } +static void ImGui_ImplGlfw_ScaleMousePos(GLFWwindow* window, double &x, double &y) { + // Get Window Size + int window_width, window_height; + glfwGetWindowSize(window, &window_width, &window_height); + if (window_width <= 0 || window_height <= 0) { + return; + } + // Get Framebuffer Size + int framebuffer_width, framebuffer_height; + glfwGetFramebufferSize(window, &framebuffer_width, &framebuffer_height); + // Multiply + x *= double(framebuffer_width) / double(window_width); + y *= double(framebuffer_height) / double(window_height); +} + void ImGui_ImplGlfw_CursorPosCallback(GLFWwindow* window, double x, double y) { ImGui_ImplGlfw_Data* bd = ImGui_ImplGlfw_GetBackendData(); @@ -429,6 +444,7 @@ void ImGui_ImplGlfw_CursorPosCallback(GLFWwindow* window, double x, double y) bd->PrevUserCallbackCursorPos(window, x, y); ImGuiIO& io = ImGui::GetIO(); + ImGui_ImplGlfw_ScaleMousePos(window, x, y); io.AddMousePosEvent((float)x, (float)y); bd->LastValidMousePos = ImVec2((float)x, (float)y); } @@ -738,6 +754,7 @@ static void ImGui_ImplGlfw_UpdateMouseData() { double mouse_x, mouse_y; glfwGetCursorPos(window, &mouse_x, &mouse_y); + ImGui_ImplGlfw_ScaleMousePos(window, mouse_x, mouse_y); bd->LastValidMousePos = ImVec2((float)mouse_x, (float)mouse_y); io.AddMousePosEvent((float)mouse_x, (float)mouse_y); } @@ -831,13 +848,9 @@ void ImGui_ImplGlfw_NewFrame() IM_ASSERT(bd != nullptr && "Context or backend not initialized! Did you call ImGui_ImplGlfw_InitForXXX()?"); // Setup display size (every frame to accommodate for window resizing) - int w, h; int display_w, display_h; - glfwGetWindowSize(bd->Window, &w, &h); glfwGetFramebufferSize(bd->Window, &display_w, &display_h); - io.DisplaySize = ImVec2((float)w, (float)h); - if (w > 0 && h > 0) - io.DisplayFramebufferScale = ImVec2((float)display_w / (float)w, (float)display_h / (float)h); + io.DisplaySize = ImVec2((float)display_w, (float)display_h); // Setup time step // (Accept glfwGetTime() not returning a monotonically increasing value. Seems to happens on disconnecting peripherals and probably on VMs and Emscripten, see #6491, #6189, #6114, #3644)