@ -2112,9 +2112,9 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
Appearing = false ;
Appearing = false ;
Hidden = false ;
Hidden = false ;
HasCloseButton = false ;
HasCloseButton = false ;
BeginCount = 0 ;
BeginOrderWithinParent = - 1 ;
BeginOrderWithinParent = - 1 ;
BeginOrderWithinContext = - 1 ;
BeginOrderWithinContext = - 1 ;
BeginCount = 0 ;
PopupId = 0 ;
PopupId = 0 ;
AutoFitFramesX = AutoFitFramesY = - 1 ;
AutoFitFramesX = AutoFitFramesY = - 1 ;
AutoFitOnlyGrows = false ;
AutoFitOnlyGrows = false ;
@ -2757,23 +2757,6 @@ void ImGui::UpdateMouseMovingWindow()
}
}
}
}
// If the back-end doesn't set MouseLastHoveredViewport or doesn't honor ImGuiViewportFlags_NoInputs, we do a search ourselves.
// A) It won't take account of the possibility that non-imgui windows may be in-between our dragged window and our target window.
// B) It requires Platform_GetWindowFocus to be implemented by back-end.
static ImGuiViewportP * FindViewportHoveredFromPlatformWindowStack ( const ImVec2 mouse_platform_pos )
{
ImGuiContext & g = * GImGui ;
ImGuiViewportP * best_candidate = NULL ;
for ( int n = 0 ; n < g . Viewports . Size ; n + + )
{
ImGuiViewportP * viewport = g . Viewports [ n ] ;
if ( ! ( viewport - > Flags & ImGuiViewportFlags_NoInputs ) & & viewport - > GetRect ( ) . Contains ( mouse_platform_pos ) )
if ( best_candidate = = NULL | | best_candidate - > LastFrontMostStampCount < viewport - > LastFrontMostStampCount )
best_candidate = viewport ;
}
return best_candidate ;
}
static void TranslateWindow ( ImGuiWindow * window , const ImVec2 & delta )
static void TranslateWindow ( ImGuiWindow * window , const ImVec2 & delta )
{
{
window - > Pos + = delta ;
window - > Pos + = delta ;
@ -4556,42 +4539,6 @@ static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& co
* out_size = size_constrained ;
* out_size = size_constrained ;
}
}
static int ImGui : : FindPlatformMonitorForPos ( const ImVec2 & pos )
{
ImGuiContext & g = * GImGui ;
for ( int monitor_n = 0 ; monitor_n < g . PlatformIO . Monitors . Size ; monitor_n + + )
{
const ImGuiPlatformMonitor & monitor = g . PlatformIO . Monitors [ monitor_n ] ;
if ( ImRect ( monitor . MainPos , monitor . MainPos + monitor . MainSize ) . Contains ( pos ) )
return monitor_n ;
}
return - 1 ;
}
// 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
static int ImGui : : FindPlatformMonitorForRect ( const ImRect & rect )
{
ImGuiContext & g = * GImGui ;
float surface_threshold = rect . GetWidth ( ) * rect . GetHeight ( ) * 0.5f ;
int best_monitor_n = - 1 ;
float best_monitor_surface = 0.001f ;
for ( int monitor_n = 0 ; monitor_n < g . PlatformIO . Monitors . Size & & best_monitor_surface < surface_threshold ; monitor_n + + )
{
const ImGuiPlatformMonitor & monitor = g . PlatformIO . Monitors [ monitor_n ] ;
if ( ImRect ( monitor . MainPos , monitor . MainPos + monitor . MainSize ) . Contains ( rect ) )
return monitor_n ;
ImRect overlapping_rect = rect ;
overlapping_rect . ClipWithFull ( ImRect ( monitor . MainPos , monitor . MainPos + monitor . MainSize ) ) ;
float overlapping_surface = overlapping_rect . GetWidth ( ) * overlapping_rect . GetHeight ( ) ;
if ( overlapping_surface < best_monitor_surface )
continue ;
best_monitor_surface = overlapping_surface ;
best_monitor_n = monitor_n ;
}
return best_monitor_n ;
}
struct ImGuiResizeGripDef
struct ImGuiResizeGripDef
{
{
ImVec2 CornerPos ;
ImVec2 CornerPos ;
@ -7333,6 +7280,23 @@ void ImGui::ScaleWindowsInViewport(ImGuiViewportP* viewport, float scale)
}
}
}
}
// If the back-end doesn't set MouseLastHoveredViewport or doesn't honor ImGuiViewportFlags_NoInputs, we do a search ourselves.
// A) It won't take account of the possibility that non-imgui windows may be in-between our dragged window and our target window.
// B) It requires Platform_GetWindowFocus to be implemented by back-end.
static ImGuiViewportP * FindViewportHoveredFromPlatformWindowStack ( const ImVec2 mouse_platform_pos )
{
ImGuiContext & g = * GImGui ;
ImGuiViewportP * best_candidate = NULL ;
for ( int n = 0 ; n < g . Viewports . Size ; n + + )
{
ImGuiViewportP * viewport = g . Viewports [ n ] ;
if ( ! ( viewport - > Flags & ImGuiViewportFlags_NoInputs ) & & viewport - > GetRect ( ) . Contains ( mouse_platform_pos ) )
if ( best_candidate = = NULL | | best_candidate - > LastFrontMostStampCount < viewport - > LastFrontMostStampCount )
best_candidate = viewport ;
}
return best_candidate ;
}
static void ImGui : : UpdateViewports ( )
static void ImGui : : UpdateViewports ( )
{
{
ImGuiContext & g = * GImGui ;
ImGuiContext & g = * GImGui ;
@ -7747,6 +7711,42 @@ void ImGui::UpdatePlatformWindows()
}
}
}
}
static int ImGui : : FindPlatformMonitorForPos ( const ImVec2 & pos )
{
ImGuiContext & g = * GImGui ;
for ( int monitor_n = 0 ; monitor_n < g . PlatformIO . Monitors . Size ; monitor_n + + )
{
const ImGuiPlatformMonitor & monitor = g . PlatformIO . Monitors [ monitor_n ] ;
if ( ImRect ( monitor . MainPos , monitor . MainPos + monitor . MainSize ) . Contains ( pos ) )
return monitor_n ;
}
return - 1 ;
}
// 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
static int ImGui : : FindPlatformMonitorForRect ( const ImRect & rect )
{
ImGuiContext & g = * GImGui ;
float surface_threshold = rect . GetWidth ( ) * rect . GetHeight ( ) * 0.5f ;
int best_monitor_n = - 1 ;
float best_monitor_surface = 0.001f ;
for ( int monitor_n = 0 ; monitor_n < g . PlatformIO . Monitors . Size & & best_monitor_surface < surface_threshold ; monitor_n + + )
{
const ImGuiPlatformMonitor & monitor = g . PlatformIO . Monitors [ monitor_n ] ;
if ( ImRect ( monitor . MainPos , monitor . MainPos + monitor . MainSize ) . Contains ( rect ) )
return monitor_n ;
ImRect overlapping_rect = rect ;
overlapping_rect . ClipWithFull ( ImRect ( monitor . MainPos , monitor . MainPos + monitor . MainSize ) ) ;
float overlapping_surface = overlapping_rect . GetWidth ( ) * overlapping_rect . GetHeight ( ) ;
if ( overlapping_surface < best_monitor_surface )
continue ;
best_monitor_surface = overlapping_surface ;
best_monitor_n = monitor_n ;
}
return best_monitor_n ;
}
// This is a default/basic function for performing the rendering/swap of multiple platform windows.
// This is a default/basic function for performing the rendering/swap of multiple platform windows.
// Custom renderers may prefer to not call this function at all, and instead iterate the publicly exposed platform data and handle rendering/sync themselves.
// Custom renderers may prefer to not call this function at all, and instead iterate the publicly exposed platform data and handle rendering/sync themselves.
// The Render/Swap functions stored in ImGuiPlatformIO are merely here to allow for this helper to exist, but you can do it yourself:
// The Render/Swap functions stored in ImGuiPlatformIO are merely here to allow for this helper to exist, but you can do it yourself:
@ -9894,7 +9894,7 @@ static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
# endif
# endif
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// HELP, METRICS
// METRICS/DEBUG WINDOW
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
static void RenderViewportThumbnail ( ImDrawList * draw_list , ImGuiViewportP * viewport , const ImRect & bb )
static void RenderViewportThumbnail ( ImDrawList * draw_list , ImGuiViewportP * viewport , const ImRect & bb )