mirror of
https://github.com/Drezil/imgui.git
synced 2024-11-15 01:17:00 +00:00
Fix monitor dpi info not being copied to main viewport when multi-viewports are not enabled. (#2621, #1676) + Tweaks, short path in FindPlatformMonitorForRect().
This commit is contained in:
parent
b27fd87177
commit
ca43436cd3
25
imgui.cpp
25
imgui.cpp
@ -10558,17 +10558,20 @@ static ImGuiViewportP* FindViewportHoveredFromPlatformWindowStack(const ImVec2 m
|
||||
return best_candidate;
|
||||
}
|
||||
|
||||
// Update viewports and monitor infos
|
||||
// Note that this is runing even if 'ImGuiConfigFlags_ViewportsEnable' is not set, in order to clear unused viewports (if any) and update monitor info.
|
||||
static void ImGui::UpdateViewportsNewFrame()
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
IM_ASSERT(g.PlatformIO.Viewports.Size <= g.Viewports.Size);
|
||||
|
||||
// Update Minimized status (we need it first in order to decide if we'll apply Pos/Size of the main viewport)
|
||||
for (int n = 0; n < g.Viewports.Size; n++)
|
||||
if ((g.ConfigFlagsForFrame & ImGuiConfigFlags_ViewportsEnable))
|
||||
{
|
||||
ImGuiViewportP* viewport = g.Viewports[n];
|
||||
const bool platform_funcs_available = viewport->PlatformWindowCreated;
|
||||
if ((g.ConfigFlagsForFrame & ImGuiConfigFlags_ViewportsEnable))
|
||||
for (int n = 0; n < g.Viewports.Size; n++)
|
||||
{
|
||||
ImGuiViewportP* viewport = g.Viewports[n];
|
||||
const bool platform_funcs_available = viewport->PlatformWindowCreated;
|
||||
if (g.PlatformIO.Platform_GetWindowMinimized && platform_funcs_available)
|
||||
{
|
||||
bool minimized = g.PlatformIO.Platform_GetWindowMinimized(viewport);
|
||||
@ -10577,6 +10580,7 @@ static void ImGui::UpdateViewportsNewFrame()
|
||||
else
|
||||
viewport->Flags &= ~ImGuiViewportFlags_Minimized;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Create/update main viewport with current platform position and size
|
||||
@ -10593,10 +10597,10 @@ static void ImGui::UpdateViewportsNewFrame()
|
||||
g.MouseViewport = NULL;
|
||||
for (int n = 0; n < g.Viewports.Size; n++)
|
||||
{
|
||||
// Erase unused viewports
|
||||
ImGuiViewportP* viewport = g.Viewports[n];
|
||||
viewport->Idx = n;
|
||||
|
||||
// Erase unused viewports
|
||||
if (n > 0 && viewport->LastFrameActive < g.FrameCount - 2)
|
||||
{
|
||||
// Clear references to this viewport in windows (window->ViewportId becomes the master data)
|
||||
@ -10631,10 +10635,11 @@ static void ImGui::UpdateViewportsNewFrame()
|
||||
if (viewport->PlatformRequestResize)
|
||||
viewport->Size = viewport->LastPlatformSize = g.PlatformIO.Platform_GetWindowSize(viewport);
|
||||
}
|
||||
|
||||
UpdateViewportPlatformMonitor(viewport);
|
||||
}
|
||||
|
||||
// Update/copy monitor info
|
||||
UpdateViewportPlatformMonitor(viewport);
|
||||
|
||||
// Reset alpha every frame. Users of transparency (docking) needs to request a lower alpha back.
|
||||
viewport->Alpha = 1.0f;
|
||||
|
||||
@ -11102,11 +11107,15 @@ static int ImGui::FindPlatformMonitorForPos(const ImVec2& pos)
|
||||
|
||||
// Search for the monitor with the largest intersection area with the given rectangle
|
||||
// We generally try to avoid searching loops but the monitor count should be very small here
|
||||
// FIXME-OPT: We could test the last monitor used for that viewport first..
|
||||
// FIXME-OPT: We could test the last monitor used for that viewport first, and early
|
||||
static int ImGui::FindPlatformMonitorForRect(const ImRect& rect)
|
||||
{
|
||||
ImGuiContext& g = *GImGui;
|
||||
|
||||
const int monitor_count = g.PlatformIO.Monitors.Size;
|
||||
if (monitor_count <= 1)
|
||||
return monitor_count - 1;
|
||||
|
||||
// Use a minimum threshold of 1.0f so a zero-sized rect won't false positive, and will still find the correct monitor given its position.
|
||||
// This is necessary for tooltips which always resize down to zero at first.
|
||||
const float surface_threshold = ImMax(rect.GetWidth() * rect.GetHeight() * 0.5f, 1.0f);
|
||||
|
Loading…
Reference in New Issue
Block a user