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.
| 5197 | // with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is |
| 5198 | // called, aka before the next Begin(). Moving window isn't affected. |
| 5199 | static void FindHoveredWindow() |
| 5200 | { |
| 5201 | ImGuiContext& g = *GImGui; |
| 5202 | |
| 5203 | ImGuiWindow* hovered_window = NULL; |
| 5204 | ImGuiWindow* hovered_window_ignoring_moving_window = NULL; |
| 5205 | if (g.MovingWindow && !(g.MovingWindow->Flags & ImGuiWindowFlags_NoMouseInputs)) |
| 5206 | hovered_window = g.MovingWindow; |
| 5207 | |
| 5208 | ImVec2 padding_regular = g.Style.TouchExtraPadding; |
| 5209 | ImVec2 padding_for_resize = g.IO.ConfigWindowsResizeFromEdges ? g.WindowsHoverPadding : padding_regular; |
| 5210 | for (int i = g.Windows.Size - 1; i >= 0; i--) |
| 5211 | { |
| 5212 | ImGuiWindow* window = g.Windows[i]; |
| 5213 | IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. |
| 5214 | if (!window->Active || window->Hidden) |
| 5215 | continue; |
| 5216 | if (window->Flags & ImGuiWindowFlags_NoMouseInputs) |
| 5217 | continue; |
| 5218 | |
| 5219 | // Using the clipped AABB, a child window will typically be clipped by its parent (not always) |
| 5220 | ImVec2 hit_padding = (window->Flags & (ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize)) ? padding_regular : padding_for_resize; |
| 5221 | if (!window->OuterRectClipped.ContainsWithPad(g.IO.MousePos, hit_padding)) |
| 5222 | continue; |
| 5223 | |
| 5224 | // Support for one rectangular hole in any given window |
| 5225 | // FIXME: Consider generalizing hit-testing override (with more generic data, callback, etc.) (#1512) |
| 5226 | if (window->HitTestHoleSize.x != 0) |
| 5227 | { |
| 5228 | ImVec2 hole_pos(window->Pos.x + (float)window->HitTestHoleOffset.x, window->Pos.y + (float)window->HitTestHoleOffset.y); |
| 5229 | ImVec2 hole_size((float)window->HitTestHoleSize.x, (float)window->HitTestHoleSize.y); |
| 5230 | if (ImRect(hole_pos, hole_pos + hole_size).Contains(g.IO.MousePos)) |
| 5231 | continue; |
| 5232 | } |
| 5233 | |
| 5234 | if (hovered_window == NULL) |
| 5235 | hovered_window = window; |
| 5236 | IM_MSVC_WARNING_SUPPRESS(28182); // [Static Analyzer] Dereferencing NULL pointer. |
| 5237 | if (hovered_window_ignoring_moving_window == NULL && (!g.MovingWindow || window->RootWindow != g.MovingWindow->RootWindow)) |
| 5238 | hovered_window_ignoring_moving_window = window; |
| 5239 | if (hovered_window && hovered_window_ignoring_moving_window) |
| 5240 | break; |
| 5241 | } |
| 5242 | |
| 5243 | g.HoveredWindow = hovered_window; |
| 5244 | g.HoveredWindowUnderMovingWindow = hovered_window_ignoring_moving_window; |
| 5245 | } |
| 5246 | |
| 5247 | bool ImGui::IsItemActive() |
| 5248 | { |
no test coverage detected