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.
| 5158 | // with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is |
| 5159 | // called, aka before the next Begin(). Moving window isn't affected. |
| 5160 | static void FindHoveredWindow() |
| 5161 | { |
| 5162 | ImGuiContext& g = *GImGui; |
| 5163 | |
| 5164 | ImGuiWindow* hovered_window = NULL; |
| 5165 | ImGuiWindow* hovered_window_ignoring_moving_window = NULL; |
| 5166 | if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) |
| 5167 | hovered_window = g.MovingWindow; |
| 5168 | |
| 5169 | ImVec2 padding_regular = g.Style.TouchExtraPadding; |
| 5170 | ImVec2 padding_for_resize = g.IO.ConfigWindowsResizeFromEdges ? g.WindowsHoverPadding : padding_regular; |
| 5171 | for (int i = g.Windows.Size - 1; i >= 0; i--) |
| 5172 | { |
| 5173 | ImGuiWindow* window = g.Windows[i]; |
| 5174 | IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. |
| 5175 | if (!window->Active || window->Hidden) |
| 5176 | continue; |
| 5177 | if (window->Flags & ImGuiWindowFlags_NoMouseInputs) |
| 5178 | continue; |
| 5179 | |
| 5180 | // Using the clipped AABB, a child window will typically be clipped by its parent (not always) |
| 5181 | ImRect bb(window->OuterRectClipped); |
| 5182 | if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) |
| 5183 | bb.Expand(padding_regular); |
| 5184 | else |
| 5185 | bb.Expand(padding_for_resize); |
| 5186 | if (!bb.Contains(g.IO.MousePos)) |
| 5187 | continue; |
| 5188 | |
| 5189 | // Support for one rectangular hole in any given window |
| 5190 | // FIXME: Consider generalizing hit-testing override (with more generic data, callback, etc.) (#1512) |
| 5191 | if (window->HitTestHoleSize.x != 0) |
| 5192 | { |
| 5193 | ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y); |
| 5194 | ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y); |
| 5195 | if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos)) |
| 5196 | continue; |
| 5197 | } |
| 5198 | |
| 5199 | if (hovered_window == NULL) |
| 5200 | hovered_window = window; |
| 5201 | IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. |
| 5202 | if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) |
| 5203 | hovered_window_ignoring_moving_window = window; |
| 5204 | if (hovered_window && hovered_window_ignoring_moving_window) |
| 5205 | break; |
| 5206 | } |
| 5207 | |
| 5208 | g.HoveredWindow = hovered_window; |
| 5209 | g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window; |
| 5210 | } |
| 5211 | |
| 5212 | bool ImGui::IsItemActive() |
| 5213 | { |
no test coverage detected