MCPcopy Create free account
hub / github.com/RenderKit/embree / FindHoveredWindow

Function FindHoveredWindow

tutorials/common/imgui/imgui.cpp:5307–5357  ·  view source on GitHub ↗

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.

Source from the content-addressed store, hash-verified

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.
5307static 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
5359bool ImGui::IsItemActive()
5360{

Callers 1

Calls 2

ImRectFunction · 0.70
ContainsMethod · 0.45

Tested by

no test coverage detected