|
@@ -7787,107 +7787,6 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
-//-----------------------------------------------------------------------------
|
|
|
|
-// [SECTION] VIEWPORTS, 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.
|
|
|
|
-// The Render/Swap functions stored in ImGuiPlatformIO are merely here to allow for this helper to exist, but you can do it yourself:
|
|
|
|
-//
|
|
|
|
-// ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
|
|
-// for (int i = 1; i < platform_io.Viewports.Size; i++)
|
|
|
|
-// MyRenderFunction(platform_io.Viewports[i], my_args);
|
|
|
|
-// for (int i = 1; i < platform_io.Viewports.Size; i++)
|
|
|
|
-// MySwapBufferFunction(platform_io.Viewports[i], my_args);
|
|
|
|
-//
|
|
|
|
-void ImGui::RenderPlatformWindowsDefault(void* platform_render_arg, void* renderer_render_arg)
|
|
|
|
-{
|
|
|
|
- // Skip the main viewport (index 0), which is always fully handled by the application!
|
|
|
|
- ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
|
|
- for (int i = 1; i < platform_io.Viewports.Size; i++)
|
|
|
|
- {
|
|
|
|
- ImGuiViewport* viewport = platform_io.Viewports[i];
|
|
|
|
- if (platform_io.Platform_RenderWindow) platform_io.Platform_RenderWindow(viewport, platform_render_arg);
|
|
|
|
- if (platform_io.Renderer_RenderWindow) platform_io.Renderer_RenderWindow(viewport, renderer_render_arg);
|
|
|
|
- }
|
|
|
|
- for (int i = 1; i < platform_io.Viewports.Size; i++)
|
|
|
|
- {
|
|
|
|
- ImGuiViewport* viewport = platform_io.Viewports[i];
|
|
|
|
- if (platform_io.Platform_SwapBuffers) platform_io.Platform_SwapBuffers(viewport, platform_render_arg);
|
|
|
|
- if (platform_io.Renderer_SwapBuffers) platform_io.Renderer_SwapBuffers(viewport, renderer_render_arg);
|
|
|
|
- }
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-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;
|
|
|
|
-
|
|
|
|
- // Use a minimum threshold of 1.0f so a zero-sized rect will still find its monitor given its position.
|
|
|
|
- // This is necessary for tooltips which always resize down to zero at first.
|
|
|
|
- const float surface_threshold = ImMax(rect.GetWidth() * rect.GetHeight() * 0.5f, 1.0f);
|
|
|
|
- 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];
|
|
|
|
- const ImRect monitor_rect = ImRect(monitor.MainPos, monitor.MainPos + monitor.MainSize);
|
|
|
|
- if (monitor_rect.Contains(rect))
|
|
|
|
- return monitor_n;
|
|
|
|
- ImRect overlapping_rect = rect;
|
|
|
|
- overlapping_rect.ClipWithFull(monitor_rect);
|
|
|
|
- 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;
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void ImGui::DestroyPlatformWindow(ImGuiViewportP* viewport)
|
|
|
|
-{
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- if (g.PlatformIO.Renderer_DestroyWindow)
|
|
|
|
- g.PlatformIO.Renderer_DestroyWindow(viewport);
|
|
|
|
- if (g.PlatformIO.Platform_DestroyWindow)
|
|
|
|
- g.PlatformIO.Platform_DestroyWindow(viewport);
|
|
|
|
- IM_ASSERT(viewport->RendererUserData == NULL);
|
|
|
|
- IM_ASSERT(viewport->PlatformUserData == NULL);
|
|
|
|
- viewport->PlatformHandle = NULL;
|
|
|
|
- viewport->RendererUserData = viewport->PlatformHandle = NULL;
|
|
|
|
- viewport->PlatformWindowCreated = false;
|
|
|
|
- viewport->ClearRequestFlags();
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-void ImGui::DestroyPlatformWindows()
|
|
|
|
-{
|
|
|
|
- // We call the destroy window on every viewport (including the main viewport, index 0) to give a chance to the back-end
|
|
|
|
- // to clear any data they may have stored in e.g. PlatformUserData, RendererUserData.
|
|
|
|
- // It is convenient for the platform back-end code to store something in the main viewport, in order for e.g. the mouse handling
|
|
|
|
- // code to operator a consistent manner.
|
|
|
|
- // It is expected that the back-end can handle calls to Renderer_DestroyWindow/Platform_DestroyWindow without
|
|
|
|
- // crashing if it doesn't have data stored.
|
|
|
|
- ImGuiContext& g = *GImGui;
|
|
|
|
- for (int i = 0; i < g.Viewports.Size; i++)
|
|
|
|
- DestroyPlatformWindow(g.Viewports[i]);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
// [SECTION] KEYBOARD/GAMEPAD NAVIGATION
|
|
// [SECTION] KEYBOARD/GAMEPAD NAVIGATION
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
@@ -10613,6 +10512,103 @@ void ImGui::UpdatePlatformWindows()
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// 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.
|
|
|
|
+// The Render/Swap functions stored in ImGuiPlatformIO are merely here to allow for this helper to exist, but you can do it yourself:
|
|
|
|
+//
|
|
|
|
+// ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
|
|
+// for (int i = 1; i < platform_io.Viewports.Size; i++)
|
|
|
|
+// MyRenderFunction(platform_io.Viewports[i], my_args);
|
|
|
|
+// for (int i = 1; i < platform_io.Viewports.Size; i++)
|
|
|
|
+// MySwapBufferFunction(platform_io.Viewports[i], my_args);
|
|
|
|
+//
|
|
|
|
+void ImGui::RenderPlatformWindowsDefault(void* platform_render_arg, void* renderer_render_arg)
|
|
|
|
+{
|
|
|
|
+ // Skip the main viewport (index 0), which is always fully handled by the application!
|
|
|
|
+ ImGuiPlatformIO& platform_io = ImGui::GetPlatformIO();
|
|
|
|
+ for (int i = 1; i < platform_io.Viewports.Size; i++)
|
|
|
|
+ {
|
|
|
|
+ ImGuiViewport* viewport = platform_io.Viewports[i];
|
|
|
|
+ if (platform_io.Platform_RenderWindow) platform_io.Platform_RenderWindow(viewport, platform_render_arg);
|
|
|
|
+ if (platform_io.Renderer_RenderWindow) platform_io.Renderer_RenderWindow(viewport, renderer_render_arg);
|
|
|
|
+ }
|
|
|
|
+ for (int i = 1; i < platform_io.Viewports.Size; i++)
|
|
|
|
+ {
|
|
|
|
+ ImGuiViewport* viewport = platform_io.Viewports[i];
|
|
|
|
+ if (platform_io.Platform_SwapBuffers) platform_io.Platform_SwapBuffers(viewport, platform_render_arg);
|
|
|
|
+ if (platform_io.Renderer_SwapBuffers) platform_io.Renderer_SwapBuffers(viewport, renderer_render_arg);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+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;
|
|
|
|
+
|
|
|
|
+ // Use a minimum threshold of 1.0f so a zero-sized rect will still find its monitor given its position.
|
|
|
|
+ // This is necessary for tooltips which always resize down to zero at first.
|
|
|
|
+ const float surface_threshold = ImMax(rect.GetWidth() * rect.GetHeight() * 0.5f, 1.0f);
|
|
|
|
+ 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];
|
|
|
|
+ const ImRect monitor_rect = ImRect(monitor.MainPos, monitor.MainPos + monitor.MainSize);
|
|
|
|
+ if (monitor_rect.Contains(rect))
|
|
|
|
+ return monitor_n;
|
|
|
|
+ ImRect overlapping_rect = rect;
|
|
|
|
+ overlapping_rect.ClipWithFull(monitor_rect);
|
|
|
|
+ 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;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::DestroyPlatformWindow(ImGuiViewportP* viewport)
|
|
|
|
+{
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ if (g.PlatformIO.Renderer_DestroyWindow)
|
|
|
|
+ g.PlatformIO.Renderer_DestroyWindow(viewport);
|
|
|
|
+ if (g.PlatformIO.Platform_DestroyWindow)
|
|
|
|
+ g.PlatformIO.Platform_DestroyWindow(viewport);
|
|
|
|
+ IM_ASSERT(viewport->RendererUserData == NULL);
|
|
|
|
+ IM_ASSERT(viewport->PlatformUserData == NULL);
|
|
|
|
+ viewport->PlatformHandle = NULL;
|
|
|
|
+ viewport->RendererUserData = viewport->PlatformHandle = NULL;
|
|
|
|
+ viewport->PlatformWindowCreated = false;
|
|
|
|
+ viewport->ClearRequestFlags();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void ImGui::DestroyPlatformWindows()
|
|
|
|
+{
|
|
|
|
+ // We call the destroy window on every viewport (including the main viewport, index 0) to give a chance to the back-end
|
|
|
|
+ // to clear any data they may have stored in e.g. PlatformUserData, RendererUserData.
|
|
|
|
+ // It is convenient for the platform back-end code to store something in the main viewport, in order for e.g. the mouse handling
|
|
|
|
+ // code to operator a consistent manner.
|
|
|
|
+ // It is expected that the back-end can handle calls to Renderer_DestroyWindow/Platform_DestroyWindow without
|
|
|
|
+ // crashing if it doesn't have data stored.
|
|
|
|
+ ImGuiContext& g = *GImGui;
|
|
|
|
+ for (int i = 0; i < g.Viewports.Size; i++)
|
|
|
|
+ DestroyPlatformWindow(g.Viewports[i]);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
//-----------------------------------------------------------------------------
|
|
// [SECTION] DOCKING
|
|
// [SECTION] DOCKING
|