FIXME-VIEWPORT: This is all super messy and ought to be clarified or rewritten.
| 12852 | |
| 12853 | // FIXME-VIEWPORT: This is all super messy and ought to be clarified or rewritten. |
| 12854 | static void ImGui::WindowSelectViewport(ImGuiWindow* window) |
| 12855 | { |
| 12856 | ImGuiContext& g = *GImGui; |
| 12857 | ImGuiWindowFlags flags = window->Flags; |
| 12858 | window->ViewportAllowPlatformMonitorExtend = -1; |
| 12859 | |
| 12860 | // Restore main viewport if multi-viewport is not supported by the backend |
| 12861 | ImGuiViewportP* main_viewport = (ImGuiViewportP*)(void*)GetMainViewport(); |
| 12862 | if (!(g.ConfigFlagsCurrFrame & ImGuiConfigFlags_ViewportsEnable)) |
| 12863 | { |
| 12864 | SetWindowViewport(window, main_viewport); |
| 12865 | return; |
| 12866 | } |
| 12867 | window->ViewportOwned = false; |
| 12868 | |
| 12869 | // Appearing popups reset their viewport so they can inherit again |
| 12870 | if ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) && window->Appearing) |
| 12871 | { |
| 12872 | window->Viewport = NULL; |
| 12873 | window->ViewportId = 0; |
| 12874 | } |
| 12875 | |
| 12876 | if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasViewport) == 0) |
| 12877 | { |
| 12878 | // By default inherit from parent window |
| 12879 | if (window->Viewport == NULL && window->ParentWindow && (!window->ParentWindow->IsFallbackWindow || window->ParentWindow->WasActive)) |
| 12880 | window->Viewport = window->ParentWindow->Viewport; |
| 12881 | |
| 12882 | // Attempt to restore saved viewport id (= window that hasn't been activated yet), try to restore the viewport based on saved 'window->ViewportPos' restored from .ini file |
| 12883 | if (window->Viewport == NULL && window->ViewportId != 0) |
| 12884 | { |
| 12885 | window->Viewport = (ImGuiViewportP*)FindViewportByID(window->ViewportId); |
| 12886 | if (window->Viewport == NULL && window->ViewportPos.x != FLT_MAX && window->ViewportPos.y != FLT_MAX) |
| 12887 | window->Viewport = AddUpdateViewport(window, window->ID, window->ViewportPos, window->Size, ImGuiViewportFlags_None); |
| 12888 | } |
| 12889 | } |
| 12890 | |
| 12891 | bool lock_viewport = false; |
| 12892 | if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasViewport) |
| 12893 | { |
| 12894 | // Code explicitly request a viewport |
| 12895 | window->Viewport = (ImGuiViewportP*)FindViewportByID(g.NextWindowData.ViewportId); |
| 12896 | window->ViewportId = g.NextWindowData.ViewportId; // Store ID even if Viewport isn't resolved yet. |
| 12897 | lock_viewport = true; |
| 12898 | } |
| 12899 | else if ((flags & ImGuiWindowFlags_ChildWindow) || (flags & ImGuiWindowFlags_ChildMenu)) |
| 12900 | { |
| 12901 | // Always inherit viewport from parent window |
| 12902 | if (window->DockNode && window->DockNode->HostWindow) |
| 12903 | IM_ASSERT(window->DockNode->HostWindow->Viewport == window->ParentWindow->Viewport); |
| 12904 | window->Viewport = window->ParentWindow->Viewport; |
| 12905 | } |
| 12906 | else if (window->DockNode && window->DockNode->HostWindow) |
| 12907 | { |
| 12908 | // This covers the "always inherit viewport from parent window" case for when a window reattach to a node that was just created mid-frame |
| 12909 | window->Viewport = window->DockNode->HostWindow->Viewport; |
| 12910 | } |
| 12911 | else if (flags & ImGuiWindowFlags_Tooltip) |
nothing calls this directly
no test coverage detected