|
@@ -3808,9 +3808,6 @@ static void ImGui::UpdateViewports()
|
|
ImGuiContext& g = *GImGui;
|
|
ImGuiContext& g = *GImGui;
|
|
IM_ASSERT(g.PlatformIO.Viewports.Size <= g.Viewports.Size);
|
|
IM_ASSERT(g.PlatformIO.Viewports.Size <= g.Viewports.Size);
|
|
|
|
|
|
- // Update mouse reference viewport
|
|
|
|
- g.MouseRefViewport = g.IO.MousePosViewport ? FindViewportByID(g.IO.MousePosViewport) : g.Viewports[0];
|
|
|
|
-
|
|
|
|
// Update main viewport with current platform position and size
|
|
// Update main viewport with current platform position and size
|
|
ImGuiViewportP* main_viewport = g.Viewports[0];
|
|
ImGuiViewportP* main_viewport = g.Viewports[0];
|
|
IM_ASSERT(main_viewport->ID == IMGUI_VIEWPORT_DEFAULT_ID);
|
|
IM_ASSERT(main_viewport->ID == IMGUI_VIEWPORT_DEFAULT_ID);
|
|
@@ -3820,6 +3817,7 @@ static void ImGui::UpdateViewports()
|
|
AddUpdateViewport(NULL, IMGUI_VIEWPORT_DEFAULT_ID, main_viewport_platform_pos, g.IO.DisplaySize, ImGuiViewportFlags_CanHostOtherWindows);
|
|
AddUpdateViewport(NULL, IMGUI_VIEWPORT_DEFAULT_ID, main_viewport_platform_pos, g.IO.DisplaySize, ImGuiViewportFlags_CanHostOtherWindows);
|
|
|
|
|
|
g.CurrentViewport = NULL;
|
|
g.CurrentViewport = NULL;
|
|
|
|
+ g.MouseRefViewport = NULL;
|
|
for (int n = 0; n < g.Viewports.Size; n++)
|
|
for (int n = 0; n < g.Viewports.Size; n++)
|
|
{
|
|
{
|
|
// Erase unused viewports
|
|
// Erase unused viewports
|
|
@@ -3835,7 +3833,6 @@ static void ImGui::UpdateViewports()
|
|
g.Viewports.erase(g.Viewports.Data + n);
|
|
g.Viewports.erase(g.Viewports.Data + n);
|
|
|
|
|
|
// Destroy
|
|
// Destroy
|
|
- if (viewport == g.MouseRefViewport) g.MouseRefViewport = main_viewport;
|
|
|
|
if (viewport == g.MouseLastHoveredViewport) g.MouseLastHoveredViewport = NULL;
|
|
if (viewport == g.MouseLastHoveredViewport) g.MouseLastHoveredViewport = NULL;
|
|
IM_ASSERT(viewport->RendererUserData == NULL && viewport->PlatformUserData == NULL && viewport->PlatformHandle == NULL);
|
|
IM_ASSERT(viewport->RendererUserData == NULL && viewport->PlatformUserData == NULL && viewport->PlatformHandle == NULL);
|
|
IM_ASSERT(g.PlatformIO.Viewports.contains(viewport) == false);
|
|
IM_ASSERT(g.PlatformIO.Viewports.contains(viewport) == false);
|
|
@@ -3894,13 +3891,14 @@ static void ImGui::UpdateViewports()
|
|
}
|
|
}
|
|
|
|
|
|
// Mouse handling: decide on the actual mouse viewport for this frame between the active/focused viewport and the hovered viewport.
|
|
// Mouse handling: decide on the actual mouse viewport for this frame between the active/focused viewport and the hovered viewport.
|
|
|
|
+ // Note that 'viewport_hovered' should skip over any viewport that has the ImGuiViewportFlags_NoInputs flags set.
|
|
ImGuiViewportP* viewport_hovered = NULL;
|
|
ImGuiViewportP* viewport_hovered = NULL;
|
|
if (g.IO.BackendFlags & ImGuiBackendFlags_HasMouseHoveredViewport)
|
|
if (g.IO.BackendFlags & ImGuiBackendFlags_HasMouseHoveredViewport)
|
|
{
|
|
{
|
|
viewport_hovered = g.IO.MouseHoveredViewport ? FindViewportByID(g.IO.MouseHoveredViewport) : NULL;
|
|
viewport_hovered = g.IO.MouseHoveredViewport ? FindViewportByID(g.IO.MouseHoveredViewport) : NULL;
|
|
if (viewport_hovered && (viewport_hovered->Flags & ImGuiViewportFlags_NoInputs))
|
|
if (viewport_hovered && (viewport_hovered->Flags & ImGuiViewportFlags_NoInputs))
|
|
{
|
|
{
|
|
- // Back-end failed at honoring its contract if it returned a viewport with the _NoInputs flag
|
|
|
|
|
|
+ // Back-end failed at honoring its contract if it returned a viewport with the _NoInputs flag.
|
|
IM_ASSERT(0);
|
|
IM_ASSERT(0);
|
|
viewport_hovered = FindViewportHoveredFromPlatformWindowStack(g.IO.MousePos);
|
|
viewport_hovered = FindViewportHoveredFromPlatformWindowStack(g.IO.MousePos);
|
|
}
|
|
}
|
|
@@ -3915,17 +3913,23 @@ static void ImGui::UpdateViewports()
|
|
if (viewport_hovered != NULL)
|
|
if (viewport_hovered != NULL)
|
|
g.MouseLastHoveredViewport = viewport_hovered;
|
|
g.MouseLastHoveredViewport = viewport_hovered;
|
|
|
|
|
|
|
|
+ // Update mouse reference viewport
|
|
|
|
+ g.MouseRefViewport = g.IO.MousePosViewport ? FindViewportByID(g.IO.MousePosViewport) : g.Viewports[0];
|
|
|
|
+
|
|
|
|
+ // When moving a window we aim at its viewport
|
|
|
|
+ if (g.MovingWindow)
|
|
|
|
+ g.MouseRefViewport = g.MovingWindow->Viewport;
|
|
|
|
+
|
|
// When dragging something, always refer to the last hovered viewport.
|
|
// When dragging something, always refer to the last hovered viewport.
|
|
- // (So when we are between viewports, our dragged preview will tend to show in the last viewport even if we don't have tooltips in viewports)
|
|
|
|
- // Also consider the case of holding on a menu item to browse child menus: even thought a mouse button is held, there's no active id because menu items only react on mouse release.
|
|
|
|
- const bool is_mouse_dragging_with_an_expected_destination = g.DragDropActive || (g.MovingWindow != NULL);
|
|
|
|
|
|
+ // - when releasing a moving window we will revert to aiming behind (at viewport_hovered)
|
|
|
|
+ // - when we are between viewports, our dragged preview will tend to show in the last viewport _even_ if we don't have tooltips in their viewports (when lacking monitor info)
|
|
|
|
+ // - consider the case of holding on a menu item to browse child menus: even thou a mouse button is held, there's no active id because menu items only react on mouse release.
|
|
|
|
+ const bool is_mouse_dragging_with_an_expected_destination = g.DragDropActive;// || (g.MovingWindow != NULL);
|
|
|
|
+ if (is_mouse_dragging_with_an_expected_destination && viewport_hovered == NULL)
|
|
|
|
+ viewport_hovered = g.MouseLastHoveredViewport;
|
|
if (is_mouse_dragging_with_an_expected_destination || g.ActiveId == 0 || !ImGui::IsAnyMouseDown())
|
|
if (is_mouse_dragging_with_an_expected_destination || g.ActiveId == 0 || !ImGui::IsAnyMouseDown())
|
|
- {
|
|
|
|
- if (is_mouse_dragging_with_an_expected_destination && viewport_hovered == NULL)
|
|
|
|
- viewport_hovered = g.MouseLastHoveredViewport;
|
|
|
|
if (viewport_hovered != NULL && viewport_hovered != g.MouseRefViewport && !(viewport_hovered->Flags & ImGuiViewportFlags_NoInputs))
|
|
if (viewport_hovered != NULL && viewport_hovered != g.MouseRefViewport && !(viewport_hovered->Flags & ImGuiViewportFlags_NoInputs))
|
|
g.MouseRefViewport = viewport_hovered;
|
|
g.MouseRefViewport = viewport_hovered;
|
|
- }
|
|
|
|
|
|
|
|
IM_ASSERT(g.MouseRefViewport != NULL);
|
|
IM_ASSERT(g.MouseRefViewport != NULL);
|
|
}
|
|
}
|