Find window given position, search front-to-back FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programmatically with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is called, aka before the next Begin(). Moving window isn't affected.
| 4710 | // with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is |
| 4711 | // called, aka before the next Begin(). Moving window isn't affected. |
| 4712 | static void FindHoveredWindow() |
| 4713 | { |
| 4714 | ImGuiContext& g = *GImGui; |
| 4715 | |
| 4716 | ImGuiWindow* hovered_window = NULL; |
| 4717 | ImGuiWindow* hovered_window_ignoring_moving_window = NULL; |
| 4718 | if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) |
| 4719 | hovered_window = g.MovingWindow; |
| 4720 | |
| 4721 | ImVec2 padding_regular = g.Style.TouchExtraPadding; |
| 4722 | ImVec2 padding_for_resize = g.IO.ConfigWindowsResizeFromEdges ? g.WindowsHoverPadding : padding_regular; |
| 4723 | for (int i = g.Windows.Size - 1; i >= 0; i--) |
| 4724 | { |
| 4725 | ImGuiWindow* window = g.Windows[i]; |
| 4726 | IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. |
| 4727 | if (!window->Active || window->Hidden) |
| 4728 | continue; |
| 4729 | if (window->Flags & ImGuiWindowFlags_NoMouseInputs) |
| 4730 | continue; |
| 4731 | |
| 4732 | // Using the clipped AABB, a child window will typically be clipped by its parent (not always) |
| 4733 | ImRect bb(window->OuterRectClipped); |
| 4734 | if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) |
| 4735 | bb.Expand(padding_regular); |
| 4736 | else |
| 4737 | bb.Expand(padding_for_resize); |
| 4738 | if (!bb.Contains(g.IO.MousePos)) |
| 4739 | continue; |
| 4740 | |
| 4741 | // Support for one rectangular hole in any given window |
| 4742 | // FIXME: Consider generalizing hit-testing override (with more generic data, callback, etc.) (#1512) |
| 4743 | if (window->HitTestHoleSize.x != 0) |
| 4744 | { |
| 4745 | ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y); |
| 4746 | ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y); |
| 4747 | if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos)) |
| 4748 | continue; |
| 4749 | } |
| 4750 | |
| 4751 | if (hovered_window == NULL) |
| 4752 | hovered_window = window; |
| 4753 | IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. |
| 4754 | if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) |
| 4755 | hovered_window_ignoring_moving_window = window; |
| 4756 | if (hovered_window && hovered_window_ignoring_moving_window) |
| 4757 | break; |
| 4758 | } |
| 4759 | |
| 4760 | g.HoveredWindow = hovered_window; |
| 4761 | g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window; |
| 4762 | } |
| 4763 | |
| 4764 | // Test if mouse cursor is hovering given rectangle |
| 4765 | // NB- Rectangle is clipped by our current clip setting |
no test coverage detected