mirror of
				https://github.com/ocornut/imgui.git
				synced 2025-11-04 09:44:29 +00:00 
			
		
		
		
	Viewports, Internals: added GetViewportPlatformMonitor() will a safety net to keep code portable + simplified handling of disconnected monitor in Begin().
This commit is contained in:
		
							
								
								
									
										46
									
								
								imgui.cpp
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								imgui.cpp
									
									
									
									
									
								
							@@ -3985,7 +3985,7 @@ void ImGui::NewFrame()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
 | 
					    IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
 | 
				
			||||||
    ImGuiContext& g = *GImGui;
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    // Remove pending delete hooks before frame start.
 | 
					    // Remove pending delete hooks before frame start.
 | 
				
			||||||
    // This deferred removal avoid issues of removal while iterating the hook vector
 | 
					    // This deferred removal avoid issues of removal while iterating the hook vector
 | 
				
			||||||
    for (int n = g.Hooks.Size - 1; n >= 0; n--)
 | 
					    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)
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            else if (window->ViewportOwned && g.PlatformIO.Monitors.Size > 0)
 | 
					            else if (window->ViewportOwned && g.PlatformIO.Monitors.Size > 0)
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                if (window->Viewport->PlatformMonitor == -1)
 | 
					                // Lost windows (e.g. a monitor disconnected) will naturally moved to the fallback/dummy monitor aka the main viewport.
 | 
				
			||||||
                {
 | 
					                const ImGuiPlatformMonitor* monitor = GetViewportPlatformMonitor(window->Viewport);
 | 
				
			||||||
                    // Fallback for "lost" window (e.g. a monitor disconnected): we move the window back over the main viewport
 | 
					                visibility_rect.Min = monitor->WorkPos + visibility_padding;
 | 
				
			||||||
                    const ImGuiViewport* main_viewport = GetMainViewport();
 | 
					                visibility_rect.Max = monitor->WorkPos + monitor->WorkSize - visibility_padding;
 | 
				
			||||||
                    SetWindowPos(window, main_viewport->Pos + style.DisplayWindowPadding, ImGuiCond_Always);
 | 
					                ClampWindowRect(window, visibility_rect);
 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                else
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    ImGuiPlatformMonitor& monitor = g.PlatformIO.Monitors[window->Viewport->PlatformMonitor];
 | 
					 | 
				
			||||||
                    visibility_rect.Min = monitor.WorkPos + visibility_padding;
 | 
					 | 
				
			||||||
                    visibility_rect.Max = monitor.WorkPos + monitor.WorkSize - visibility_padding;
 | 
					 | 
				
			||||||
                    ClampWindowRect(window, visibility_rect);
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        window->Pos = ImFloor(window->Pos);
 | 
					        window->Pos = ImFloor(window->Pos);
 | 
				
			||||||
@@ -11534,6 +11526,17 @@ static void ImGui::UpdateViewportsNewFrame()
 | 
				
			|||||||
        viewport->DpiScale = new_dpi_scale;
 | 
					        viewport->DpiScale = new_dpi_scale;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Update fallback monitor
 | 
				
			||||||
 | 
					    if (g.PlatformIO.Monitors.Size == 0)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        ImGuiPlatformMonitor* monitor = &g.FallbackMonitor;
 | 
				
			||||||
 | 
					        monitor->MainPos = main_viewport->Pos;
 | 
				
			||||||
 | 
					        monitor->MainSize = main_viewport->Size;
 | 
				
			||||||
 | 
					        monitor->WorkPos = main_viewport->WorkPos;
 | 
				
			||||||
 | 
					        monitor->WorkSize = main_viewport->WorkSize;
 | 
				
			||||||
 | 
					        monitor->DpiScale = main_viewport->DpiScale;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (!viewports_enabled)
 | 
					    if (!viewports_enabled)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        g.MouseViewport = main_viewport;
 | 
					        g.MouseViewport = main_viewport;
 | 
				
			||||||
@@ -11747,7 +11750,7 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
 | 
				
			|||||||
    if (window->Viewport == NULL)
 | 
					    if (window->Viewport == NULL)
 | 
				
			||||||
        if (!UpdateTryMergeWindowIntoHostViewport(window, main_viewport))
 | 
					        if (!UpdateTryMergeWindowIntoHostViewport(window, main_viewport))
 | 
				
			||||||
            window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, ImGuiViewportFlags_None);
 | 
					            window->Viewport = AddUpdateViewport(window, window->ID, window->Pos, window->Size, ImGuiViewportFlags_None);
 | 
				
			||||||
    
 | 
					
 | 
				
			||||||
    // Mark window as allowed to protrude outside of its viewport and into the current monitor
 | 
					    // Mark window as allowed to protrude outside of its viewport and into the current monitor
 | 
				
			||||||
    if (!lock_viewport)
 | 
					    if (!lock_viewport)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@@ -12010,6 +12013,17 @@ static void ImGui::UpdateViewportPlatformMonitor(ImGuiViewportP* viewport)
 | 
				
			|||||||
    viewport->PlatformMonitor = (short)FindPlatformMonitorForRect(viewport->GetMainRect());
 | 
					    viewport->PlatformMonitor = (short)FindPlatformMonitorForRect(viewport->GetMainRect());
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Return value is always != NULL, but don't hold on it across frames.
 | 
				
			||||||
 | 
					const ImGuiPlatformMonitor* ImGui::GetViewportPlatformMonitor(ImGuiViewport* viewport_p)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
 | 
					    ImGuiViewportP* viewport = (ImGuiViewportP*)(void*)viewport_p;
 | 
				
			||||||
 | 
					    int monitor_idx = viewport->PlatformMonitor;
 | 
				
			||||||
 | 
					    if (monitor_idx >= 0 || monitor_idx < g.PlatformIO.Monitors.Size)
 | 
				
			||||||
 | 
					        return &g.PlatformIO.Monitors[monitor_idx];
 | 
				
			||||||
 | 
					    return &g.FallbackMonitor;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void ImGui::DestroyPlatformWindow(ImGuiViewportP* viewport)
 | 
					void ImGui::DestroyPlatformWindow(ImGuiViewportP* viewport)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ImGuiContext& g = *GImGui;
 | 
					    ImGuiContext& g = *GImGui;
 | 
				
			||||||
@@ -13613,7 +13627,7 @@ bool ImGui::DockNodeBeginAmendTabBar(ImGuiDockNode* node)
 | 
				
			|||||||
    PushOverrideID(node->ID);
 | 
					    PushOverrideID(node->ID);
 | 
				
			||||||
    bool ret = BeginTabBarEx(node->TabBar, node->TabBar->BarRect, node->TabBar->Flags, node);
 | 
					    bool ret = BeginTabBarEx(node->TabBar, node->TabBar->BarRect, node->TabBar->Flags, node);
 | 
				
			||||||
    IM_UNUSED(ret);
 | 
					    IM_UNUSED(ret);
 | 
				
			||||||
    IM_ASSERT(ret);    
 | 
					    IM_ASSERT(ret);
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1542,6 +1542,7 @@ struct ImGuiContext
 | 
				
			|||||||
    ImGuiViewportP*         MouseViewport;
 | 
					    ImGuiViewportP*         MouseViewport;
 | 
				
			||||||
    ImGuiViewportP*         MouseLastHoveredViewport;           // Last known viewport that was hovered by mouse (even if we are not hovering any viewport any more) + honoring the _NoInputs flag.
 | 
					    ImGuiViewportP*         MouseLastHoveredViewport;           // Last known viewport that was hovered by mouse (even if we are not hovering any viewport any more) + honoring the _NoInputs flag.
 | 
				
			||||||
    ImGuiID                 PlatformLastFocusedViewportId;
 | 
					    ImGuiID                 PlatformLastFocusedViewportId;
 | 
				
			||||||
 | 
					    ImGuiPlatformMonitor    FallbackMonitor;                    // Virtual monitor used as fallback if backend doesn't provide monitor information.
 | 
				
			||||||
    int                     ViewportFrontMostStampCount;        // Every time the front-most window changes, we stamp its viewport with an incrementing counter
 | 
					    int                     ViewportFrontMostStampCount;        // Every time the front-most window changes, we stamp its viewport with an incrementing counter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Gamepad/keyboard Navigation
 | 
					    // Gamepad/keyboard Navigation
 | 
				
			||||||
@@ -2452,9 +2453,10 @@ namespace ImGui
 | 
				
			|||||||
    IMGUI_API void          CallContextHooks(ImGuiContext* context, ImGuiContextHookType type);
 | 
					    IMGUI_API void          CallContextHooks(ImGuiContext* context, ImGuiContextHookType type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Viewports
 | 
					    // Viewports
 | 
				
			||||||
    IMGUI_API void          TranslateWindowsInViewport(ImGuiViewportP* viewport, const ImVec2& old_pos, const ImVec2& new_pos);
 | 
					    IMGUI_API void                  TranslateWindowsInViewport(ImGuiViewportP* viewport, const ImVec2& old_pos, const ImVec2& new_pos);
 | 
				
			||||||
    IMGUI_API void          ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale);
 | 
					    IMGUI_API void                  ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale);
 | 
				
			||||||
    IMGUI_API void          DestroyPlatformWindow(ImGuiViewportP* viewport);
 | 
					    IMGUI_API void                  DestroyPlatformWindow(ImGuiViewportP* viewport);
 | 
				
			||||||
 | 
					    const ImGuiPlatformMonitor*     GetViewportPlatformMonitor(ImGuiViewport* viewport);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Settings
 | 
					    // Settings
 | 
				
			||||||
    IMGUI_API void                  MarkIniSettingsDirty();
 | 
					    IMGUI_API void                  MarkIniSettingsDirty();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user