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.
| 5305 | // with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is |
| 5306 | // called, aka before the next Begin(). Moving window isn't affected. |
| 5307 | static void FindHoveredWindow() |
| 5308 | { |
| 5309 | ImGuiContext& g = *GImGui; |
| 5310 | |
| 5311 | ImGuiWindow* hovered_window = NULL; |
| 5312 | ImGuiWindow* hovered_window_ignoring_moving_window = NULL; |
| 5313 | if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) |
| 5314 | hovered_window = g.MovingWindow; |
| 5315 | |
| 5316 | ImVec2 padding_regular = g.Style.TouchExtraPadding; |
| 5317 | ImVec2 padding_for_resize = g.IO.ConfigWindowsResizeFromEdges ? g.WindowsHoverPadding : padding_regular; |
| 5318 | for (int i = g.Windows.Size - 1; i >= 0; i--) |
| 5319 | { |
| 5320 | ImGuiWindow* window = g.Windows[i]; |
| 5321 | IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. |
| 5322 | if (!window->Active || window->Hidden) |
| 5323 | continue; |
| 5324 | if (window->Flags & ImGuiWindowFlags_NoMouseInputs) |
| 5325 | continue; |
| 5326 | |
| 5327 | // Using the clipped AABB, a child window will typically be clipped by its parent (not always) |
| 5328 | ImRect bb(window->OuterRectClipped); |
| 5329 | if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) |
| 5330 | bb.Expand(padding_regular); |
| 5331 | else |
| 5332 | bb.Expand(padding_for_resize); |
| 5333 | if (!bb.Contains(g.IO.MousePos)) |
| 5334 | continue; |
| 5335 | |
| 5336 | // Support for one rectangular hole in any given window |
| 5337 | // FIXME: Consider generalizing hit-testing override (with more generic data, callback, etc.) (#1512) |
| 5338 | if (window->HitTestHoleSize.x != 0) |
| 5339 | { |
| 5340 | ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y); |
| 5341 | ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y); |
| 5342 | if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos)) |
| 5343 | continue; |
| 5344 | } |
| 5345 | |
| 5346 | if (hovered_window == NULL) |
| 5347 | hovered_window = window; |
| 5348 | IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. |
| 5349 | if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) |
| 5350 | hovered_window_ignoring_moving_window = window; |
| 5351 | if (hovered_window && hovered_window_ignoring_moving_window) |
| 5352 | break; |
| 5353 | } |
| 5354 | |
| 5355 | g.HoveredWindow = hovered_window; |
| 5356 | g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window; |
| 5357 | } |
| 5358 | |
| 5359 | bool ImGui::IsItemActive() |
| 5360 | { |
no test coverage detected