@ -766,7 +766,7 @@ const ImGuiID IMGUI_VIEWPORT_DEFAULT_ID = 0x11111111; // Using an arbi
static inline ImRect GetViewportRect ( ImGuiWindow * window ) { return window - > Viewport - > GetRect ( ) ; }
static inline ImVec2 ConvertViewportPosToPlatformPos ( const ImVec2 & imgui_pos , ImGuiViewport * viewport ) { return imgui_pos - viewport - > Pos + viewport - > PlatformPos ; }
static inline ImVec2 ConvertPlatformPosToViewportPos ( const ImVec2 & platform_pos , ImGuiViewport * viewport ) { return platform_pos - viewport - > PlatformPos + viewport - > Pos ; }
static ImGuiViewportP * Add Viewport( ImGuiWindow * window , ImGuiID id , ImGuiViewportFlags flags , const ImVec2 & platform_pos , const ImVec2 & size ) ;
static ImGuiViewportP * Add Update Viewport( ImGuiWindow * window , ImGuiID id , ImGuiViewportFlags flags , const ImVec2 & platform_pos , const ImVec2 & size ) ;
static void UpdateViewports ( ) ;
static void UpdateSelectWindowViewport ( ImGuiWindow * window ) ;
static void SetCurrentViewport ( ImGuiViewportP * viewport ) ;
@ -1948,8 +1948,9 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
Scroll = ImVec2 ( 0.0f , 0.0f ) ;
ScrollTarget = ImVec2 ( FLT_MAX , FLT_MAX ) ;
ScrollTargetCenterRatio = ImVec2 ( 0.5f , 0.5f ) ;
ScrollbarX = ScrollbarY = false ;
ScrollbarSizes = ImVec2 ( 0.0f , 0.0f ) ;
ScrollbarX = ScrollbarY = false ;
ViewportOwned = false ;
Active = WasActive = false ;
WriteAccessed = false ;
Collapsed = false ;
@ -3313,24 +3314,25 @@ static void ImGui::NewFrameUpdateMovingWindowDropViewport(ImGuiWindow* window)
ImRect mouse_viewport_rect = g . MousePosViewport - > GetRect ( ) ;
ImVec2 window_pos_in_mouse_viewport = ConvertPlatformPosToViewportPos ( ConvertViewportPosToPlatformPos ( window - > Pos , window - > Viewport ) , g . MousePosViewport ) ;
ImRect window_rect_in_mouse_viewport = ImRect ( window_pos_in_mouse_viewport , window_pos_in_mouse_viewport + window - > Size ) ;
if ( ( g . MousePosViewport - > Flags & ImGuiViewportFlags_CanHostOtherWindows ) & & mouse_viewport_rect . Contains ( window_rect_in_mouse_viewport ) )
if ( ( g . MousePosViewport - > Flags & ImGuiViewportFlags_CanHostOtherWindows ) & & mouse_viewport_rect . Contains ( window_rect_in_mouse_viewport ) )
{
// Drop on an existing viewport
ImGuiViewportP * old_viewport = window - > Viewport ;
SetWindowViewportTranslateToPreservePlatformPos ( window , window - > Viewport , g . MousePosViewport ) ;
// Our current scheme allow any window to land on a viewport, so when that viewport merges, move other windows as well
// FIXME-OPT
if ( window - > Flags & ImGuiWindowFlags_FullViewport )
// Move child/hosted windows as well (FIXME-OPT)
if ( window - > ViewportOwned )
for ( int n = 0 ; n < g . Windows . Size ; n + + )
if ( g . Windows [ n ] - > Viewport = = old_viewport )
SetWindowViewportTranslateToPreservePlatformPos ( g . Windows [ n ] , old_viewport , g . MousePosViewport ) ;
window - > ViewportOwned = false ;
}
else
{
// Create/persist new viewport
ImVec2 platform_pos = ConvertViewportPosToPlatformPos ( window - > Pos , window - > Viewport ) ;
ImGuiViewportP * viewport = AddViewport ( window , window - > ID , 0 , platform_pos , window - > Size ) ;
ImGuiViewportP * viewport = AddUpdateViewport ( window , window - > ID , 0 , platform_pos , window - > Size ) ;
IM_ASSERT ( viewport = = window - > Viewport ) ;
SetWindowViewportTranslateToPreservePlatformPos ( window , window - > Viewport , viewport ) ;
}
}
@ -3476,7 +3478,7 @@ static void ImGui::UpdateViewports()
ImVec2 main_viewport_platform_pos = ImVec2 ( 0.0f , 0.0f ) ;
if ( ( g . IO . ConfigFlags & ImGuiConfigFlags_ViewportsEnable ) )
main_viewport_platform_pos = g . PlatformIO . Platform_GetWindowPos ( main_viewport ) ;
Add Viewport( NULL , IMGUI_VIEWPORT_DEFAULT_ID , ImGuiViewportFlags_CanHostOtherWindows , main_viewport_platform_pos , g . IO . DisplaySize ) ;
Add Update Viewport( NULL , IMGUI_VIEWPORT_DEFAULT_ID , ImGuiViewportFlags_CanHostOtherWindows , main_viewport_platform_pos , g . IO . DisplaySize ) ;
if ( ! ( g . IO . ConfigFlags & ImGuiConfigFlags_ViewportsEnable ) )
{
@ -4699,7 +4701,7 @@ void ImGui::SetCurrentViewport(ImGuiViewportP* viewport)
g . PlatformIO . Platform_OnChangedViewport ( g . CurrentViewport ) ;
}
ImGuiViewportP * ImGui : : Add Viewport( ImGuiWindow * window , ImGuiID id , ImGuiViewportFlags flags , const ImVec2 & platform_pos , const ImVec2 & size )
ImGuiViewportP * ImGui : : Add Update Viewport( ImGuiWindow * window , ImGuiID id , ImGuiViewportFlags flags , const ImVec2 & platform_pos , const ImVec2 & size )
{
ImGuiContext & g = * GImGui ;
IM_ASSERT ( id ! = 0 ) ;
@ -4733,6 +4735,9 @@ ImGuiViewportP* ImGui::AddViewport(ImGuiWindow* window, ImGuiID id, ImGuiViewpor
viewport - > PlatformPos = platform_pos ;
viewport - > LastFrameActive = g . FrameCount ;
if ( window ! = NULL )
window - > ViewportOwned = true ;
// Request an initial DpiScale before the OS platform window creation
// This is so we can select an appropriate font size on the first frame of our window lifetime
if ( g . PlatformIO . Platform_GetWindowDpiScale )
@ -6070,7 +6075,7 @@ static ImVec2 CalcSizeAutoFit(ImGuiWindow* window, const ImVec2& size_contents)
else
{
// When the window cannot fit all contents (either because of constraints, either because screen is too small): we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding.
ImVec2 viewport_size = ( window - > Flags & ImGuiWindowFlags_FullViewport ) ? ImVec2 ( FLT_MAX , FLT_MAX ) : window - > Viewport - > Size ;
ImVec2 viewport_size = window - > ViewportOwned ? ImVec2 ( FLT_MAX , FLT_MAX ) : window - > Viewport - > Size ;
size_auto_fit = ImClamp ( size_contents , style . WindowMinSize , ImMax ( style . WindowMinSize , viewport_size - g . Style . DisplaySafeAreaPadding ) ) ;
ImVec2 size_auto_fit_after_constraint = CalcSizeAfterConstraint ( window , size_auto_fit ) ;
if ( size_auto_fit_after_constraint . x < size_contents . x & & ! ( flags & ImGuiWindowFlags_NoScrollbar ) & & ( flags & ImGuiWindowFlags_HorizontalScrollbar ) )
@ -6156,6 +6161,7 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
{
ImGuiContext & g = * GImGui ;
ImGuiWindowFlags flags = window - > Flags ;
window - > ViewportOwned = false ;
// Restore main viewport if multi-viewport is not supported by the back-end
ImGuiViewportP * main_viewport = g . Viewports [ 0 ] ;
@ -6186,8 +6192,7 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
window - > Viewport = FindViewportByID ( window - > ViewportId ) ;
if ( window - > Viewport = = NULL & & window - > ViewportPlatformPos . x ! = FLT_MAX & & window - > ViewportPlatformPos . y ! = FLT_MAX )
{
ImGuiViewportP * viewport = AddViewport ( window , window - > ID , ImGuiViewportFlags_NoDecoration , window - > ViewportPlatformPos , window - > Size ) ;
window - > Flags | = ImGuiWindowFlags_FullViewport ;
ImGuiViewportP * viewport = AddUpdateViewport ( window , window - > ID , ImGuiViewportFlags_NoDecoration , window - > ViewportPlatformPos , window - > Size ) ;
window - > Viewport = viewport ;
created_viewport = true ;
}
@ -6213,8 +6218,7 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
// Calculate mouse position in OS/platform coordinates, create a Viewport at this position.
ImVec2 platform_pos = ConvertViewportPosToPlatformPos ( g . IO . MousePos - g . ActiveIdClickOffset , g . MousePosViewport ) ;
ImGuiViewportFlags viewport_flags = ImGuiViewportFlags_NoDecoration | ImGuiViewportFlags_NoFocusOnAppearing | ImGuiViewportFlags_NoInputs ;
ImGuiViewportP * viewport = AddViewport ( window , window - > ID , viewport_flags , platform_pos , window - > Size ) ;
window - > Flags | = ImGuiWindowFlags_FullViewport ;
ImGuiViewportP * viewport = AddUpdateViewport ( window , window - > ID , viewport_flags , platform_pos , window - > Size ) ;
window - > Viewport = viewport ;
created_viewport = true ;
}
@ -6239,14 +6243,14 @@ static void ImGui::UpdateSelectWindowViewport(ImGuiWindow* window)
if ( ! window - > Viewport - > PlatformRequestResize )
window - > Viewport - > Size = window - > Size ;
window - > Viewport - > PlatformPos = ConvertViewportPosToPlatformPos ( window - > Pos , window - > Viewport ) ;
window - > Flags | = ImGuiWindowFlags_Full Viewport;
window - > ViewportOwned = true ;
}
// If the OS window has a title bar, hide our imgui title bar
if ( ( window - > Flags & ImGuiWindowFlags_FullViewport ) & & ! ( window - > Viewport - > Flags & ImGuiViewportFlags_NoDecoration ) )
if ( window - > ViewportOwned & & ! ( window - > Viewport - > Flags & ImGuiViewportFlags_NoDecoration ) )
window - > Flags | = ImGuiWindowFlags_NoTitleBar ;
if ( window - > Flags & ImGuiWindowFlags_Full Viewport)
if ( window - > ViewportOwned )
{
// We currently have window fully covering a viewport and we disable WindowBg alpha, so clearing is not necessary
window - > Viewport - > Flags | = ImGuiViewportFlags_NoRendererClear ;
@ -6386,7 +6390,7 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au
}
if ( pos_target . x ! = FLT_MAX )
{
if ( window - > Flags & ImGuiWindowFlags_Full Viewport)
if ( window - > ViewportOwned )
window - > Viewport - > PlatformPos = ConvertViewportPosToPlatformPos ( ImFloor ( pos_target ) , window - > Viewport ) ;
else
window - > Pos = window - > PosFloat = ImFloor ( pos_target ) ;
@ -6557,7 +6561,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Lock window rounding, border size and padding for the frame (so that altering them doesn't cause inconsistencies)
window - > WindowRounding = ( flags & ImGuiWindowFlags_ChildWindow ) ? style . ChildRounding : ( ( flags & ImGuiWindowFlags_Popup ) & & ! ( flags & ImGuiWindowFlags_Modal ) ) ? style . PopupRounding : style . WindowRounding ;
if ( window - > Flags & ImGuiWindowFlags_Full Viewport)
if ( window - > ViewportOwned )
window - > WindowRounding = 0.0f ;
window - > WindowBorderSize = ( flags & ImGuiWindowFlags_ChildWindow ) ? style . ChildBorderSize : ( ( flags & ( ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip ) ) & & ! ( flags & ImGuiWindowFlags_Modal ) ) ? style . PopupBorderSize : style . WindowBorderSize ;
window - > WindowPadding = style . WindowPadding ;
@ -6683,7 +6687,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Clamp position so window stays visible within its viewport
// Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing.
ImRect viewport_rect ( GetViewportRect ( window ) ) ;
if ( ! window_pos_set_by_api & & ! ( flags & ( ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip | ImGuiWindowFlags_FullViewport ) ) & & window - > AutoFitFramesX < = 0 & & window - > AutoFitFramesY < = 0 )
if ( ! window_pos_set_by_api & & ! ( flags & ( ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip ) ) & & ! window - > ViewportOwned & & window - > AutoFitFramesX < = 0 & & window - > AutoFitFramesY < = 0 )
if ( viewport_rect . GetWidth ( ) > 0 & & viewport_rect . GetHeight ( ) > 0.0f )
{
ImVec2 padding = ImMax ( style . DisplayWindowPadding , style . DisplaySafeAreaPadding ) ;
@ -6724,12 +6728,11 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// When a window is marked as owning its viewport, we immediately update the viewport after a resize
window - > ViewportPlatformPos = window - > Viewport - > PlatformPos ;
if ( flags & ImGuiWindowFlags_FullViewport )
if ( window - > Size . x ! = window - > Viewport - > Size . x | | window - > Size . y ! = window - > Viewport - > Size . y )
{
window - > Viewport - > Size = window - > SizeFull ;
viewport_rect = GetViewportRect ( window ) ;
}
if ( window - > ViewportOwned & & ( window - > Size . x ! = window - > Viewport - > Size . x | | window - > Size . y ! = window - > Viewport - > Size . y ) )
{
window - > Viewport - > Size = window - > SizeFull ;
viewport_rect = GetViewportRect ( window ) ;
}
// DRAWING
@ -6780,7 +6783,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
ImU32 bg_col = GetColorU32 ( GetWindowBgColorIdxFromFlags ( flags ) ) ;
if ( g . NextWindowData . BgAlphaCond ! = 0 )
bg_col = ( bg_col & ~ IM_COL32_A_MASK ) | ( IM_F32_TO_INT8_SAT ( g . NextWindowData . BgAlphaVal ) < < IM_COL32_A_SHIFT ) ;
if ( window - > Flags & ImGuiWindowFlags_Full Viewport)
if ( window - > ViewportOwned )
bg_col = ( bg_col | IM_COL32_A_MASK ) ;
window - > DrawList - > AddRectFilled ( window - > Pos + ImVec2 ( 0 , window - > TitleBarHeight ( ) ) , window - > Pos + window - > Size , bg_col , window_rounding , ( flags & ImGuiWindowFlags_NoTitleBar ) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot ) ;