Skip to content

Commit 4b9bc49

Browse files
committed
Viewports, Internals: added GetViewportPlatformMonitor() will a safety net to keep code portable + simplified handling of disconnected monitor in Begin().
1 parent d5a4d53 commit 4b9bc49

File tree

2 files changed

+35
-19
lines changed

2 files changed

+35
-19
lines changed

imgui.cpp

+30-16
Original file line numberDiff line numberDiff line change
@@ -3985,7 +3985,7 @@ void ImGui::NewFrame()
39853985
{
39863986
IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
39873987
ImGuiContext& g = *GImGui;
3988-
3988+
39893989
// Remove pending delete hooks before frame start.
39903990
// This deferred removal avoid issues of removal while iterating the hook vector
39913991
for (int n = g.Hooks.Size - 1; n >= 0; n--)
@@ -6449,19 +6449,11 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
64496449
}
64506450
else if (window->ViewportOwned && g.PlatformIO.Monitors.Size > 0)
64516451
{
6452-
if (window->Viewport->PlatformMonitor == -1)
6453-
{
6454-
// Fallback for "lost" window (e.g. a monitor disconnected): we move the window back over the main viewport
6455-
const ImGuiViewport* main_viewport = GetMainViewport();
6456-
SetWindowPos(window, main_viewport->Pos + style.DisplayWindowPadding, ImGuiCond_Always);
6457-
}
6458-
else
6459-
{
6460-
ImGuiPlatformMonitor& monitor = g.PlatformIO.Monitors[window->Viewport->PlatformMonitor];
6461-
visibility_rect.Min = monitor.WorkPos + visibility_padding;
6462-
visibility_rect.Max = monitor.WorkPos + monitor.WorkSize - visibility_padding;
6463-
ClampWindowRect(window, visibility_rect);
6464-
}
6452+
// Lost windows (e.g. a monitor disconnected) will naturally moved to the fallback/dummy monitor aka the main viewport.
6453+
const ImGuiPlatformMonitor* monitor = GetViewportPlatformMonitor(window->Viewport);
6454+
visibility_rect.Min = monitor->WorkPos + visibility_padding;
6455+
visibility_rect.Max = monitor->WorkPos + monitor->WorkSize - visibility_padding;
6456+
ClampWindowRect(window, visibility_rect);
64656457
}
64666458
}
64676459
window->Pos = ImFloor(window->Pos);
@@ -11534,6 +11526,17 @@ static void ImGui::UpdateViewportsNewFrame()
1153411526
viewport->DpiScale = new_dpi_scale;
1153511527
}
1153611528

11529+
// Update fallback monitor
11530+
if (g.PlatformIO.Monitors.Size == 0)
11531+
{
11532+
ImGuiPlatformMonitor* monitor = &g.FallbackMonitor;
11533+
monitor->MainPos = main_viewport->Pos;
11534+
monitor->MainSize = main_viewport->Size;
11535+
monitor->WorkPos = main_viewport->WorkPos;
11536+
monitor->WorkSize = main_viewport->WorkSize;
11537+
monitor->DpiScale = main_viewport->DpiScale;
11538+
}
11539+
1153711540
if (!viewports_enabled)
1153811541
{
1153911542
g.MouseViewport = main_viewport;
@@ -11747,7 +11750,7 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
1174711750
if (window->Viewport == NULL)
1174811751
if (!UpdateTryMergeWindowIntoHostViewport(window, main_viewport))
1174911752
window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, ImGuiViewportFlags_None);
11750-
11753+
1175111754
// Mark window as allowed to protrude outside of its viewport and into the current monitor
1175211755
if (!lock_viewport)
1175311756
{
@@ -12010,6 +12013,17 @@ static void ImGui::UpdateViewportPlatformMonitor(ImGuiViewportP* viewport)
1201012013
viewport->PlatformMonitor = (short)FindPlatformMonitorForRect(viewport->GetMainRect());
1201112014
}
1201212015

12016+
// Return value is always != NULL, but don't hold on it across frames.
12017+
const ImGuiPlatformMonitor* ImGui::GetViewportPlatformMonitor(ImGuiViewport* viewport_p)
12018+
{
12019+
ImGuiContext& g = *GImGui;
12020+
ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)viewport_p;
12021+
int monitor_idx = viewport->PlatformMonitor;
12022+
if (monitor_idx >= 0 || monitor_idx < g.PlatformIO.Monitors.Size)
12023+
return &g.PlatformIO.Monitors[monitor_idx];
12024+
return &g.FallbackMonitor;
12025+
}
12026+
1201312027
void ImGui::DestroyPlatformWindow(ImGuiViewportP* viewport)
1201412028
{
1201512029
ImGuiContext& g = *GImGui;
@@ -13613,7 +13627,7 @@ bool ImGui::DockNodeBeginAmendTabBar(ImGuiDockNode* node)
1361313627
PushOverrideID(node->ID);
1361413628
bool ret = BeginTabBarEx(node->TabBar, node->TabBar->BarRect, node->TabBar->Flags, node);
1361513629
IM_UNUSED(ret);
13616-
IM_ASSERT(ret);
13630+
IM_ASSERT(ret);
1361713631
return true;
1361813632
}
1361913633

imgui_internal.h

+5-3
Original file line numberDiff line numberDiff line change
@@ -1542,6 +1542,7 @@ struct ImGuiContext
15421542
ImGuiViewportP* MouseViewport;
15431543
ImGuiViewportP* MouseLastHoveredViewport; // Last known viewport that was hovered by mouse (even if we are not hovering any viewport any more) + honoring the _NoInputs flag.
15441544
ImGuiID PlatformLastFocusedViewportId;
1545+
ImGuiPlatformMonitor FallbackMonitor; // Virtual monitor used as fallback if backend doesn't provide monitor information.
15451546
int ViewportFrontMostStampCount; // Every time the front-most window changes, we stamp its viewport with an incrementing counter
15461547

15471548
// Gamepad/keyboard Navigation
@@ -2452,9 +2453,10 @@ namespace ImGui
24522453
IMGUI_API void CallContextHooks(ImGuiContext* context, ImGuiContextHookType type);
24532454

24542455
// Viewports
2455-
IMGUI_API void TranslateWindowsInViewport(ImGuiViewportP* viewport, const ImVec2& old_pos, const ImVec2& new_pos);
2456-
IMGUI_API void ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale);
2457-
IMGUI_API void DestroyPlatformWindow(ImGuiViewportP* viewport);
2456+
IMGUI_API void TranslateWindowsInViewport(ImGuiViewportP* viewport, const ImVec2& old_pos, const ImVec2& new_pos);
2457+
IMGUI_API void ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale);
2458+
IMGUI_API void DestroyPlatformWindow(ImGuiViewportP* viewport);
2459+
const ImGuiPlatformMonitor* GetViewportPlatformMonitor(ImGuiViewport* viewport);
24582460

24592461
// Settings
24602462
IMGUI_API void MarkIniSettingsDirty();

0 commit comments

Comments
 (0)